我正在尝试将SNAT应用到PPTP客户端。 TCP / 1723数据包正在被正确的SNAT,但不是GRE的。 任何人都可以发现什么是错的?
我有以下的iptablesconfiguration:
$ sudo iptables -t nat -L POSTROUTING -v -n Chain POSTROUTING (policy ACCEPT 616 packets, 37030 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT 47 -- * * $internal_ip 0.0.0.0/0 to:$external_ip
在使用tcpdump检测出口接口上的出站stream量时,我看到以下内容:
<timestamp> IP $internal_ip > $target_ip: GREv1, call 31607, seq 1, length 36: LCP, Conf-Request (0x01), id 1, length 22
…而不是期望的$external_ip >很清楚, SNAT翻译不起作用(从0 pkts 0 bytes清楚)。
我有以下模块加载(等):
nf_nat_proto_gre nf_conntrack_proto_gre nf_conntrack_pptp nf_nat_pptp
如果这是相关的,请注意几点:
iptables列表是从它的pipe理程序),桥接到出口接口。 $external_ip不同的静态IP(尽pipe在相同的子网上) 这是运行3.13.0-123-generic的Ubuntu 14.04服务器
首先你的iptables命令缺less-t nat部分。 但是这应该会产生一个错误,因为默认情况下,filter表中不存在POSTROUTING表。 确保你将这个添加到一个正确的表。 这与这个问题非常相似: 在Linux路由器上的NAT GRE(IP协议47)
接下来,确保你指定了正确的$ internal_ip,并且那个匹配你在tcpdump上看到的那个。 有时候,一个简单的错字会滑出视线,使事情看起来很复杂。
另外检查你的iptables规则没有任何先于你的SNAT规则触发的规则。 Netfilter只会在那个时候触发第一场比赛。 你的注意事项TCP / 1723实际上意味着你有其他的规则。
如果这没有帮助,请务必检查并发布您的详细configuration与iptables -t nat -L -v -n和像ip rule ls && ip route ls 。 用iptables的-v开关,你实际上可以看到每个规则触发了多less数据包。
你在VM里面运行。 检查你的主机节点的iptables规则也! 您的规则可能有效,但主机节点防火墙已经将来自您的VM的打包源IP重新封装到您的内部IP。 好像你正在其他地方检查数据包,即不是直接在你的虚拟机上。