iptables SNAT不适用于GRE数据包

我正在尝试将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理程序),桥接到出口接口。
  • TCP / 1723数据包正在被防火墙(但不是GRE的)发送。 我正在有效地尝试使用IPTables作为防火墙缺点的解决方法。 据推测IPTables不在乎数据包是如何到达那里的?
  • 出口接口/网桥具有与$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。 好像你正在其他地方检查数据包,即不是直接在你的虚拟机上。