我有带 LXD 的 Ubuntu 服务器。每个容器都有自己的 IP(本地)地址。示例:LXD 主机:10.10.1.200,DNS 容器:10.10.1.141,LXC 内部地址:10.71.85.107
好的-没问题,传入的包裹正在翻译:
iptables -t nat -A PREROUTING -d 10.10.1.141 -i ens160 -p udp --dport 53 -j DNAT --to-destination 10.71.85.107:53
在 iptables 中我有:
254K 18M DNAT udp -- ens160 * 0.0.0.0/0 10.10.1.141 udp dpt:53 to:10.71.85.107:53
工作正常。
问题出在外发包裹上: 我需要容器发出的包具有相同的 IP 地址。 相同示例:DNS 容器:发出的包应具有地址 10.10.1.141 因此,向 iptables 添加以下内容:
sudo iptables -t nat -I POSTROUTING -s 10.71.85.107 ! -d 10.71.85.0/24 -j SNAT --to-source 10.10.1.141
在 iptables 中我有这个:
166K 13M SNAT all -- * * 10.71.85.107 !10.71.85.0/24 to:10.10.1.141
330 27582 MASQUERADE all -- * * 10.71.85.0/24 !10.71.85.0/24 /* generated for LXD network lxdbr0 */
工作正常!
真正的问题是当我重新启动 LXD 主机时,那么我在 iptables 中有这个:
330 27582 MASQUERADE all -- * * 10.71.85.0/24 !10.71.85.0/24 /* generated for LXD network lxdbr0 */
166K 13M SNAT all -- * * 10.71.85.107 !10.71.85.0/24 to:10.10.1.141
化装舞会位居榜首!并且所有传出的包都有 LXD 主机地址 (10.10.1.200)。 有没有可能改变这一点? 为什么 LXD 总是先设置 Masquerade? 有没有可能改变这一点?
答案1
这是一个 2 个月前的问题,但是没有人给出答案,而且谷歌经常将人们引导到任何 Stack* 网站,所以为什么不给出答案呢。
我将重点讨论原帖中的问题。我完全忽略了提到的设置。
为什么 LXD 总是先设置 Masquerade?有没有可能改变这种情况?
是的,LXC 至少允许您以某种方式定义要添加规则的位置。查看 LXC-Networking 的参数文档:LXC 网络参数
该参数ip4.nat.order
定义是否添加lxc NAT规则前或者后预先存在的网络规则。
你可以通过 shell 查看 lxc 已知的网络,通过lxc network list
命令编辑网络lxc network edit <network name>
例子:
lxdbr0
因此,标准 lxc 网络只需执行lxc network edit lxdbr0
并添加ip4.nat.order: "after"
到配置中即可。
config:
ipv4.address: 10.0.4.1/24
ipv4.nat: "true"
ipv4.nat.order: "after"
description: ""
name: lxdbr0
type: bridge
used by:
- /1.0/containers/c1
- /1.0/containers/c2
- /1.0/containers/c3
managed: true
status: Created
locations:
- none
提示:您还可以通过将 ipv4.nat 设置为 来阻止 lxc 执行 nat 规则
false
。然后您需要自己执行伪装规则,但可能会有一些用例受益于这样的设置。