2002年12月1日 更新

ADSLルータ(PPPoE)の構築

最近はADSLやBフレッツといったような定額制でありながら高速な回線が安価で供給されるようになり、家庭でもブロードバンドを容易に実現できる環境が整ってきました。
ADSLやBフレッツでは、回線とマシン(ルータなど)の間にはADSLモデムやONU(オプチカル・ネットワーク・ユニット(メディアコンバータという場合もある))を置き、ここからマシンまではイーサネットケーブルを使って、ここをPPPoEというプロトコルを使ってプロパイダとの間を通信します。 
接続形態としては、モデムにPCを直付けするケースと、ルータを使うケースに分けられます。

接続形態1: PCを直接モデム(ONU)に接続する。
  
  Internet ----- ADSLモデム/ONU ----(PPPoE)----- PC

接続形態2: ルータを利用

  Internet ----- ADSLモデム/ONU ----(PPPoE)----- ルータ ------ PC

形態2.のようにルータを使った場合には、ルータ以下にPCを複数台接続して複数のPCからADSL(Bフレッツ)回線を同時に利用できるようになります。

現在、ブロードバンド用ルータとして多くの製品が比較的安価に入手可能です。 一般的の利用にはこれらの製品を購入するのが簡単でお勧めですが、ADSLとLinuxを使ってインターネットにサーバを公開したいような方は、Linuxサーバ自身をPPPoEに対応したルータと兼用することも可能です。 またLinuxでルータを構築すれば、将来、より高速な回線に切り替える際にも、低コストでルータを構築することが可能です。以下ではLinuxを使ったADSLルータの構築について説明します。なお、今回作成するルータにはLANカードが2枚刺さっており、それらのハードウェアの認識ができており、1枚目(eth0)に関してはLAN側(内側)としてIPアドレスが設定されているものとします。

PPPoE(rp-pppoe)モジュールの組み込み

Linux用のPPPoEモジュールには幾つか種類がありますが、現在もっとも利用されていると思われるモジュールとして rp-pppoe というものがあります。
rp-pppoeは http://www.roaringpenguin.com/pppoe/ のサイトから最新版が入手可能ですので、ここから最新のモジュールを入手してください。 RedHat7.3の場合、RPMS形式でパッケージを作成するのが良いでしょう。2002年9月23日現在、最新のRPMS形式のファイル rp-pppoe-3.5-1.src.rpm を例に以下では説明します。
入手したrp-pppoe-3.5-1.src.rpmをまずリビルドします。

# rpm --rebuild rp-pppoe-3.5-1.src.rpm [Enter]

リビルドが完了すると、/usr/src/redhat/RPMS/i386ディレクトリに"rp-pppoe-3.5-1.i386.rpm"と"rp-pppoe-gui-3.5-1.i386.rpm"の2つのパッケージが作成される筈です。これを以下のようにインストールします。

# rpm -Uvh rp-pppoe-3.5-1.i386.rpm [Enter]

PPPoEの設定

RP-PPPoEのインストールが完了したらこれを設定します。 設定には「adsl-setup」というコマンドを利用します。adsl-setupは対話形式でADSLの設定ファイルを設定するツールで起動すると以下のような質問をしてきます。

# adsl-setup [Enter]
   ::
   ::
>>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca) : xxxx@xxxx.xxx.xx [Enter] ---- xxxx@xxxx.xxx.xxはプロパイダから指示されたPPPoE接続名
   ::
INTERFACE
   ::
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth0): eth1 [Enter] --- PPPoEで接続するイーサネットインターフェース
   ::
>>> Enter the demand value (default no): [Enter] ---- 自動切断の時間。通常はno
   ::
>>> Enter the DNS information here: [Enter] --- ネームサーバを指定。/etc/resolv.confで指定してある場合はここでの指定は不要
   ::
>>> Please enter your PPPoE password: xxxxx [Enter] --- PPPoEの接続のパスワード
   ::
>>> Choose a type of firewall (0-2): 2 [Enter] --- ファイヤーウォールとして設定するなら2、ファイヤーウォールの設定が不要なら0、単独でこのマシンだけをPPPoEで接続するなら1
** Summary of what you entered **
   ::
Ethernet Interface: eth1
User name: xxxxx@xxxx.xxx.xx
Activate-on-demand: No
DNS: Do not adjust
Firewalling: MASQUERADE

>>> Accept these settings and adjust configuration files (y/n)? y [Enter] --今まで設定よければy。
   ::
#

なおadsl-setupでの結果が/etc/sysconfig/network-scripts/ifcfg-というファイルに書き込まれた場合には
# ln -s /etc/sysconfig/network-scripts/ifcfg- /etc/ppp/pppoe.conf [Enter]
#
を実行して、pppoe.confを反映させてください。

/etc/ppp/optionsの設定

/etc/ppp/optionsに以下の行を追加します。

persist
maxfail 0

「persist」を指定することで、回線の異常時に切断されたときに自動的に接続を行うようになります。
「maxfail 0」とすることで接続が成功するまで何度もリトライを繰り返します。

IP4-Forwardの指定

/etc/sysctl.confの以下の記述を編集します。

  ::
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 ---- 0から1に変更
  ::

/etc/sysconfig/networkに以下の記述を追加します。

   ::
GATEWAY=
GATEWAYDEV=
FORWARD_IPV4=yes
   ::

/etc/rc.d/init.d/adsl作成

起動用スクリプトを作成します。なお、RPMやSRPMからパッケージを作成した場合には起動スクリプトは自動的に作成されています。

#!/bin/sh
#
# adsl This script starts or stops an ADSL connection
#
# chkconfig: 2345 99 01
# description: Connects to ADSL provider
#
# LIC: GPL
#
# Copyright (C) 2000 Roaring Penguin Software Inc. This software may
# be distributed under the terms of the GNU General Public License, version
# 2 or any later version.

# Source function library if it exists
test -r /etc/rc.d/init.d/functions && . /etc/rc.d/init.d/functions

# From AUTOCONF
prefix=/usr
exec_prefix=${prefix}

# Paths to programs
START=${exec_prefix}/sbin/adsl-start
STOP=${exec_prefix}/sbin/adsl-stop
STATUS=${exec_prefix}/sbin/adsl-status
case "$1" in
start)
echo -n "Bringing up ADSL link"

$START
if [ $? = 0 ] ; then
touch /var/lock/subsys/adsl
echo_success
else
echo_failure
fi
echo ""
;;
stop)
echo -n "Shutting down ADSL link"

$STOP > /dev/null 2>&1
if [ $? = 0 ] ; then
rm -f /var/lock/subsys/adsl
echo_success
else
echo_failure
fi
echo ""
;;
restart)
$0 stop
$0 start
;;
status)
status)
$STATUS
;;
*)
echo "Usage: adsl {start|stop|restart|status}"
exit 1
;;
esac

exit $RETVAL

起動スクリプトを作成したら、以下のコマンドで起動時にこのスクリプトが実行できるように設定します。

# chkconfig --add adsl [Enter]
#

ファイヤーウォールの設定

ファイヤーウォール(iptables)を基本的な内容で設定します。尚、以下の設定でWAN側はppp0、LAN側をeth1として説明します。各インターフェースがどのようになっているかは、「ifconfig」を実行すると判ります。
またこの際、外部から利用できるサービスとしてDNS(ポート53)とssh(ポート22)だけとします。

# iptables -F
# iptables -t nat -F
# iptables -X
# iptables -Z
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P INPUT -j LOG --log-prefix "Bad Packet: "
# iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
# iptables -A INPUT -i eth1 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i ppp0 -p TCP --dport 53 -j ACCEPT
# iptables -A INPUT -i ppp0 -p UDP --dport 53 -j ACCEPT
# iptables -A INPUT -i ppp0 -p TCP --sport 53 -j ACCEPT
# iptables -A INPUT -i ppp0 -p UDP --sport 53 -j ACCEPT
# iptables -A INPUT -i ppp0 -p TCP --dport 22 -j ACCEPT
# iptables -A OUTPUT -o ppp0 -p UDP --dport 135:139 -j DROP
# iptables -A OUTPUT -o ppp0 -p TCP --dport 135:139 -j DROP
# iptables -A OUTPUT -o ppp0 -p UDP --dport 445 -j DROP
# iptables -A OUTPUT -o ppp0 -p TCP --dport 445 -j DROP
#

作成したルールを起動時に自動実行されるようにします。(RedHat7.3の場合)

# iptables-save > /etc/sysconfig/iptables [Enter]
#

また、ADSLの接続時には/etc/ppp/firewall-masq(adsl-setupでFirewallを使う設定にした場合)ファイルが実行されるのでこのファイルを書き換えます。

#!/bin/sh
iptables -F
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P INPUT -j LOG --log-prefix "Bad Packet: "
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP --dport 53 -j ACCEPT
iptables -A INPUT -i ppp0 -p UDP --dport 53 -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP --sport 53 -j ACCEPT
iptables -A INPUT -i ppp0 -p UDP --sport 53 -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP --dport 22 -j ACCEPT
iptables -A OUTPUT -o ppp0 -p UDP --dport 135:139 -j DROP
iptables -A OUTPUT -o ppp0 -p TCP --dport 135:139 -j DROP
iptables -A OUTPUT -o ppp0 -p UDP --dport 445 -j DROP
iptables -A OUTPUT -o ppp0 -p TCP --dport 445 -j DROP

以上でADSLやBフレッツを使ったルータが完成です。パケットフィルタに関しては利用環境に合わせて設定を行ってください。

ADSLルータの高速化(実験モード)

先の設定でADSLルータとしての動作ができるようになりましたが、今回利用したPPPoEソフトであるRE-PPPoEは、ソフトがLinuxのユーザモードで動作するので性能はそれほど高速ではありません。 しかし、これをカーネルモードで動作させるようにすることで更に高速なxDLSルータへすることが可能です。

PPPoEをカーネルモードで動作させるには、Linux2.4以上のカーネルが必要です。 しかも現状ではこの機能は評価版としての実装となっていますので安定を望む場合にはこの機能を使わない方が良いでしょう。(実際、SSLでの接続やFTPにおいて動作が不定になることがあるように見受けられます)

まずカーネルを再コンパイルします。 コンパイルにあたりカーネルのパラメータを次のように設定。

[Network device support]セクション
<M> PPP (point-to-point protocol) support
<M> PPP support for async serial ports
<M> PPP support for sync tty ports
<M> PPP Defalt compression
<M> PPP over Ethernet (EXPERIMENTAL)

[Character devices] セクション
[*] Non-standard serial port support
<M> HDLC line discipline support
[*] Unix98 PTY support

パラメータの設定方法やカーネルのコンパイル設定しませんが、インターネットで調べれば直ぐに方法は判ると思います。以上のパラメータを設定してカーネルのコンパイルが無事終わったなら次の作業に進みます。

まずppp用のデバイスファイルを作成します。

# mknod --mode=644 /dev/ppp c 108 0 [Enter]

次にRP-PPPoEのプラグインの最新を入手

# cd /usr/src [Enter]
# cvs -d :pserver:cvs@pserver.samba.org:/cvsroot login [Enter]
(Loging in to cvs@pserver.samba.org)
CVS password: cvs [Enter]
# cvs -z5 -d :pserver:cvs@pserver.samba.org:/cvsroot co ppp [Enter]
#

以上でPPPの最新パッケージが/usr/src/pppに出来上がっているので、

# cd /usr/src/ppp [Enter]
# ./configure [Enter]
::

# make [Enter]
::
# make install [Enter]
::
#

次にRP-PPPoEの最新をhttp://www.roaringpenguin.com/pppoe/から入手してこれをコンパイルします。 入手したソースは以下の手順でコンパイル。

# tar zxvf rp-pppoe-x.x.tar.zg [Enter]
# cd rp-pppoe-x.x [Enter]
# ./configure --enable-plugin=/usr/src/ppp [Enter]
# make [Enter]
# make install [Enter]
#

これでRP-PPPoEのプラグインモジュールが/etc/ppp/pluginディレクトリに保存される。 あとは、/etc/ppp/pppoe.confに以下の行を追加する。


LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so

あとは通常通り起動すればカーネルモードで起動できます。

関連リンク

http://www.linux.or.jp/JM/html/rp-pppoe/man5/pppoe.conf.5.html

http://www.roaringpenguin.com/pppoe/