Ubuntu LXD iptables SNAT/Masquarade

Ubuntu LXD iptables SNAT/Masquarade

我有带 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。然后您需要自己执行伪装规则,但可能会有一些用例受益于这样的设置。

相关内容