インターネット上のサーバーへの永続的な静的 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
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
接続トラッカーにその仕事をさせます。gre
gre
答え3
ほとんどのGREトンネルでは、TCP 1723に制御プロトコルが必要です。これも転送する必要があります。リンクこれは、これに関する iptables 構成を説明しています。正しい方向に進んでいますが、制御プロトコルが欠けているだけです。
答え4
「--table nat」を指定するのを忘れたようです。そのため、SNAT/DNAT ターゲットがなく、PREROUTING および POSTROUTING チェーンもないフィルター テーブルに入力されます。