我希望有谁对 IP 表很了解,可以给我一些指点。
我正在尝试使用 2 个接口进行 DNAT,基本上我想要做的是将一个接口上的任何内容推送到另一个接口上的特定 IP,并且流量需要在两个方向上流动。
接口是ens19和ens18
ens19 的 ip 为 10.0.0.10,ens19 上 10.0.0.10 的所有内容都需要推送到 ens18 上的 192.168.110.120,然后来自 192.168.110.120 的任何响应都需要推送回 ens19 上的 10.0.0.10。
到目前为止我所拥有的是
sudo iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE,
sudo iptables -A FORWARD -i ens19 -j ACCEPT,
sudo iptables -t nat -A PREROUTING -i ens19 -p tcp -j DNAT --to 192.168.120.110
看起来已经完成了一半,
万一图像不起作用,以下是 esn19 上的 tcp dump 的输出
*nat 是 ubuntu 机器的 192.168.120.175 ip
10:59:28.061230 IP (tos 0x2,ECT(0), ttl 122, id 4932, offset 0, flags [DF], proto TCP (6), length 52)
10.180.9.221.60497 > nat.502: Flags [SEW], cksum 0x005c (correct), seq 915671938, win 8192, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
10:59:34.064183 IP (tos 0x0, ttl 122, id 9853, offset 0, flags [DF], proto TCP (6), length 48)
10.180.9.221.60497 > nat.502: Flags [S], cksum 0x152b (correct), seq 915671938, win 8192, options [mss 1200,nop,nop,sackOK], length 0
以下是 ens18 上的 tcpdump 的输出
11:02:01.078007 IP (tos 0x2,ECT(0), ttl 121, id 4808, offset 0, flags [DF], proto TCP (6), length 52)
nat.61244 > 192.168.120.110.502: Flags [SEW], cksum 0x2b46 (correct), seq 2455055900, win 8192, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
11:02:01.079093 IP (tos 0x0, ttl 64, id 64830, offset 0, flags [DF], proto TCP (6), length 44)
192.168.120.110.502 > nat.61244: Flags [S.], cksum 0x71f0 (correct), seq 935635538, ack 2455055901, win 8192, options [mss 1460], length 0
看起来 192.168.120.110 正在响应源自 10.0.0.10 的请求,但是当我捕获 ens19 上的流量时,我只看到原始请求,而看不到响应。
我也设置了sysctl -w net.ipv4.ip_forward=1
编辑*
的输出sudo iptables -L -n -t nat -v
是
Chain PREROUTING (policy ACCEPT 3419 packets, 853K bytes)
pkts bytes target prot opt in out source destination
239 12428 DNAT tcp -- ens19 * 0.0.0.0/0 0.0.0.0/0 to:192.168.120.110
Chain INPUT (policy ACCEPT 5 packets, 388 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 81 packets, 6116 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 45 packets, 3340 bytes)
pkts bytes target prot opt in out source destination
275 15204 MASQUERADE all -- * ens18 0.0.0.0/0 0.0.0.0/0
输出 sudo iptables -L -n -v | grep "Chain FORWARD"
Chain FORWARD (policy ACCEPT 1273 packets, 56132 bytes)
的输出 iptables -L FORWARD -v
是
Chain FORWARD (policy ACCEPT 1208 packets, 53272 bytes)
pkts bytes target prot opt in out source destination
726 36884 ACCEPT all -- ens19 any anywhere anywhere
珍惜时间!
*编辑,我在之前的捕获中暂时将 ens18 的 IP 更改为 192.168.110.170 又名 nat。
这是从 ens18 捕获的信息,看起来 PLC 192.168.110.120 正在响应来自 ens19 10.0.0.10 的三方握手请求(我可能错了),但是响应并没有通过 ens19 上的 10.0.0.10 返回。
ens18 捕获
14:47:13.068871 IP 192.168.120.170.57553 > 192.168.120.110.502: Flags [SEW], seq 729326537, win 8192, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
14:47:13.069312 IP 192.168.120.110.502 > 192.168.120.170.57553: Flags [S.], seq 3632495411, ack 729326538, win 8192, options [mss 1460], length 0
14:47:16.015114 IP 192.168.120.110.502 > 192.168.120.170.57553: Flags [S.], seq 3632495411, ack 729326538, win 8192, options [mss 1460], length 0
ens19 捕获
14:58:19.066653 IP 10.180.9.221.60553 > 10.0.0.10.502: Flags [SEW], seq 1069361213, win 8192, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
14:58:25.077211 IP 10.180.9.221.60553 > 10.0.0.10.502: Flags [S], seq 1069361213, win 8192, options [mss 1200,nop,nop,sackOK], length 0
有什么方法可以将来自 ens18 上的 192.168.110.120 的所有流量路由到 ens19 上的 10.0.0.10 吗?
*编辑 - - - - - - - - - - - -
感谢大家的意见,问题解决了!
答案1
根据提供的信息,您正在以错误的方向执行 NAT(网络地址转换)。目前,192.168.120.110
不知道正确的回复地址,因此它错误地回复了192.168.120.170
。 的服务器192.168.120.170
不知道如何处理发送给它的数据包。通过反转 NAT 方向:删除此内容:
sudo iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
改用这个:
sudo iptables -t nat -A POSTROUTING -o ens19 -j MASQUERADE
但是,就我个人而言,每当 NIC 上的 IP 地址是静态且已知的时,我都会使用它SNAT
:MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ens19 -j SNAT to 10.0.0.10
因为您的默认 FORWARD 策略是 ACCEPT,所以您实际上不需要这个:
sudo iptables -A FORWARD -i ens19 -j ACCEPT
顺便说一句,您的 tcpdump 列表上的时间戳不相关,这很令人困惑。最好在两个终端上同时运行两个实例,以便可以使用时间戳来帮助理解。
进行此更改后,您应该观察到类似以下情况:
ens19 IP 10.180.9.221.60553 > 10.0.0.10.502:
ens18 IP 10.180.9.221.60553 > 192.168.120.110.502:
ens18 IP 192.168.120.110.502 > 10.180.9.221.60553:
ens19 IP 10.0.0.10.502 > 10.180.9.221.60553:
ens19 ...
并且 192.168.120.110 需要知道 192.168.120.170(或 .175)是默认网关,或者至少是可能到达 ens19 的 IP 地址的网关。