我有一台主机,它具有到 Internet 上服务器的永久静态 GRE 隧道。现在主机有自己的真实IP地址。我想将主机放在 Linux 机器(Smoothwall)后面,并为其分配一个私有 IP 地址。
让我们调用:
tunnel-server-ip = 主机连接到的隧道末端的 IP(在互联网上)
real-ip = 主机当前使用的真实 IP,我想分配给 Linux 路由器
false -ip = 主机通过 Linux 防火墙后将获得的 IP
这就是我认为我必须为隧道工作所做的事情:
- 对来自互联网隧道端的外部接口上的所有传入 IP GRE 数据包进行 DNAT 处理,并将它们发送到主机。也就是将目的地从真实IP更改为虚假IP并将数据包发送到虚假IP
- SNAT 所有来自主机的内部接口上的传入 IP GRE 数据包看起来它们是由 Linux 机器生成的,并将它们发送到隧道服务器。即将源字段从false-ip更改为real-ip并将数据包发送到tunnel-server-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
运行此结果会导致没有该名称的链/目标/匹配。 你能告诉我我做错了什么吗?我在正确的轨道上吗?
您忘记了
-t nat
PREROUTING/POSTROUTING 指令中的表开关。只需在前面添加即可。迟到的答案,但我遇到了同样的需求,以下两个命令可以解决问题:
无需指定真实 IP,只需
PREROUTE
将gre
流量传输到私有服务器并让gre
连接跟踪器完成其工作。对于大多数 GRE 隧道,您必须在 TCP 1723 上有一个控制协议。这也必须转发。这是一个描述 iptables 配置的链接。您走在正确的轨道上,只是缺少控制协议。
您似乎忘记说“--table nat”,所以它进入了没有 SNAT/DNAT 目标的过滤表,也没有 PREROUTING 和 POSTROUTING 链。