ルータ兼サーバそして複数IPアドレス設定記録
前回のBフレッツ設定は、Express5800を使ってルータ兼サーバを構築していった記録であるが、
今回引越しが入り、さらに1固定IPアドレスだったものを8固定IPアドレスへ
契約の変更をしたので、それに伴うルータ兼サーバの設定変更の記録を
残していこうと思う。



ハード構成と前提
今回のハード構成は基本的に前回のExpressと同じものであり、またそれに対する設定変更となるので異なる部分だけを記述する。
ハードウェアとして変わった部分は、intemのGigabitNICを追加した点である。
これは、LAN側のNICとして100Mbpsでは少々役不足になってきたためと、8IP化に伴い、DMZ用のNICが必要になったためである。
デバイスとしては、eth0〜eth2までの3つとなり用途はそれぞれ以下のとおり。
eth0 DMZ側
eth1 WAN側(PPP用)
eth2 LAN側
Gigabitは、とりあえず問題がなさそうなintelのもの。ちなみにRc-1はPCIがひとつしかないため(1Uだから仕方ない)、NICを一枚追加したことでPCIは一杯となってしまった。

また固定IPアドレスが8つとなるので、ネットワークの前提としてプロバイダより提供されるアドレスは以下を使用するものとする。
ネットワークアドレス(WAN) 218.xxx.xxx.240/29
サーバ使用アドレス(WAN/DMZ) 218.xxx.xxx.241
LAN側使用アドレス 192.168.0.125

構成としては以下のようなトポロジとなることを想定している。PPPについてはunnumbered接続を行うものとする(後述)。

                      |(eth0)
                      | unnumbered
               [Server&Router]
           (eth1)|         |(eth2)
  218.xxx.xxx.241|         |192.168.0.125
                 |         |
               [DMZ]     [LAN]
 (218.xxx.xxx.242等)     (192.168.0.1等)


カーネル再コンパイル
intelの1000MTを追加したので、カーネルの再コンパイルが必要となる。前回の設定に加えて、
Network device support
  -> Ethernet (1000 Mbit)
      ->Intel(R) PRO/1000 Gigabit Ethernet support = m
を追加し、カーネルを再コンパイルして1000MTが使えるようにする。これでeth2が出来ているはずである。
cat /proc/net/dev を実行してeth0,eth1,eth2が一覧に出てきていれば、デバイスとしての認識は成功しているはずだ。


ネットワークインタフェース設定
各eth[012]について、改めてインタフェースの設定を行う。設定ファイルは/etc/sysconfig/network-scripts/ifcfg-eth[012] の3ファイル。

eth0 (DMZ側)
eth0はDMZ側の設定となる。今回複数固定IPアドレスの設定を行う。割り当てられたグローバルIPアドレスはこのeth0配下に存在するマシンに設定し、ここのネットワークはDMZとなる。
eth0には218.xxx.xxx.240/29のネットワークのうち一番最初のアドレス、すなわち218.xxx.xxx.241を割り当てる(218.xxx.xxx.240はネットワークアドレスとなる)。
よって、/etc/sysconfig/network-scripts/ifcfg-eth0 は以下のとおり。

DEVICE=eth0
BOOTPROTO=static
IPADDR=218.xxx.xxx.241
NETMASK=255.255.255.248
NETWORK=218.xxx.xxx.240
ONBOOT=yes
[/etc/sysconfig/network-scripts/ifcfg-eth0]


eth1 (WAN側)
eth1はPPP接続として使うためIPアドレスの設定は行わない。

DEVICE=eth1
ONBOOT=no
[/etc/sysconfig/network-scripts/ifcfg-eth1]


eth2 (LAN側)
eth2はLAN側として使用するので、プライベートアドレスを割り当てる。今回は192.168.0.0/24を割り当て、eth2には192.168.0.125を設定する。

DEVICE=eth2
BOOTPROTO=static
IPADDR=192.168.0.125
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
[/etc/sysconfig/network-scripts/ifcfg-eth2]



pppdの設定及びunnumberedの設定
今回の設定で一番の山場となる(笑)。

pppd(pppoe)を使用して、上位ISPと接続をするための設定を行う。設定ファイルは、/etc/sysconfig/network-scripts/ifcfg-ppp0 となる。今回の設定ではBフレッツのマルチセッションを使用して同時に二箇所へのPPPoE接続を実現する。このため設定対象ファイルはifcfg-ppp0とifcfg-ppp1の2ファイルになる。
さらに、ppp0側については上記複数固定IPアドレスによりunnumbered接続を実現する必要がある。
Linux上でのunnumbered接続についてはさまざまな説明が各サイトにてされているようだが、今回一般的に言われている方法ではどうしても接続出来なかったため、ここで実際にunnumbered(といって良いのか分からないが)接続が実現できた内容について説明していく。

ppp[01]
ifcfg-ppp[01]については、こちらにて説明しているPPPoE接続と設定内容自体に変わりは無い。PPPD_EXTRAに使用する固定IPを設定するというのが一般的のようだが、今回その方法ではどうしても接続することが出来なかったため、通常の接続をしたのち、ifconfigにて無理やりIPアドレスを付け替えることにした(実際この手法をとっている方もいらっしゃる)。
この部分については以下の実際の接続が完了した後に記述する。

ifcfg-ppp0の設定が完了したら、実際に接続を行う。接続は

# /etc/sysconfig/network-scripts/ifup ppp0

とする。ここでConnected!と表示されれば問題なく接続が完了する。

ただしここでTimeoutしてしまう場合がどうも多いようで、これは/usr/sbin/adsl-statusのスクリプトに問題があるためのようである。スクリプト中の接続完了のチェックを行っている部分を修正することで回避可能となる。修正個所は以下のとおりで/usr/sbin/adsl-statusの80行目近辺。


  IF=`basename $i .pid`
     netstat -rn | grep " ${IF}\$" > /dev/null
     # /sbin/ifconfig $IF | grep "UP.*POINTOPOINT" > /dev/null
     if [ "$?" != "0" ] ; then
        echo "adsl-status: Link is attached to $IF, but $IF is down"


  IF=`basename $i .pid`
     # netstat -rn | grep " ${IF}\$" > /dev/null
     /sbin/ifconfig $IF | grep "UP.*POINTOPOINT" > /dev/null
     if [ "$?" != "0" ] ; then
        echo "adsl-status: Link is attached to $IF, but $IF is down"

見てのとおり、オリジナルのadsl-startにはもともとこのifconfigを使用してチェックしていた形跡があり、それをnetstatに変更したように見える。ifconfigのチェックロジックがそのまま残っているのでこちらに変更するだけなのだが.....
いささか不審点が残るが、ifconfigを使用することでtimeoutすることなく接続完了する。

ここまでで、PPPoE接続までは完了しているはずだが、/sbin/ifconfigを実行すると、ppp0には設定したいIPアドレス(218.xxx.xxx.241)ではなく、ネットワークアドレス(218.xxx.xxx.240)が割り当てられてしまっている。これを修正するため、ppp0のIPアドレスをifconfigを使用して無理やり218.xxx.xxx.241に再設定する。

# /sbin/ifconfig ppp0 218.xxx.xxx.241

これをやることで、eth0とppp0は同じIPアドレスとなるが、動作上はこれで問題ない。
(本来unnumberedというのはppp0にIPアドレスを割り当てない、という意味ではないので.....)

ppp1に関しては今回の場合通常の接続と同じになるので、同様にifcfg-ppp1を記述してifupしてやればよい。ppp0と同様に複数固定IPアドレスになる場合でも上記と同じ方法で問題ないはずである(未確認)。

以上で、ネットワークとしての接続は完了となる。


静的NATの設定
前説までで、接続が完了しているので、次にLAN側からのNATの設定を行う。IPアドレスがひとつの通常の場合であれば、iptablesのMASQUERADEを使用するが、今回の場合MASQUERADEを使用してしまうと、DMZからのアクセスもすべてNAT経由となってしまうためアクセス元アドレスがおかしくなってしまう。
そのため、複数IPアドレスの場合は、SNATを使用し、送信元ネットワークアドレスを指定する。
192.168.0.0/24からSNAT経由でアクセスする設定をする場合は、

# /sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j SNAT --to 218.xxx.xxx.241

とする。これで、192.168.0.0/24からの外部にアクセスするものだけがNAT経由となる。もし、ppp1を使用しているのであれば、ppp1に設定されたIPアドレスでもうひとつiptablesの設定をすればよい。

ppp1が動的にIPアドレスが割り振られる場合、SNATは使用できず、MASQUERADEとなってしまうため混在は出来ないものと考えられる。

なお、本説からのiptablesを使うためには、/sbin/insmod ip_tablesが実行され、iptablesが使用可能となっていることが必要である。


その他の設定
必要に応じて、以下のモジュールを組み込んでおく。詳細についてはここでは省略するが、3行目は必須となる。これはMTU Blackholeのための設定でこれをやらないとWebアクセスが極端に遅くなるサイトなどが出てくる。

# /sbin/insmod ip_conntrack_ftp
# /sbin/insmod ip_nat_ftp
# /sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu




ルーティング
上記接続では、defaultのルートがおそらく出来ていないはずで(もしあったら一度削除)、それに加えて必要なルーティングを定義していく。 基本的には、
218.xxx.xxx.240/29はeth0へ
ppp1経由になるもの
デフォルトはppp0へ
の順番で定義する。

ここまでの作業で、各セグメント間と外部との接続はすべて正常に動作するはずである。

最後に各ネットワークと外部(ppp[01]等)とのバインドをするサービスで、先に起動されてしまっているものがもしあれば、サービスの再起動をする。たとえば、xinetd等はxinetdよりもあとにPPP接続を行うと、外部からのサービス受付がされないので注意。


2004/11/11 追記
再接続時処理
上記までの設定で、通常動作であれば問題なく動作しているはずだ。
か、万が一pppdの接続が切れてしまった場合..........とくに所詮はBestEffortでしかない フレッツなどでは切れる場合があると思われるが.........

設定にpersistがあるので、セッションが切れた場合、pppdの動作としては 再接続を行う挙動をする。ところが、再接続後のIPアドレスのふりなおしなどの 処理をしてくれないため、アドレスが変わってしまい、結果として通信不可の 状態に陥る。

切れるたびにいちいち手動で設定しなおしをするわけにはいかないので、 再接続後の処理を自動化する。pppdは接続を完了すると/etc/ppp/ip-upという スクリプトを実行する。
再接続後のifconfig(IPアドレス設定)等の必要な処理は、この/etc/ppp/ip-upに 書くか、または別スクリプトを記述して/etc/ppp/ip-upから呼び出すように する。