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

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

我有一台主机,它有一个永久静态 GRE 隧道,可通往 Internet 上的服务器。目前,该主机有自己的真实 IP 地址。我想将主机放在 Linux 机器 (Smoothwall) 后面,并为其分配一个私有 IP 地址。

让我们调用:
隧道服务器 IP= 主机正在连接的隧道末端的 IP(在互联网上)
真实IP= 主机当前使用的真实 IP,我想将其分配给 Linux 路由器
假IP= 主机置于 Linux 防火墙之后将获得的 IP

我认为为了让隧道正常工作我必须这样做:

  1. DNAT 所有来自互联网隧道端的外部接口上的传入 IP GRE 数据包,并将它们发送到主机。也就是说,将目的地从真实IP假IP并将数据包发送到假IP
  2. 对来自主机的内部接口的所有传入 IP GRE 数据包进行 SNAT,使其显示为由​​ Linux 机器生成的数据包,并将它们发送到隧道服务器。也就是说,将源字段从假IP真实IP并将数据包发送到隧道服务器 IP

我想出了以下脚本:

tunnel_server_ip=217.x.x.x
false_ip=192.168.2.2
real_ip=82.x.x.x
/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

运行结果没有该名称的链/目标/匹配。 你能告诉我我做错了什么吗?我做对了吗?

答案1

您忘记了-t natPREROUTING/POSTROUTING 指令中的表开关。只需将其添加到前面即可。

答案2

回答晚了,但我遇到了同样的需求,以下两个命令可以解决问题:

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

无需指定真实 IP,只需将PREROUTE流量gre传输到私人服务器并让gre连接跟踪器完成其工作。

答案3

对于大多数 GRE 隧道,您必须在 TCP 1723 上有一个控制协议。这也必须转发。以下是关联描述了此 iptables 配置。您的思路正确,只是缺少控制协议。

答案4

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

相关内容