如果有多个 IP 地址,MASQUERADE 如何选择一个 IP 地址?

obe*_*tie 8 networking linux iptables

MASQUERADE如果我为从特定接口发出的流量设置 Linux iptables规则,但该接口有多个 IP 地址,那么如何选择源 IP?

\n\n
\n\n

作为示例,假设我添加一条规则,例如:

\n\n
$ iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 并且该界面如下所示:

\n\n
$ ip addr show dev eno1\n1: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000\n    link/ether 94:18:82:35:a2:c1 brd ff:ff:ff:ff:ff:ff\n    inet 10.136.122.97/24 scope global eno1\n       valid_lft forever preferred_lft forever\n    inet 10.136.122.98/24 scope global eno1\n       valid_lft forever preferred_lft forever\n
Run Code Online (Sandbox Code Playgroud)\n

Ant*_*lov 5

伪装选择地址的方式与路由中选择源地址的方式相同。

因此,您可以使用ip route get <dst>命令来确定伪装后将用作源地址的地址。

如果您对更多细节感兴趣,可以查看源代码


Mar*_*rco 2

IP根本不会被选择。数据包将从八位字节的第一个 IP 发出。如果你想对此进行控制,你可以使用iptables SNAT来处理它。

例如,如果您想使用一个 IP 发送邮件和上网冲浪,而使用另一个 IP 进行其他操作,请执行以下操作:

iptables -t nat -A POSTROUTING -o eno1 -m tcp --dport 80 -j SNAT --to 10.136.122.98
iptables -t nat -A POSTROUTING -o eno1 -m tcp --dport 443 -j SNAT --to 10.136.122.98
iptables -t nat -A POSTROUTING -o eno1 -m tcp --dport 587 -j SNAT --to 10.136.122.98
iptables -t nat -A POSTROUTING -o eno1 -m tcp --dport 465 -j SNAT --to 10.136.122.98
iptables -t nat -A POSTROUTING -o eno1 -m tcp --dport 25 -j SNAT --to 10.136.122.98
Run Code Online (Sandbox Code Playgroud)

其余所有内容将通过 MASQUERADE 目标从 10.136.122.97 发出。

无论如何,我的解释相当重复: IPTables 和 SNAT 仅适用于两个端口