
我有一台主机,它有一个永久静态 GRE 隧道,可通往 Internet 上的服务器。目前,该主机有自己的真实 IP 地址。我想将主机放在 Linux 机器 (Smoothwall) 后面,并为其分配一个私有 IP 地址。
让我们调用:
隧道服务器 IP= 主机正在连接的隧道末端的 IP(在互联网上)
真实IP= 主机当前使用的真实 IP,我想将其分配给 Linux 路由器
假IP= 主机置于 Linux 防火墙之后将获得的 IP
我认为为了让隧道正常工作我必须这样做:
- DNAT 所有来自互联网隧道端的外部接口上的传入 IP GRE 数据包,并将它们发送到主机。也就是说,将目的地从真实IP到假IP并将数据包发送到假IP
- 对来自主机的内部接口的所有传入 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 nat
PREROUTING/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 链。