以下目标:
- 我有 lxd 容器
- 每组容器应该有其专用的隔离网络
- 每个都应该仍然能够连接到互联网(例如apt update或curl),但不能将端口(例如网络服务器)泄漏到互联网,除非我lxd代理它们
我试图拒绝与 10.0.0.0/8 等相同的子网通信,但这会阻止它从 LXD-dhcp 或互联网获取 IP。
目前,为了允许 LXD 访问互联网,我这样做:
sudo ufw allow in on <bridge>
sudo ufw route allow in on <bridge>
我现在尝试创建网络命名空间来手动控制流量,但是一旦命名空间连接到各自的网桥,它们就可以串扰,并且我正处于尝试将它们分开的起点。
我遇到过许多解决方案,这些解决方案只是建议拒绝bridge1到bridge2,但这扩展得非常可怕,我拥有的网络越多,我必须设置的双向规则就越多,甚至是繁琐的脚本和垃圾邮件具有数百条规则的 iptables。
有没有一种方法可以实现上述目标,但无需添加数百条规则来防止串扰,即某种默认关闭、选择加入的通信?因为也许我希望一些网络能够相互通信,但默认情况下我希望它们全部保留在自己的命名空间/网桥中。
下图显示了我当前尝试使用网络命名空间的情况:
(橙色线标记可选通信,我可以没有它[并且当前可以通过 lxd 端口安全性切换它],如果这意味着其余部分有一个简单的解决方案,但更愿意在需要时选择允许这些通信)
它是由以下代码引导的:
#!/usr/bin/env bash
NS1="ns1"
VETH1="veth1"
VPEER1="vpeer1"
NS2="ns2"
VETH2="veth2"
VPEER2="vpeer2"
# clean up previous
ip netns del ${NS1} >/dev/null 2>&1
ip netns del ${NS2} >/dev/null 2>&1
ip link delete ${VETH1} >/dev/null 2>&1
ip link delete ${VETH2} >/dev/null 2>&1
ip link delete ${VETH1} >/dev/null 2>&1
ip link delete ${VETH2} >/dev/null 2>&1
# create namespace
ip netns add $NS1
ip netns add $NS2
# create veth link
ip link add ${VETH1} type veth peer name ${VPEER1}
ip link add ${VETH2} type veth peer name ${VPEER2}
# setup veth link
ip link set ${VETH1} up
ip link set ${VETH2} up
# add peers to ns
ip link set ${VPEER1} netns ${NS1}
ip link set ${VPEER2} netns ${NS2}
# setup loopback interface
ip netns exec ${NS1} ip link set lo up
ip netns exec ${NS2} ip link set lo up
# setup peer ns interface
ip netns exec ${NS1} ip link set ${VPEER1} up
ip netns exec ${NS2} ip link set ${VPEER2} up
# assign ip address to ns interfaces
VPEER_ADDR1="10.10.0.10"
VPEER_ADDR2="10.20.0.10"
ip netns exec ${NS1} ip addr add ${VPEER_ADDR1}/16 dev ${VPEER1}
ip netns exec ${NS2} ip addr add ${VPEER_ADDR2}/16 dev ${VPEER2}
setup_bridge() {
BR_ADDR="$1"
BR_DEV="$2"
NAMESPACE="$3"
VETH="$4"
# delete old bridge
ip link delete ${BR_DEV} type bridge >/dev/null 2>&1
# setup bridge
ip link add ${BR_DEV} type bridge
ip link set ${BR_DEV} up
# assign veth pairs to bridge
ip link set ${VETH} master ${BR_DEV}
# setup bridge ip
ip addr add ${BR_ADDR}/16 dev ${BR_DEV}
# add default routes for ns
ip netns exec ${NAMESPACE} ip route add default via ${BR_ADDR}
# enable ip forwarding
bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
# masquerade (internet => bridge)
iptables -t nat -A POSTROUTING -s ${BR_ADDR}/16 ! -o ${BR_DEV} -j MASQUERADE
}
# clear out postrouting
iptables -t nat -F
BR_IP="10.10.0.1"
BR_DEV="br0"
setup_bridge $BR_IP $BR_DEV $NS1 $VETH1
BR_IP="10.20.0.1"
BR_DEV="br1"
setup_bridge $BR_IP $BR_DEV $NS2 $VETH2
谢谢!