juw*_*ter 4 linux iptables linux-networking
我正在使用客户端库 ( https://github.com/Beckhoff/ADS ) 通过 TCP 从 Linux 机器连接到 PLC。但是,该库只能在 PLC 的源 IP 和目标 IP 地址之间执行单个连接。我的目标是连接到具有多个客户端的远程IP/PLC,即远程PLC必须能够根据客户端的(不同)IP地址来区分客户端连接。
我希望通过一些巧妙的iptables规则来实现这一点;或者,也许 Linux 网络命名空间也可以工作。
对于iptables路由(双关语?),我的计划是将多个 IP 地址分配给 Linux 计算机上的同一个 NIC。由于远程服务侦听单个端口(48898),我不能简单地在iptables规则中使用不同的目标端口。因此,我在想这样的事情:
远程 PLC:192.168.1.10/24
Linux PC:192.168.1.20/24 (ip addr add 192.168.1.20/24 dev enp2s0)
Linux PC:192.168.1.21/24 (ip addr add 192.168.1.21/24 dev enp2s0)
通过为远程 PLC 使用“虚拟”IP 地址,我希望能够区分 TCP 连接,这样我就知道哪些数据包源自客户端 A,哪些数据包源自客户端 B。现在我需要做一些iptables魔术:
传出:如果目标 IP 地址 == 192.168.1.11 1.1 -> 重写为目标 IP 地址 192.168.1.10 1.1 -> 重写/确保源 IP 地址为 192.168.1.21
传入:如果目标 IP 地址 == 192.168.1.21 2.1 -> 将源 IP 地址重写为 192.168.1.11(远程 PLC 的虚拟 IP)
也许甚至可以“标记” TCP 连接,以便更容易区分哪个是哪个(步骤 2)。
对于这种情况,conntrack的 NAT 足以更改、标记和正确处理连接的回复流量。人们可以同时使用 DNAT 和 SNAT,并将它们的使用结合在一起,或者混合使用 DNAT 和适当的路由。
PREROUTING该目标仅在 nat 表、 andOUTPUT链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的目标地址(并且此连接中的所有未来数据包也将被破坏),并且应停止检查规则。[...]
该目标仅在 nat 表、 and
POSTROUTINGINPUT链以及仅从这些链调用的用户定义链中有效。 它指定应修改数据包的源地址(并且此连接中的所有未来数据包也将被破坏),并且应停止检查规则。[...]
iptables -t nat -A OUTPUT -d 192.168.1.11 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.12 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.13 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.14 -j DNAT --to-destination 192.168.1.10
Run Code Online (Sandbox Code Playgroud)
在客户端上设置附加源地址:
ip address add 192.168.1.21/24 dev enp2s0
ip address add 192.168.1.22/24 dev enp2s0
ip address add 192.168.1.23/24 dev enp2s0
ip address add 192.168.1.24/24 dev enp2s0
Run Code Online (Sandbox Code Playgroud)
并使用带有iptables ' match 的适当过滤器,将 SNAT 操作有条件地绑定到初始目标地址(在 DNAT 完成之前):conntrack
iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.11 -j SNAT --to-source 192.168.1.21
iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.12 -j SNAT --to-source 192.168.1.22
iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.13 -j SNAT --to-source 192.168.1.23
iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.14 -j SNAT --to-source 192.168.1.24
Run Code Online (Sandbox Code Playgroud)
或者使用更干净的方式代替 SNAT,直接暗示每个目的地的预期源地址(即使 nat/OUTPUT 重新路由,源地址一旦设置也不会再改变)。这将使客户端和服务器ss -tn dport == 48898了解并显示正确的源地址。这变成:
ip route add 192.168.1.11/32 dev enp2s0 src 192.168.1.21
ip route add 192.168.1.12/32 dev enp2s0 src 192.168.1.22
ip route add 192.168.1.13/32 dev enp2s0 src 192.168.1.23
ip route add 192.168.1.14/32 dev enp2s0 src 192.168.1.24
Run Code Online (Sandbox Code Playgroud)
这必须这样完成:一次一个地址(DNAT 可以被简化/分解,但不能处理源的第二部分)。
与实际地址的连接192.168.1.10保持不变。
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |