Linux 路由器上的 NAT GRE(IP 協定 47)

Linux 路由器上的 NAT GRE(IP 協定 47)

我有一台主機,它有一條通往 Internet 上的伺服器的永久靜態 GRE 隧道。現在主機有自己的真實IP位址。我想將主機放在 Linux 盒子(Smoothwall)後面,並為其分配一個私人 IP 位址。

我們打電話吧:
隧道伺服器 IP= 主機連接的隧道末端的 IP(在網際網路上)
真實IP= 主機目前使用的真實IP,我想指派給Linux路由器
假IP= 主機置於 Linux 防火牆後面後將獲得的 IP

這就是我認為要讓隧道正常運作我必須做的事情:

  1. 對外部介面上來自網際網路隧道端的所有傳入 IP GRE 封包進行 DNAT,並將其傳送至主機。即改變目的地真實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 鏈。

相關內容