web-dev-qa-db-ja.com

NAT Linuxルーター上のGRE(IPプロトコル47)

インターネット上のサーバーへの永続的な静的GREトンネルを持つホストがあります。現在、ホストには独自の実際のIPアドレスがあります。ホストをLinuxボックス(Smoothwall)の後ろに置き、プライベートIPアドレスを割り当てたいと思います。

呼び出しましょう:
tunnel-server-ip =ホストが(インターネット上で)接続しているトンネルの端のIP
real-ip = Linuxルーターに割り当てたいホストが現在使用している実際のIP
false-ip = Linuxファイアウォールの背後に配置された後にホストが取得するIP

これは、トンネルが機能するために私がしなければならないと思うことです。

  1. インターネットトンネルエンドから送信される外部インターフェイス上のすべての着信IPGREパケットをDNATし、それらをホストに送信します。つまり、宛先をreal-ipからfalse-ipに変更し、パケットをfalse-ipに送信します。
  2. ホストからの内部インターフェイスに着信するすべての着信IPGREパケットは、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

これを実行すると、その名前のチェーン/ターゲット/一致がなくなります。私が間違ったことを教えてください。私は正しい方向に進んでいますか?

3
andi

PREROUTING/POSTROUTING命令の-t natテーブルスイッチを忘れました。前面に追加するだけです。

3
towo

遅い答えですが、私は同じニーズに遭遇し、次の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接続トラッカーにその仕事を任せます。

2
iMil

ほとんどのGREトンネルでは、TCP 1723に制御プロトコルが必要です。これも転送する必要があります。これは Link で、このためのiptables構成を説明しています。制御プロトコルが欠落しているだけで、正しい方向に進んでいます。

0
Scott Lundberg

「--tablenat」と言うのを忘れたようです。そのため、SNAT/DNATターゲットがなく、PREROUTINGチェーンとPOSTROUTINGチェーンもないフィルターテーブルに入ります。

0
Perry Lorier