有没有大佬能帮忙看看这个 Linux IP 转发和 iptables 的难题

2020-04-11 20:38:09 +08:00
 jimmy2010

我有两个 Linux,同在一个 172.17.0.0/16 的网络中,

A:172.17.82.13 - 可以上互联网

C:172.17.10.109 - 不能上互联网(可能是防火墙某种设定)

为了 C 也能上网,在 A 上开启了 ip forwarding,同时 C 的默认网关指向 A, A 的 iptables 开启了 nat 转换:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

也试过:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.17.82.13

但 C 还是上不了网,通过 tcpdump 抓包发现,C 的包 A 收到了,A 也把包转发出去了,甚至收到了回包,但是到这里就断了,A 把这个回包吞了,并没有回给 C,这是怎么回事? 我也照着网上一些资料设置了下面的规则,也不起作用。

iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

有没有 iptables 大佬能够指点一二,截图发不了,就是 C ping A 没有问题,ping 114.114.114.114 的时候,C 上的 tcpdump 只有 icmp 发包,A 上则有 C 的 icmp 请求的 114 的回复。

1704 次点击
所在节点    问与答
15 条回复
V69EX
2020-04-11 20:51:13 +08:00
A 只有一块网卡么?两块网卡最省事,直接在第二块网卡上配一个新网段,比如 192.168.9.1/24,然后新 C 配置为 192.168.9.2/24,然后随便一折腾就好了。

如果 A 仅一块网卡,你至少得添加一个网卡 alias,然后再配新网段。

你要记住,这种情况下,原来的 172.17/16 网段成了 A 的 WAN 口了,A 与 C 得有一个新网段作为 LAN 。
XiaoxiaoPu
2020-04-11 21:00:18 +08:00
A 和 C 之间是通过什么连接的?路由器?交换机?也许回包是被 A 和 C 之间的设备拦截了。这个回包的发送方是 A,但是源地址并不是 A 在局域网的地址 172.17.82.13 ,有可能会被当成源地址欺骗而被拦截。
alcarl
2020-04-11 21:17:41 +08:00
加个 -s 172.17.10.109 限制一下只对这个源地址的包进行 snat 试试
jimmy2010
2020-04-11 21:18:38 +08:00
@V69EX A 是一块网卡,现在 A 和 C 的 IP 是固定的,不能变了,我另外也有一个环境和这个一样,只是其中 A 的角色是一个 openwrt x86,也只配了一个接口,所谓的单臂路由,然后局域网中的另一个 Windows 指向它上网是没问题的。
jimmy2010
2020-04-11 21:19:47 +08:00
@XiaoxiaoPu A 和 C 是同网段的,应该是连在同一个虚拟交换机上。
jimmy2010
2020-04-11 21:20:04 +08:00
@alcarl 也试过了,还是一样的结果。
xnile
2020-04-11 21:37:58 +08:00
看这 iptables 配置没啥问题,A 上的 iptables 完整规则能贴下么,另外 A 有上启用 lvs 之类的吗
konia
2020-04-11 21:41:36 +08:00
```
通过 tcpdump 抓包发现,C 的包 A 收到了,A 也把包转发出去了,甚至收到了回包,但是到这里就断了,A 把这个回包吞了,并没有回给 C
```

抓包显示 A 没有把回包转给 C 吗? 如果没 forward 那确实很诡异.
jimmy2010
2020-04-11 21:45:36 +08:00
@xnile
没有其它任何规则,因为我配之前都清空了,只有 nat 表下有下面的规则,也没有启用 lvs 之类:

Chain POSTROUTING (policy ACCEPT 49 packets, 3696 bytes)
pkts bytes target prot opt in out source destination
15 996 SNAT all -- any eth0 172.17.10.109 anywhere to:172.17.82.13

也有命中,可能确实是虚拟交换机的问题?有可能回包到交换机被丢了,也不好排查,A 和交换机之间也没法抓包。。
jimmy2010
2020-04-11 21:49:05 +08:00
@konia
i.loli.net/2020/04/11/EkXqSnC28zYhufw.png
A 收到了,转给 C 出了问题,现在就是不好排查是哪里的问题。
xnile
2020-04-11 21:51:44 +08:00
@jimmy2010 你在 A 上都开到回报了,怎么可能是交换机的丢的呢,A 都没 forward 出来,确实同楼上说的,有点诡异
konia
2020-04-11 21:54:19 +08:00
怀疑 A-C 之间也是有 `防火墙某种设定` 的 (看抓包 114 的包已经是从 A 发回去 C 了, 但 C 没有收到), 建议直接搭个 ipip 隧道试试
xnile
2020-04-11 21:57:42 +08:00
@jimmy2010 看样像没 snat 啊,tcpdump 跟上-vv 再贴张图出来看下
jimmy2010
2020-04-11 22:11:34 +08:00
@xnile @konia
i.loli.net/2020/04/11/t1BI4NmFsiVY2LM.png
我又自己用 vmware 搭了两个 debian9,完全没有问题,甚至 A 都没有设置 iptables,就开了 ip forward 就行。。应该还是环境的问题,前面环境忘了提一下,是在类似 Openstack 这样的虚拟化平台下,我估计是虚拟交换机,或者虚拟网络底层的某些奇怪设置。
halfcrazy
2020-04-12 09:57:22 +08:00
@jimmy2010 openstack 的话,可以试试禁用 port security

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/661527

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX