2つのADSLルーターを使用する2つのインターネットリンクがあり、192.168.0.0/24ネットワークのインターネットへのアクセスを許可する必要があります。
Linuxルーターでiproute2とiptablesを使用して、ポート番号、プロトコルなどに基づいて発信トラフィックをルーティングする必要があります。
これは私のネットワークです:
(ISP-1) (ISP-2)
Dynamic public IP Dynamic public IP
| |
+---------------+ +---------------+
|ADSL Router (1)| |ADSL Router (2)|
+---------------+ +---------------+
| |
192.168.1.1 192.168.2.1
| |
| |
| |
| +------------------+ |
| | | |
192.168.1.2 --|eth1 eth2|-- 192.168.2.2
| |
| Linux Router |
| |
| eth0 |
+------------------+
|
192.168.0.1
|
|
Local Network:
192.168.0.0/24
次のスクリプトを使用して、Linuxルーターでネットワーク構成をセットアップします。
#!/bin/bash
echo 1 >| /proc/sys/net/ipv4/ip_forward
echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter
# flush all iptables entries
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
# marking packets
iptables -t mangle -A PREROUTING -i eth0 -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p udp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -j MARK --set-mark 2
# create routing tables and default routes
echo '1 ISP1' >> /etc/iproute2/rt_tables
echo '2 ISP2' >> /etc/iproute2/rt_tables
ip route add default via 192.168.1.1 dev eth1 table ISP1
ip route add default via 192.168.2.1 dev eth2 table ISP2
# routing based on previous marks
ip rule add fwmark 1 table ISP1
ip rule add fwmark 2 table ISP2
ip route flush cache
# NAT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
問題は、192.168.0.0/24ネットワークからインターネットに接続できないことです。
このネットワークからリモートサーバーにpingを実行すると、(Wiresharkを使用して)リモートサーバーからLinuxルーターのeth1に返信が返されるのを確認できますが、eth0に到達しません。
助けてください。そして、事前に感謝します。
(編集)
この奇妙な問題のトラブルシューティングを1週間試しました。
コマンド出力のトラブルシューティング:
ip rule
0: from all lookup local
32764: from all fwmark 0x1 lookup ISP1
32765: from all fwmark 0x2 lookup ISP2
32766: from all lookup main
32767: from all lookup default
ip route show table ISP1
default via 192.168.1.1 dev eth1
ip route show table ISP2
default via 192.168.2.1 dev eth2
ip route show table main
192.168.2.0/24 dev eth2 proto kernel scope link src 192.168.2.2
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1
169.254.0.0/16 dev eth0 scope link metric 1000
default via 192.168.1.1 dev eth1 metric 100
次のコマンドを入力することで、この問題を部分的に解決できます。
ip rule del fwmark 1 table ISP1
ip rule del fwmark 2 table ISP2
ip rule add from 192.168.0.0/24 table ISP1
そのため、ローカルネットワークからのすべてのトラフィックがISP1リンクを介して正しくルーティングされ、すべてのPCがインターネットにアクセスできるようになります。
しかし、私はパケットマークに基づくルーティングに興味があります。
たくさんの努力の末、私はついに何が問題なのかを見つけました。
実際、これはルーティングの問題ではありません。スクリプトは正しいですが、何かが不足しています。
このコマンドは、rp_filterを無効にするのに十分ではありません。
echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter
したがって、インターネットから戻ってくるトラフィックはeth1とeth2で減少しました。
次のコマンドを追加して、両方のインターフェイスでrp_filterを明示的に無効にした場合:
echo 0 >| /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 >| /proc/sys/net/ipv4/conf/eth2/rp_filter
問題は解決し、すべてが完全に機能するようになりました。
Linuxのチュートリアルとドキュメントが常に完全であるとは限らないという証拠。
トラフィックがルーターに戻ってきても再び出てこない場合は、ルーティングテーブル、一部のiptablesルールに問題があるか、wiresharkを正しく読み取っていません。パケットがシステムを出るのを阻止するためのオプションは多くありません。
見てください。あなたの問題のようです。 http://www.slashroot.in/linux-kernel-rpfilter-settings-reverse-path-filtering