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

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

インターネット上のサーバーへの永続的な静的 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

PREROUTING/POSTROUTING 命令のテーブル スイッチを忘れました-t nat。先頭に追加してください。

答え2

回答が遅くなりましたが、私も同じニーズに遭遇し、次の 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接続トラッカーにその仕事をさせます。gregre

答え3

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

答え4

「--table nat」を指定するのを忘れたようです。そのため、SNAT/DNAT ターゲットがなく、PREROUTING および POSTROUTING チェーンもないフィルター テーブルに入力されます。

関連情報