阻止网络命名空间/lxd-bridges 相互通信,但保持互联网访问?

阻止网络命名空间/lxd-bridges 相互通信,但保持互联网访问?

以下目标:

  • 我有 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

谢谢!

相关内容