web-dev-qa-db-ja.com

デュアルネットワーク接続

Ubuntu10.10ボックスにUSBセルラーモデムとホームLAN接続があります。

どちらも独立して動作します。

両方を同時に接続する方法を知り、どのアプリケーションがどのデバイスを使用してインターネットに接続するかを指定できるようにしたい。

誰かがこれを行う方法を知っていますか?

9

どのパケットをどこに送るかをどのように決定するかに応じて、いくつかの可能性があります。それらのほとんどは、LinuxでTCP/IPネットワークがどのように機能するかをある程度理解する必要があります。複雑なことをするために知っておく必要のある主なツールは iptables (Ubuntu: iptablesInstall iptables )および iproute2(ip command) (Ubuntu: iprouteInstall iprouteiproute-docInstall iproute-doc )。

ターゲットIPアドレスで完全に区別できる場合は、簡単です。必要に応じてIPアドレスをルーティングします。たとえば、次のコマンドを実行すると、1.2.3。xおよび1.2.4.2のすべてのパケットが_ppp0_およびその他のパケットを経由します。 _eth0_経由で移動します。

_route add -net 1.2.3.4/24 ppp0
route add -Host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
_

より複雑な要件については、iptablesおよび_ip route_の使用を開始する必要があります。たとえば、次のコマンドは、1とマークされたすべてのパケットが_eth0_を介して送信され、2とマークされたすべてのパケットが_ppp0_を介して送信されるように特別なルーティングテーブルを設定します(localhost向けのパケットを除く)ループバックインターフェイスに固執します)。

_ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
_

これで、iptablesを使用して発信パケットを「マングル」し、パケットが通過するルートを決定するマークを追加できます。たとえば、すべての送信SMTPトラフィック(ポート25)を_eth0_経由で送信し、すべてのトラフィックをユーザーproxyとして実行されているアプリケーションから_ppp0_経由で送信する方法を次に示します。

_iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
_

参照 インターネットに接続された2つのネットワークインターフェイス。ドメイン名に応じて使用するものを選択してください および 異なるネットワークインターフェイスにソフトウェアをバインド


両方のインターフェイスが接続されているときにこれらのコマンドを実行するように調整する必要があります。必要なコマンドを実行する_/etc/network/if-up.d/0justin-routes_というスクリプトを作成することをお勧めします。このスクリプトは、ネットワークインターフェイスが起動するたびに実行されます。その名前は_0_で始まるため、ルートが適切に配置されていることを期待する可能性のあるアプリケーション固有のセットアップの前に、そのプロセスの早い段階で実行されます。インターフェイスの1つがダウンしたときにも処理を実行したい場合に備えて、対称的な_/etc/network/if-down.d/_があります。 (関連するすべてのルートは自動的に消去されるため、他のインターフェイスにフォールバックする場合は、一部のパケットが取り残される可能性があります。)

Ifupスクリプトは interfaces(5) man page に記載されています。知っておくべき主なことは、起動または停止するインターフェースの名前が環境変数IFACEにあるということです。他のインターフェースがすでに_if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …_で稼働しているかどうかを確認できます。