我有一台主機,它有一條通往 Internet 上的伺服器的永久靜態 GRE 隧道。現在主機有自己的真實IP位址。我想將主機放在 Linux 盒子(Smoothwall)後面,並為其分配一個私人 IP 位址。
我們打電話吧:
隧道伺服器 IP= 主機連接的隧道末端的 IP(在網際網路上)
真實IP= 主機目前使用的真實IP,我想指派給Linux路由器
假IP= 主機置於 Linux 防火牆後面後將獲得的 IP
這就是我認為要讓隧道正常運作我必須做的事情:
- 對外部介面上來自網際網路隧道端的所有傳入 IP GRE 封包進行 DNAT,並將其傳送至主機。即改變目的地真實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 鏈。