3つのネットワークインターフェイス(1つのイーサネットと2つのUSB Wi-Fi NIC)を備えたRaspberry Pi(Raspbianを実行)があります。私が達成したいのはこれです。2つのWANインターネット(DSL +ケーブル)への接続)があり、RasPiを2つのデフォルトゲートウェイを提供するようにセットアップします。ローカルネットワーク内の特定のクライアントにどちらか一方のゲートウェイを使用させたいのですが、達成したいことの概要は次のとおりです。
通常、明らかな理由で2つのデフォルトゲートウェイを設定することはできませんが、iproute2を使用すると、それを正確に実行でき、ルールによって適用される複数のルーティングテーブル(およびデフォルトゲートウェイ)を使用できることがわかりました。 (以下の私の設定の詳細を参照してください)
イーサネットインターフェイス(192.168.10.1)は、ローカルネットワーク(192.168.10.0/24)に接続するスイッチに接続されています。
インターフェイスwlan0(192.168.178.199)は、最初のWLANルーター(DSL)(192.168.178.1)に接続されています。インターフェイスwlan1(192.168.0.199)は、2番目のルーター(ケーブル)(192.168.0.1)に接続されています。
これが私の/etc/network/interfaces
です
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.10.1
netmask 255.255.255.0
iface wlan0 inet static
address 192.168.178.199
netmask 255.255.255.0
wpa-ssid "ALICE"
wpa-psk "yyyyyyyy"
iface wlan1 inet static
address 192.168.0.199
netmask 255.255.255.0
wpa-ssid "BOB"
wpa-psk "xxxxxxxx"
何らかの理由で、2つのwlanインターフェイスにauto
を設定してもうまく機能せず、ほとんどの場合、少なくとも1つは「アップ」されないため、それらのifupをrc.localに配置しました。今のところ。起動すると、両方のwlanインターフェースが起動し、それらのwlanに接続されており、どちらもルーターにpingできます(例:ping 192.168.178.1 -I wlan0
)。
次のステップはiproute2の設定でした。これが私の/etc/iproute2/rt_tables
です
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 alice
2 bob
これらの2つのテーブルを定義した後、すべてのNICが起動した後に各ブートに適用される次のip
設定を作成しました。
ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.199 table alice
ip route add default via 192.168.178.1 table alice
ip route add 192.168.0.0/24 dev wlan1 src 192.168.0.199 table bob
ip route add default via 192.168.0.1 table bob
ip rule add from 192.168.178.199 table alice
ip rule add from 192.168.0.199 table bob
ip route add default scope global nexthop via 192.168.178.1 dev wlan0 weight 1 nexthop via 192.168.0.1 dev wlan1 weight 1
テストの目的で、今のところ/etc/resolv.conf
でGoogleのネームサーバー(8.8.8.8)をデフォルトとして設定しました。
この時点で、RasPiからインターネット上のホストに正常にpingを実行できます。取得された要求は、一方または他方のゲートウェイを介して均等に送信されます(ping -R 8.8.8.8
で確認しました)。
今私の質問:
ローカルの192.168.10.0/24ネットワークのクライアント(静的IPを使用し、DHCPは不要)がインターネットにアクセスするためにデフォルトのgw(192.168.10.1-eth0インターフェイス)としてRasPiを使用するようにするにはどうすればよいですか?これはマスカレードとiptablesを使用して行われると思いますが、このセットアップでそれを行う方法についての手がかりはありません。
ip
ルールを変更して、クライアントがRasPi自体と同じようにインターネットに接続できるようにするだけでなく、どちらか一方のゲートウェイを使用できるようにするにはどうすればよいですか?たとえば、ホスト192.168.10.100に「ALICE」ゲートウェイを使用させ、192.168.10.101に「BOB」を使用させたい場合はどうすればよいですか?
私はフィニッシュラインに非常に近いと感じています。これについてのヘルプはおそらくそれほど一般的ではない問題に大いに感謝しています。前もって感謝します!
よろしく、ロブ
更新:
私は少し進歩しました:これらのルールを追加した後...
ip rule add fwmark 1 table alice prio 1024
ip rule add fwmark 2 table bob prio 1025
...(192.168.10.100から)192.168.10.1のRasPiイーサネットインターフェイスだけでなく、192.168.178.199のwlanインターフェイスにもpingを実行できます。そのインターフェース(192.168.178.1)の背後にあるルーターまたはインターネット上のホストにまだpingを実行できません。しかし、私たちは近づいていると思います...したがって、パケットは正しいWLANインターフェイスに到着しますが、今度はWLANNICがそれらを転送する必要があります。それはどのように行われますか?
route add default gw 192.168.10.1 on each client
そして
編集:
iptables -t mangle -A PREROUTING -s 192.168.10.100/32 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.10.101/32 -j MARK --set-mark 2
以下も参照してください。
各WANにパブリックIPが1つしかない場合は、NAT(ネットワークアドレス変換)ではなく、PAT(ポートアドレス変換)を実行する必要があります。
何かのようなもの:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
編集:私はあなたのWAN IPをプライベートIPに置き換えていると仮定しています...
ホスト192.168.10.252をwlan0経由でルーティングするとします。
iptables -t mangle -N MARK1
iptables -t mangle -A MARK1 -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j CONNMARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j ACCEPT
# local traffic
iptables -t mangle -A PREROUTING -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT
# rest
iptables -t mangle -A PREROUTING -i eth0 ! -d 192.168.10.0/24 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -s 192.168.10.252 -i eth0 -j MARK1
iptables -t nat -N SNAT1
iptables -t nat -A SNAT1 -j SNAT1 --to-source 192.168.178.199/32
iptables -t nat -A SNAT1 -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -m mark --mark 0x1 -j SNAT1
これらのマークを読み取るようにiproute2に指示します。
ip rule add pref 30000 fwmark 1 lookup alice
ip rule add pref 29000 from 192.168.178.199 lookup alice
ip route add 0.0.0.0 dev wlan0 scope link src 192.168.178.199 table alice
ip route add default via 192.168.178.1 dev wlan0 scope global table alice
ip route add 192.168.10.0/24 dev eth0 scope link src 192.168.10.1 table alice
ホスト192.168.10.252がルーター自体を対象としていないものにアクセスする場合、この接続は「1」とマークされ、iproute
がこのマークを読み取って適切なルールを見つけようとします。明らかにここには欠けているものがありますが、これが主なアイデアです。
この解決策に従う場合は、ルートの重みを削除する必要があります。ルーティングテーブルとルールをいじり回しているときは、キャッシュをフラッシュすることを忘れないでください。
etc/sysctl.conf
ファイルに移動して、
**net.ipv4.ip_forward=0** to
**net.ipv4.ip_forward=1**
**sysctl -p /etc/sysctl.conf**
#iptables -P FORWARD ACCEPT
#service iptables save
2番目の質問では、ルーターにLAN用の2つのインターフェイスが必要です。たとえば、LANインターフェイスとしてEth3とEth4があるとします。 BOBのEth3アドレスとAliceのEth4アドレス。 WANゲートウェイをLANゲートウェイとして使用することはできません。