我有一个容器,它有一个传入 VPN。进入该容器的连接将被分配 IP 192.168.10.10
。容器的虚拟 NIC 有一个 IP10.10.10.1
和一个网关(在主机桥上)10.10.10.254
。
当直接登录到容器时,数据包将10.10.10.1
作为源离开并且知道如何返回(通过桥接)。
当通过 VPN 连接时,数据包将离开192.168.10.10
源端并且不会返回,因为192.168.10.x
网络中没有通告(没有到该网络的路由)。
对此有两种解决方案:
- 要么伪装在容器里,这样包裹就会带着
10.10.10.1
192.168.10.x
或者在网络上发布该路由
我想(出于各种原因)避免采用这两种解决方案,并且想知道是否可以在桥本身进行伪装,在主机端?
换句话说,数据包将离开带有源的容器192.168.10.10
,然后“由桥接器”将其重写为已知10.10.10.1
IP(然后在回复返回容器时再次重写)
注意:如何做到这一点shorewall
会很棒,但任何信息都很好。
答案1
对于 shorewall,您可以编辑 /etc/shorewall/masq,如下所示:
br0 192.168.10.1/24 - tcp 22,80,443
您还需要在 /etc/shorewall/hosts 和 /etc/shorewall/zones 中为 VPN 范围创建一个条目,当然还需要将任何必要的规则添加到 /etc/shorewall/rules 中。
不过,我认为你可能遇到的是XY问题。
如果我理解你的设置正确的话,仅有的你的容器知道这个192.168.10/24
范围。
这意味着该问题实际上不能(仅)通过使用伪装来解决。
问题是运行容器的主机也没有 192.168.10/24 的路由,因为该路由仅存在于容器的路由表中。
因此,你至少需要:
- 容器主机上指向容器的路由(例如
ip r add 192.168.10.1/24 via 10.10.10.1
) - 然后在shorewall中添加masq规则。
否则,您的容器主机将看到来自您的 VPN 容器的火星人的内容。
答案2
iptablesMASQUERADE
目标在表中运行POSTROUTING
,该表仅用于从一个接口路由到另一个接口的数据包。桥接数据包可能不会在任何时候在 IP 级别被访问,因此您无法伪装它们。