#!/usr/bin/env bash
set -euo pipefail
if [[ $EUID -ne 0 ]]; then
echo "必须使用root才能运行此脚本"
exit 1
fi
n1="dev"
n2="prod"
br="v-net-0"
action=${1:-"create"}
function del_conf()
{
echo "清除networkd namespace"
ns=$(ip netns)
if [[ $ns == *$n1* ]]; then
ip netns del $n1
fi
if [[ $ns == *$n2* ]]; then
ip netns del $n2
fi
echo "清除networkd bridge"
brs=$(ip link show type bridge | awk 'NR%2!=0 {print substr($2, 1, length($2)-1)}' | xargs -n 10)
if [[ $brs == *$br* ]]; then
ip link del $br
fi
echo "清除自定义的SNAT"
set +e
iptables -C POSTROUTING -t nat -s 192.168.20.0/24 -j MASQUERADE &> /dev/null
if [[ $? == 0 ]]; then
iptables -t nat -D POSTROUTING 1
fi
set -e
}
if [[ "$action" == "del" ]]; then
del_conf
exit
fi
del_conf
ip netns add "$n1"
ip netns add "$n2"
ip link add "$br" type bridge
ip link set dev "$br" up
ip link add veth-dev type veth peer name veth-dev-br
ip link add veth-prod type veth peer name veth-prod-br
ip link set veth-dev netns dev
ip link set veth-dev-br master v-net-0
ip link set veth-prod netns prod
ip link set veth-prod-br master v-net-0
ip -n dev addr add 192.168.20.1/24 dev veth-dev
ip -n dev link set veth-dev up
ip link set veth-dev-br up
ip -n prod addr add 192.168.20.2/24 dev veth-prod
ip -n prod link set veth-prod up
ip link set veth-prod-br up
ip addr add 192.168.20.20/24 dev v-net-0
ip netns exec dev ping -c 3 192.168.20.2
echo
ip -n dev route add default via 192.168.20.20
ip -n prod route add default via 192.168.20.20
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -j MASQUERADE
ip netns exec dev ping -c 3 8.8.8.8
del_conf