プライベートネットワーク接続を管理し、外部へのルーティングをより適切に制御するために、新しいルーターをネットワークに配置しています。ルーターの2番目のプライベートネットワークへの参照を削除して、この質問を簡略化することにしました(ただし、この質問には理由があるので、答えはではないことに注意してください古いルーターをデフォルトゲートウェイのままにします)。
ルーターのiptablesに次のルーティングがあります。
# Allow established connections, and those !not! coming from the public interface
# eth0 = public interface
# eth1 = private interface #1 (129.2.2.0/25)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow outgoing connections from the private interface
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# Masquerade (NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Don't forward any other traffic from the public to the private
iptables -A FORWARD -i eth0 -o eth1 -j REJECT
この構成は、ユーザーがパブリックアドレスを持つモデム/ルーターを介して転送されることを意味します。これはほとんどの目的で問題なく機能し、すべてのコンピューターが1つのパブリックIPの背後に隠れていることは重要ではありません。
ただし、一部のユーザーは192.111.222.111:8080でプロキシにアクセスできる必要があり、プロキシはこのトラフィックが129.2.2.126(古いルーター)のゲートウェイを経由するものであると識別する必要があります-それ以外の場合は応答しません。
私はルータに静的ルートを追加してみました:
route add -Host 192.111.222.111 gw 129.2.2.126 dev eth1
ルータから192.111.222.111に正常にpingできます。ルートをトレースすると、129.2.2.126ゲートウェイが一覧表示されますが、次の各ホップで***が表示されるだけです(これは単なるWebプロキシであり、認証が必要であるため、これは理にかなっていると思います)。
129.2.2.0/25ネットワーク上のホストからこのアドレスにpingしようとすると失敗します。
代わりにiptablesチェーンでこれを行う必要がありますか?このルーティングをどのように構成しますか?
ネットワーク図
次に、ルーターのインターフェース構成を示します。
auto eth0
iface eth0 inet static
address 150.1.2.2
netmask 255.255.255.248
gateway 150.2.2.1
auto eth1
iface eth1 inet static
address 129.2.2.125
netmask 255.255.255.128
そして、これがルーティングテーブル(静的ルートを追加しない場合)です。
Destination Gateway Genmask Flags Metric Ref Use Iface
default eth1202.sa.adsl 0.0.0.0 UG 100 0 0 eth0
localnet * 255.255.255.0 U 0 0 0 eth1
129.2.2.0 * 255.255.255.128 U 0 0 0 eth1
言い換えると、129.2.2.7(たとえば)からのトラフィックがルーター(129.2.2.125)を経由してルーティングされるようにします。ただし、このルーターは宛先が192.111.222.111の8080リクエストを転送する必要があります。これは、古いルーターの反対側(129.2.2.126-管理できない場所)のどこかにあります。
あなたがしようとしていることは完全に可能であり、実際、かなり頻繁に使用されるテクニックです。また、セットアップのほとんどはすでに完了しています。不足している可能性があるのは、「新しいルーター」での「ACCEPT」ルールで、eth1からeth1。使用して追加するだけです
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -j ACCEPT
導入されているルールやセキュリティ対策を回避しないように十分に安全である必要がありますが、ネットワークのクライアントやプロトコルを許可するのに十分一般的である必要があります。設定とトラブルシューティングが完了したら、使用するプロトコルと宛先にルールを制限できます。
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p icmp -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p tcp --sport 8080 ! --syn -j ACCEPT
一般的なケースでは、192.111.222.111の「新しいルーター」を通過するトラフィックフローはほとんど見られないことに注意してください。 Linuxは ICMPリダイレクトメッセージ を発行して、最初のパケット発生時に192.111.222.111へのトラフィックに「古いルーター」を使用するようサブネットのホストに通知します。ほとんどのホストが従い(メッセージが受信された場合-つまり、どこにもフィルタリングされていないと仮定して)、後続のすべてのパケットを「古いルーター」を介して192.111.222.111に直接送信します。
特定のホストにルーティングしている場合、ネットマスクを使用するのは適切ではないと私は思います。 0.0.0.0を指定すると、そのマスクはすべてのIPv4 IPに一致するため、すべてのトラフィックのデフォルトゲートウェイを意味します。
実際、完全な255.255.255.255は、単一のホストマッチングルールに必要です。
そしておそらくそれは明白ですが、既存のルーティングテーブルでカバーされている直接接続されたネットワーク上にあるゲートウェイを指定する必要があります。
Iptablesとルーティングの操作では、ドロップされたパケットをログに送信するようにLOGルールを設定することをお勧めします。ルーティングの問題のように見えるパケットをドロップするかどうかがわかります。
これにより、LOGDROPチェーンが設定されます。
-A LOGDROP -j LOG --log-prefix "LOGDROP "
-A LOGDROP -j DROP
そして、記録したいさまざまなチェーンの最後で、最後にLOGDROPチェーンにジャンプします。
-A INPUT -j LOGDROP
単にパケットをドロップする代わりに。ラベルが異なるさまざまなLOGDROPチェーンを使用すると、表示されているものをより詳細に理解できます。