[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:84062] 1台のルータで複数の外部接続(Re: 複数の接続回線の併用。)


福林ともうします。
# ひきたさん活躍してますね:-)

複数の接続を使う方法を模索している方がおられるようですが,
うちでは,1台のLinux箱で,2つの上流を併用していました。
OCNエコノミーからADSL(Infosphereの複数固定IP)に移行するにあたり,
一時的に,2つの出入り口が活きるように設定しました。
参考になるかもしれませんし,ならないかもしれません。

同様の経験をWebに掲載している方はあまりないようなので,Linux-usersの
アーカイブに残すことにしました。:-) 長くてすいません。

複数のデフォルトゲートウェイを設定してきちんと双方向にパケットが
流れるようにするためには,ソースルーティング(IPパケットが名乗る
「発信元」に基づく振り分け)が必須です。
iproute2などを用いてポリシールーティングをするとよいでしょう。

下記に,具体的なコマンドの書き方も添えてありますが,Kernel2.2に
iproute2+tcを用いる場合のものです。Kernel2.4だともっと違う方法が
まっとうなのかもしれません。(調べていません)

----
■ もとの構成

下図をご覧ください。
います。ISDNルータ専用機に1つのIPアドレスを与え(210.248.xxx.129),
Linux機やwin2kのデフォルトゲートウェイはこちらを向いています。
192.168.1.x と外とをつなぐルータは,Linuxがやっています。

                                                外
                                                |
                                            [OCN網ルータ]
                                                |PPP
                                            [ISDNルータ]
                                                |210.248.xxx.129
                                                |
               << broadcast network: 210.248.xxx.128/28 >>
                 |            |                    |
                 |            |                    |210.248.xxx.130
              [Win2k] [dialupサーバ]  [eth1 Linux箱 eth0]
                                        |192.168.1.2
                                        |
                << broadcast: 192.168.1.0/24 >>
                      |             | |
                      |192.168.1.3  | |
                   [Win98]          DHCPなど

----
■ 外への経路を追加する

これにADSLの接続を足します。ADSLモデムとのインターフェイスはethernetです。
ルータ専用機にIPアドレスを1個割り当てることをきらい,ルータ機能を
Linuxに任せることにします。よって,Linux箱には2枚のNICが追加されます。
怒濤の4枚挿し。

eth1上でpppoedが動作し,接続されると,OSからはppp0というインターフェイスが
見えるようになります。なお,ブロードバンドルータ等を利用する場合でも,
ルーティング設定上の注意点は基本的に同じです。

                                   外           外
                                   |           |
                              [PPPoEサーバ] [OCN網ルータ]
                                   |           |PPP
                                   |       [ISDNルータ]
     ☆=202.224.xxx.25        (ADSLモデム)     |210.248.xxx.129
                                   |           |
         << 202.224.xxx.24/29 >>   |PPP     << 210.248.xxx.128/28 >>
         |      |           |   |☆              |
         |      |         ☆|  ppp0               |210.248.xxx.130
     [Win2k] [dialupサーバ] [eth2 eth1 eth3 Linux箱 eth0]
                                        |192.168.1.2
                                        |
                 << broadcast: 192.168.1.0/24 >>
                      |             | |
                      |192.168.1.3  | |
                   [Win98]          DHCPなど

この状況で,デフォルトゲートウェイとして via 202.224.xxx.25 dev ppp0 を
設定すると,外へ出ていくパケットは必ずADSLを経由するようになります。
デフォルトゲートウェイを2つ設定しても,実際にはどちらか一方だけが
有効になるようです。
また,外から各ホストへの経路もきちんと設定されますが,実用上は非常に
問題があります(後述)。

ちなみに,ppp0インターフェイスにつける(PPP用の)IPアドレスと,
eth2につけるアドレスは同一で大丈夫です。
(適切にルーティングを設定するなら,202.224.xxx.24 などとしても平気です)

----
■ 問題点と解決

ところがこれだと,外からADSL側のIPアドレスには正常につながりますが,
外からOCN側のホストにつなごうとしても,返事待ちで止まってしまいます。
つまり,「パケットは届いているらしいのに,返事しない」ようになります。

Linux箱としては,210.248.xxx.130 に対する接続要求をちゃんと受け取り,
「210.248.xxx.130から」お返事を返そうとするわけですが,このパケットが
実際にはADSL側にルーティングされてしまうため,途中のルータなどが
拒絶するのです。(Message-Id: <874rtyyi4n.wl _at_ portellen.arhc.org>)

そこでやるべきことは,以下のとおりです。

0. 2つのルーティングテーブルを設定する。各々「table main」「table 1」
   と名づけます。
1. table mainのルーティングを設定する。デフォルトゲートウェイは 
   via 202.224.xxx.25 dev ppp0 とする。
2. table 1のルーティングを設定する。デフォルトゲートウェイは
   via 210.248.xxx.129 を設定する。
3. ソースが 210.248.xxx.128/28 であると名乗るパケットについては,
   table 1 が使われるようにルールを書く。
4. それ以外のパケットについては,table main が使われるようにする。

1. については,実は,インターフェイスにアドレスを振る際に自動的に
設定されます(table mainというのが実は,従来のrouteコマンドで操作される
テーブルです)。デフォルトゲートウェイについても,pppを起動する
スクリプトが,自動的にmainテーブルのデフォルトを設定するのが普通です。

以下に,上記箇条書きの 2. 3. に対応する部分の書き方の例を示します
(適切にカーネルを構築し,iproute2+tcのipコマンドを使っています)。

  # set table 'ocn'
  ip route add 202.224.xxx.24/29           dev eth2 table 1
  ip route add 192.168.1.0/24              dev eth3 table 1
  ip route add default via 210.248.xxx.129 dev eth0 table 1
  ip rule add from 210.248.xxx.128/28 table 1 prio 16383

prioというのはルールの優先度で,数値が小さいほど優先です。
起動時には,優先度32766でtable mainが使われるようなルールが設定されて
います。これに優先度16383のルールを追加しています。
くわしくはiproute2のドキュメントをごらんください。

ルーティングテーブルを書き換えるプログラムが他にあったりする場合は,
proto staticなどを適宜指定すべきかもしれませんが,よく知りません。

----
■ おせっかい

もともとプライベートネットワークと外との間のマスカレードつきルーティングを
おこなっていた関係上,ipchainsの設定におけるforwardチェインを厳しく
チェックしていました。

  ipchains -P forward DENY
  ipchains -A forward -s 192.168.1.0/24 -j MASQ

当然ですが,このままだとIPマスカレードに関係あると思われるパケット以外は
一切転送してくれません。結果,ルーティングはできているのにパケットが
通らない現象に悩まされました。昔設定したことをすっかり忘れていたわけです(^_^;

  ipchains -A forward -s 202.224.xxx.24/29 -j ACCEPT
  ipchains -A forward -d 202.224.xxx.24/29 -j ACCEPT

を追加して解決しました。iptablesでの書き方は知りません。

--------
取れないバグは仕様

E-mail: ippei _at_ is.s.u-tokyo.ac.jp, ippei _at_ tsg.ne.jp (FUKUBAYASHI Ippei)
福林 一平

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: