NAT GRE(IP协议47)在Linux路由器上

我有一个主机有一个永久静态GRE隧道到互联网上的服务器。 现在主机有自己的真实IP地址。 我想把主机放在一个Linux盒子(Smoothwall)后面,并为其分配一个私有IP地址。

让我们打电话:
tunnel-server-ip =主机连接的隧道末端的IP(在Internet上)
real-ip =主机当前使用的真实IP,我想要分配给Linux路由器
false-ip =将主机置于Linux防火墙之后的IP地址

这就是我认为我必须为隧道工作所做的事情:

  1. DNAT将来自networking隧道的外部接口上的所有inputIP GRE数据包发送出去,并发送给主机。 即将目标从真实IP更改为false-ip ,并将数据包发送到false-ip
  2. 对来自主机的内部接口上的所有进入的IP GRE数据包进行SNAT处理,以显示它们由Linux机器生成并发送到隧道服务器。 即将源字段从false-ip改为real-ip ,并将报文发送到tunnel-server-ip

我想出了以下脚本:

tunnel_server_ip=217.xxx false_ip=192.168.2.2 real_ip=82.xxx /sbin/iptables -A PREROUTING -p 47 --src $tunnel_server_ip -j DNAT --to-destination $false_ip /sbin/iptables -A POSTROUTING -p 47 --src $false_ip -j SNAT --to-source $real_ip /sbin/iptables -A INPUT -p 47 -j ACCEPT 

运行这个结果将导致无链/目标/匹配的名称。 你能告诉我我做错了什么吗? 我在正确的轨道上?

PREROUTING / POSTROUTING指令中忘记了-t nat表开关。 只需在前面添加它。

迟到的答案,但我碰到了相同的需求,下面的两个命令做的伎俩:

 # iptables -t nat -A PREROUTING -i eth0 -p gre -j DNAT --to-destination 192.168.0.1 # modprobe nf_conntrack_proto_gre 

不需要指定真实IP,只需将grestream量提供给私有服务器,并让gre连接跟踪器完成其工作。

对于大多数GRE隧道,你必须在TCP 1723上有一个控制协议。这也必须被转发。 这是描述iptablesconfiguration的链接 。 你在正确的轨道上,只是缺less控制协议。

你似乎忘了说“–table nat”,所以它进入了没有SNAT / DNAT目标的过滤表,也没有PREROUTING和POSTROUTING链。