福林ともうします。
# ひきたさん活躍してますね:-)
複数の接続を使う方法を模索している方がおられるようですが,
うちでは,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)
福林 一平
Follow-Ups:
- [linux-users:84088] Re: 1台のルータで複数の外部接続(Re:複数の接続回線の併用。)Naoto Shimazaki
- [linux-users:84060] Re: 複数の接続回線の併用。Hisaaki Shibata
- Prev by Subject: [linux-users:84061] Re: [linux-users:84058] Re: 複数の接続回線の併用。
- Next by Subject: [linux-users:84063] Re: 複数の接続回線の併用。
- Previous by thread: [linux-users:84060] Re: 複数の接続回線の併用。
- Next by thread: [linux-users:84088] Re: 1台のルータで複数の外部接続(Re:複数の接続回線の併用。)
- Indexes:[Main][Thread]