FreeBSDでPPPoE複数セッション接続

最終更新: 2005/1/8

本稿では、フレッツADSL・Bフレッツユーザー向けに、 FreeBSDで複数のPPPoEセッションを接続する方法を紹介します。 2003年9月にNTT東のフレッツスクウェア網のアドレスが変更になったのに伴い、加筆訂正しました。

(2004/5/28追記)ルーティング情報やDNS正引きが変更になっていたので、訂正するとともに、IPアドレスの変更に対する注意を喚起するようにしました。

(2004/8/19追記)ルーティング情報を改訂しました。

(2005/1/8追記)ルーティング情報を改訂しました。(Version9)


はじめに

フレッツADSL・BフレッツのPPPoE同時接続セッション数は、 Bフレッツベーシックなど一部を除いて1セッションに制限されていましたが、 2002年10月から2セッション以上に引き上げられました (NTT東と西で提供条件が若干違います)。 これにより、ISPとフレッツスクウェアを切り替えることなく同時に接続できるなどの利点が生まれます。 そこで、ルーターとしてFreeBSDを使用している環境で、 複数のPPPoEセッション(具体的には、ISPとフレッツスクウェア)を接続するための設定や注意点を紹介します。

ネットワーク構成

ここでは以下のような構成を例にとります。

回線はBフレッツでも適用可能と思われます。 ローカル(同一マシン上またはLAN内)でキャッシュネームサーバーが動いていることが望ましいです。 なお、フレッツスクウェアのIPアドレスなどに関する記述は、 NTT東日本・東京エリアにおける本稿執筆時点のものです。 地域や時期により異なる可能性がありますので、必ず確認してください。

mpd, natd, djbdnsやLinuxの例については、稿末の参考文献を参照してください。

準備

まず、ISPおよびフレッツスクウェアにそれぞれ単独で普通に接続できることを確認してください。 ここでは詳しくは述べませんが、tunデバイスとnetgraphを使用可能にし、 /etc/ppp/ppp.confと/etc/rc.confで以下のように記述すれば接続できるはずです(NATもpppで行っています)。

default:
 set device PPPoE:xl0
 set MRU 1448
 set MTU 1448
 set log Phase Chat IPCP CCP tun command
 accept CHAP
 enable lqr
 nat enable yes
 add default HISADDR
 set server /var/run/internet "" 0177
# enable dns

square:
 set authname guest@flets
 set authkey guest

isp:
 set authname yourname@yourisp
 set authkey yourpassword
ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="isp"	# or "square"
gateway_enable="YES"

ローカルにネームサーバーがなく、接続時に通知されたネームサーバーアドレスを/etc/resolv.confに書き込みたい場合は、ppp.confにenable dnsを追加します。

なお、FreeBSD 4.3では、pppによるnetgraph.koの自動ロードがうまくいかないようなので、 カーネルにNETGRAPHを組み込んでおくか、/etc/rc.networkでppp起動前に明示的にkldload netgraphとする必要があります。

さて、複数セッション接続のための準備ですが、以下のようにします。

接続する

まず、通常どおりメインのISPに接続します。 ここで、pppが使用するtunデバイスを-unitで固定しておくと、 予期せぬtunデバイスが使われてipfwで困る事態を防げます。

# ppp -ddial -unit0 isp

この状態でさらにフレッツスクウェアに接続してみます。

# ppp -unit1 square
Working in interactive mode
Using interface: tun1
ppp on yayoi>dial
ppp on yayoi>
Ppp on yayoi>
PPp on yayoi>
PPP on yayoi>

このようになって接続が成功すれば、tun1にアドレス(当方の環境では220.216.128.0/17の範囲内のアドレス)が振られ、 ppp.confで指定した経路が設定されます。下線部に注目してください。

$ ifconfig tun1
tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1448
        inet 220.216.199.15 --> 220.210.195.70 netmask 0xffffffff
        Opened by PID 71646

$ netstat -rn -finet
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            210.138.170.21     UGSc       11   448909   tun0
127.0.0.1          127.0.0.1          UH          2   316667    lo0
192.168.0          link#1             UC          4        0    xl0
192.168.0.3        00:60:97:b7:69:3f  UHLW        0      202    lo0
192.168.0.255      ff:ff:ff:ff:ff:ff  UHLWb       2    22836    xl0
210.138.170.21     210.138.35.209     UH          8        0   tun0
220.210.194/25     220.210.195.70     UGSc        2      292   tun1
220.210.195/26     220.210.195.70     UGSc        0        0   tun1
220.210.195.64/26  220.210.195.70     UGSc        0        0   tun1
220.210.195.70     220.216.199.15     UH         16        3   tun1
220.210.197.128/25 220.210.195.70     UGSc        0        0   tun1
220.210.198/26     220.210.195.70     UGSc        0        0   tun1
220.210.198.128/26 220.210.195.70     UGSc        0        0   tun1
220.210.199/27     220.210.195.70     UGSc        0        0   tun1
220.210.199.128/28 220.210.195.70     UGSc        0        0   tun1
220.210.199.160/28 220.210.195.70     UGSc        0        0   tun1

これで、フレッツスクウェアのサーバー群と通信できるようになります。 ただし、この段階ではfletsドメインのホスト名の解決はまだできませんので、基本的にIPアドレスで指定します。 ホスト名を解決するには、フレッツスクウェアのネームサーバーを明示的に指定して引く必要があります。 ネームサーバーのアドレスは、以前は県によって違っていましたが、 現在では東日本全域で同じです。 なお、tracerouteやpingは地域や相手サーバーによっては届かないかもしれません。

$ ping 220.210.194.67
PING 220.210.194.67 (220.210.194.67): 56 data bytes
64 bytes from 220.210.194.67: icmp_seq=0 ttl=254 time=17.144 ms
64 bytes from 220.210.194.67: icmp_seq=1 ttl=254 time=16.725 ms
64 bytes from 220.210.194.67: icmp_seq=2 ttl=254 time=17.463 ms
	:
	:
	:

$ host www.flets 220.210.194.67
Using domain server:
Name: 220.210.194.67
Address: 220.210.194.67#53
Aliases:

www.flets has address 220.210.194.69

$ telnet 220.210.194.69 80
Trying 220.210.194.69...
Connected to 220.210.194.69.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
	:
	:
	:

また、LAN内のプライベートアドレスのマシンからもアクセスできることを確認します。 フレッツスクウェア網との通信はtun1へ、それ以外はtun0へ、それぞれNAT経由でルーティングされます。

なお、ppp isp squareなどとして、一つのpppで両方に接続できそうに思うかもしれませんが、これはうまくいきません。 これは単に、指定されたエントリを順に読み込んでいき、後から読んだ設定が残るだけのようです。

DNSについて

さて、一応つながりましたが、このままではfletsドメインのホスト名(www.fletsなど)の解決と、 フレッツスクウェア網の逆引きができません(逆引きはできなくても困りませんが)。

ローカル(同一ホスト上またはLAN内)でキャッシュネームサーバーを動かしていない場合は、 fletsドメインのホストを/etc/hostsに並べるしかないでしょう。 東日本地域では、当方で独自に作成したhostsファイルを参考にしてください(内容は最新であるとは限りませんので、必ずネームサーバーを引いて確認してください)。 なお、/etc/resolv.confにISPのネームサーバーと フレッツスクウェアのネームサーバーを併記してもうまくいきません。

ローカルでネームサーバーが動いている場合は、fletsゾーンの正引きと フレッツスクウェア網の逆引きをフレッツスクウェアのネームサーバーにforwardすればOKです。 BINDの場合はnamed.confで以下のように設定します。

zone "flets" {
	type forward;
	forward only;
	forwarders {
		220.210.194.67;	// ns1.flets
		220.210.194.68;	// ns2.flets
	};
};
zone "194.210.220.in-addr.arpa" {
	type forward;
	forward only;
	forwarders {
		220.210.194.67;
		220.210.194.68;
	};
};

220.210.194.0/25以外の逆引きの提供状況が不明なので、 さしあたりforwardするのは220.210.194.0/25だけにしておきます。 また、クラスC未満のネットブロックの逆引きを厳密にforwardするのは困難ですので、 近似的にクラスC単位で設定することにします。

これで、ホスト名解決と逆引きが可能になります。

$ host ns1.flets
www.flets has address 220.210.194.67

$ host www.flets
www.flets has address 220.210.194.109

$ host wm9.flets
wm9.flets has address 220.210.195.10

$ host 220.210.194.67
67.194.210.220.in-addr.arpa domain name pointer ns1.flets.

$ host 220.210.194.69
69.194.210.220.in-addr.arpa domain name pointer www.flets.

www.fletsの正引きと逆引きは、以前は一致していたのですが、どういうわけか現在は一致していません。 他にも、正引きが変更になったのに逆引きがそのままになっているものがいくつかあります。

なお、BINDをnamed -uで一般ユーザー権限で動かしている場合、一つ問題があります。

BINDは、定期的にネットワークインタフェースを調べ、 インタフェースが増えた場合はそのインタフェースで待ち受けのためにbind(2)しようとします。 このとき、普通は特権ポートであるポート53を使おうとしますので、 一般ユーザー権限で実行していると失敗し、ログにエラーを残します。

今回のように複数のPPP接続を行う場合、tun1はBINDの起動後に接続しますので、 上記の問題に該当し、"creating IPv4 interface tun1 failed"というエラーが延々とログにたまることになります。 これはあまり気分がよくないですし、フレッツスクウェア網にDNSを公開しても意味はないので、 named.confで以下のように設定してbindしないようにしておきます。

options {
		:
		:
		:
	listen-on {
		!220.216.128.0/17;
		any;
	};
		:
		:
		:
};

ここで指定するネットブロックは、tun1に割り当てられるネットブロックです。 ifconfigとwhoisで調べてください。 たとえば当方では、上記ifconfigの出力例に示したように、220.216.199.15が割り当てられており、 これをwhoisで検索すると ネットブロックは220.216.128.0/17であることがわかります。 ただし、割り当てられるネットブロックは変更になる場合がありますので、 ときどき設定を見直すようにしてください。

BINDをroot権限で動かしている場合は、上記の問題はありません。

また、sendmailを使っている場合にも、 同様に"gethostbyaddr(xxx.xxx.xxx.xxx) failed"というエラーログが残る問題があります。 sendmailは、自ホスト名を知るため、 起動時に各ネットワークインタフェースのIPアドレスの逆引きを試みますが、 tun1に割り当てられるアドレスは逆引きが設定されていないためです (フレッツスクウェア網内ネームサーバー・インターネット側ネームサーバーのどちらにも)。 これについても必要に応じて対処してください。

接続の自動化

うまく動くことが確認できたら、OSの起動時に自動的に接続するようにしてみましょう。 通常の設定方法(rc.confに記述)はメインのISPへの接続に使うことにし、 フレッツスクウェアの接続は別途/usr/local/etc/rc.d/に以下のようなスクリプトを置いて行うことにします。

#! /bin/sh
ENTRY=square
PORT=/var/run/square
case "$1" in
start)
	/usr/sbin/ppp -ddial -unit1 $ENTRY > /dev/null && echo -n " PPP"
	;;
stop)
	/usr/sbin/pppctl $PORT quit all
	;;
restart)
	/usr/sbin/pppctl $PORT close
	;;
*)
	echo "Usage: `basename $0` {start|stop|restart}" >&2
	exit 64
	;;
esac
exit 0

これをたとえば/usr/local/etc/rc.d/ppp.shなどとして置いておくと、 起動時に自動で実行され、PPPoE接続を行います。

ちなみに、rc.confは以下のようになります。

ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="-unit0 isp"
gateway_enable="YES"

マルチホームクライアントの設定

WANがフレッツと他回線のマルチホームになっていて、それぞれにルーターがあり、 LAN内のクライアント機のデフォルトルーターが他回線側である場合、 クライアントからフレッツスクウェアにアクセスするには、 フレッツスクウェア網との通信をフレッツ側ルーターにルーティングするよう、 クライアント側で手動でルーティング設定する必要があります。

Windowsの場合はコマンドプロンプトで以下のように実行します (フレッツ側ルーターのLAN側プライベートアドレスを192.168.0.3とします)。

route -p add 220.210.194.0   mask 255.255.255.128 192.168.0.3
route -p add 220.210.195.0   mask 255.255.255.192 192.168.0.3
route -p add 220.210.195.64  mask 255.255.255.192 192.168.0.3
route -p add 220.210.197.128 mask 255.255.255.128 192.168.0.3
route -p add 220.210.198.0   mask 255.255.255.192 192.168.0.3
route -p add 220.210.198.128 mask 255.255.255.192 192.168.0.3
route -p add 220.210.199.0   mask 255.255.255.224 192.168.0.3
route -p add 220.210.199.128 mask 255.255.255.240 192.168.0.3
route -p add 220.210.199.160 mask 255.255.255.240 192.168.0.3

Windows 2000/XPでは、-pオプションにより、再起動しても設定が有効となります。 Windows 95/98/Meではこれが使えないので、 起動時に毎回ルーティング設定しなおす必要があります。

FreeBSDクライアントの場合はrc.confで以下のように記述します。

flets_router="192.168.0.3"
static_routes="flets1 flets2 flets3 flets4 flets5 flets6 flets7 flets8 flets9"
route_flets1="220.210.194.0/25   $flets_router"
route_flets2="220.210.195.0/26   $flets_router"
route_flets3="220.210.195.64/26  $flets_router"
route_flets4="220.210.197.128/25 $flets_router"
route_flets5="220.210.198.0/26   $flets_router"
route_flets6="220.210.198.128/26 $flets_router"
route_flets7="220.210.199.0/27   $flets_router"
route_flets8="220.210.198.128/28 $flets_router"
route_flets9="220.210.199.160/28 $flets_router"

ルーティング設定に加えて、fletsドメインのホスト名解決のために、 クライアント側でhostsファイルを使用するか、 前述のように設定したLAN内のネームサーバーを参照する必要があります。

おわりに

本稿では、フレッツADSLでFreeBSDを使って 複数のPPPoEセッションを接続する方法を紹介しました。 従来、特にサーバー運用していて常時ISPに接続する必要のある場合、 フレッツスクウェアに接続しなおすのは気が進まないものでしたが、 この方法を使うと両方に常時接続しておけますので、 フレッツスクウェアの動画コンテンツや回線速度計測などを気軽に利用できます。

最後になりますが、本稿についてコメントをお寄せくださった方々に感謝します。

参考文献

FreeBSDでのPPPoE

PPPoEマルチセッションの実例

フレッツサービス、フレッツスクウェア

ブロードバンドルーターの例


Copyright (C) 2002-2004 ITO Takayuki, All rights reserved.

伊藤隆幸のホームページ