我有一些LXD 容器这些接口绑定到一个桥接器(默认桥接器lxdbr0
或其他桥接器,无所谓)。主机本身还有另外两个接口,一个接口最终将其连接到 Internet,另一个接口连接到 WiFi AP。
数据流由以下人员协调:岸墙(建立适当的iptable
规则)。
我设置的限制对于容器与 Internet 或 AP 网络(以及 AP 网络与 Internet 之间的)之间的流量非常有效。我遇到的问题是集装箱间运输似乎不受规则的影响iptable
。即使REJECT
对容器 IP 有一个简单的策略,我仍然能够 ping 另一个容器的 IP(而不是其他任何东西,包括它自己的网关 - 这是预期的)。
我的理解是桥接器本身在 ISO/OSI 第 2 层上工作。在这种情况下,防火墙不会影响流量。
同时,它有一个 IP,这是容器的网关(容器都有一个来自同一10.20.30.0/24
网络的地址,10.20.30.254
即网桥的 IP)。由于这是第 3 层通信,流量不应该通过吗iptables
?
答案1
不要使用桥接器,而是使用路由器lxc 网络中的模式。桥接器将所有连接到它的 veth NIC 连接在一起,就像物理网络集线器一样。
如果您像这样在容器中创建 NIC。
lxc.net.0.veth.pair = vethXX
lxc.net.0.veth.mode = router
每个 NIC 都是独立的。
每个容器都需要自己的子网,通常 lxc 容器共享 10.0.3.X,但在这种模式下,每个容器都需要一个子网。
现在,如果您确实想允许容器之间的特定流量,您可以像 veth 接口是物理 NIC 一样路由流量,并且 nftables 防火墙将会起作用。
像这样的 lxc 之间的流量可以使用向前链
table ip filter {
chain forward {
type filter hook forward priority filter; policy drop; # defailt to block everything
# allow only what you want, e.g. ping
icmp type echo-request accept
icmp type echo-reply accept
}
}
lxcbr0
如果您使用路由器模式,则可以关闭桥接。
答案2
如果你有很多容器,这不是一个理想的答案,但你可以使用岸墙主机文件中每个主机都有一个条目,例如 /32 网络,如下所示:
在/etc/shorewall/接口:
#ZONE INTERFACE OPTIONS
...
lxc lxc-br0 ...,routeback,bridge
在 /etc/shorewall/区域:
#ZONE TYPE OPTIONS IN OUT
fw firewall
lxc ipv4
lxc12:lxc ipv4
在/etc/shorewall/主机:
#ZONE HOSTS OPTIONS
lxc12 lxc-br0:192.168.0.12/32
在/etc/shorewall/规则中:
######################################################################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
# PORT PORT(S) DEST LIMIT GROUP
#Allow host web server to proxy requests to the container
Web(ACCEPT) $FW lxc12