From: Ian Kelling <ian@iankelling.org> Date: Sun, 22 Jan 2017 20:40:11 +0000 (-0800) Subject: add option to pick static network X-Git-Url: https://iankelling.org/git/?a=commitdiff_plain;h=b4463d1e1bfd7d54451005aff0f6ae1f649042d1;p=newns add option to pick static network --- diff --git a/newns b/newns index dbe6598..2896cf2 100755 --- a/newns +++ b/newns @@ -38,21 +38,20 @@ fi usage() { cat <<EOF usage: ${0##*/} [OPTS] start|stop NS_NAME -Setup & optionally create, a network namespace with nat and a mount namespace +Nat a network namespace. create a mount ns. systemd friendly -c, --create Create a named network namespace. When running from the same network namespace as pid 1, this is set automatically. This is the case when running outside a systemd created private network. +-n NETWORK x.x.x /24 private network to use. If not specified, uses + the first one starting at 10.173.1 -h, --help Show this help and exit. From within a systemd network namespace, nat it to the outside. This would be called from ExecStartPre, and or subsequent units called with JoinsNamespaceOf= and PrivateNetwork=true. -Uses /24 network, finding the first locally unused one starting at -10.173.0. - Also create a named mount namespace under /root/mount_namespaces, so we can alter some system config for this namespace. Subsequent systemd command lines would be prefixed with: @@ -76,7 +75,7 @@ Background: This script does not make the namespace be named like ip does, because the naming is not necessary, although it could have been done with some more work. For debugging and joining the namespace with a bash shell, I -use nsenter -n -m -t $(pgrep PROCESS_IN_NAMESPACE) bash. Note: if I +use nsenter -n -m -t \$(pgrep PROCESS_IN_NAMESPACE) bash. Note: if I knew how to easily ask systemd what pid a unit has, i would do that. "ip netns new ..." also does a mount namespace, then bind @@ -95,11 +94,12 @@ EOF #### begin arg parsing #### create=false -temp=$(getopt -l help,create hc "$@") || usage 1 +temp=$(getopt -l help,create hcn: "$@") || usage 1 eval set -- "$temp" while true; do case $1 in -c|--create) create=true; shift ;; + -n) network=$2; shift 2 ;; -h|--help) usage ;; --) shift; break ;; *) echo "$0: Internal error!" ; exit 1 ;; @@ -162,10 +162,13 @@ nat() { dexec iptables -t nat $1 POSTROUTING -o $gateway_if -j MASQUERADE \ -m comment --comment "systemd network namespace nat"; } find_network() { + if [[ $network ]]; then + return + fi found=false existing=false ips="$(ipd addr show | awk '$1 == "inet" {print $2}')" - for ((i=0; i <= 254; i++)); do + for ((i=1; i <= 254; i++)); do network=$ip_base.$i if printf "%s\n" "$ips" | grep "^${network//./\\.}" >/dev/null; then existing=true