最終更新: 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とする必要があります。
さて、複数セッション接続のための準備ですが、以下のようにします。
2セッション接続する場合は、tun0とtun1が必要です。 最近のFreeBSDではtunはcloning deviceなので、 kernel configに個数を書く必要はなく、/dev/tun*があればOKです。 通常はtun0〜3があるはずですが、足りない場合は適宜/dev/MAKEDEVを実行しておきます。
通常は、add default HISADDRと書き、PPPで接続した相手をデフォルトルーターとしますが、 同時に複数接続する場合にはこのままだとうまくいきません。 そのため、メインの接続先(ISP)をデフォルトルーターとし、 他方(フレッツスクウェア網)については個別に静的ルーティングします。
NTT東日本のフレッツスクウェア網では、2004年8月現在、 以下の11個のネットブロックのルーティングが必要となっています。
これは、routing.html Version9の場合です。 ルーティング情報は変更になることがあります。 その場合、以下の設定例や実行例を適宜読み替えてください。
また、pppを複数起動することになりますので、 他にも衝突しそうな設定(set serverなど)があれば、適宜直しておきます。
ppp.confの設定例は以下のようになります(下線部が変更箇所です)。
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 square: set authname guest@flets set authkey guest add 220.210.194.0/25 HISADDR add 220.210.195.0/26 HISADDR add 220.210.195.64/26 HISADDR add 220.210.197.128/25 HISADDR add 220.210.198.0/26 HISADDR add 220.210.198.128/26 HISADDR add 220.210.199.0/27 HISADDR add 220.210.199.128/28 HISADDR add 220.210.199.160/28 HISADDR set server /var/run/square "" 0177 isp: set authname yourname@yourisp set authkey yourpassword add default HISADDR set server /var/run/isp "" 0177
フレッツスクウェア網との通信を許可するよう設定します。 ただし、あらゆるIPトラフィックを許可してしまうと、 悪意のある利用者から不正アクセスされるおそれがあり、好ましくありません 。 ここでは、ipfwで外向きTCP接続・DNS・traceroute・ICMPを通す例を示します (簡単のため、220.210.194.0/25についてのみ示します)。
# 外向きTCPとその応答を許可 add allow tcp from any to 220.210.194.0/25 out xmit tun1 add allow tcp from 220.210.194.0/25 to any in recv tun1 established # tracerouteとDNS要求を許可 add allow udp from any to 220.210.194.0/25 33434-33499,domain out xmit tun1 # DNS応答を許可 add allow udp from 220.210.194.0/25 domain to any in recv tun1 # ICMPを許可 add allow icmp from any to any via tun1 # それ以外は禁止 add deny all from any to any via tun1
なお、自分側をanyの代わりにtun1に割り当てられるアドレス/ネットブロックにしてしまうと、 ルーターマシンからは通信できても、NATの内側のプライベートアドレスのマシンからは通信できなくなってしまいます。
さらにセキュリティを高めるためには、条件を厳しくしたり、 ppp.confのset filterを利用するなどの方法を検討してください。
まず、通常どおりメインの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で両方に接続できそうに思うかもしれませんが、これはうまくいきません。 これは単に、指定されたエントリを順に読み込んでいき、後から読んだ設定が残るだけのようです。
さて、一応つながりましたが、このままでは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に接続する必要のある場合、 フレッツスクウェアに接続しなおすのは気が進まないものでしたが、 この方法を使うと両方に常時接続しておけますので、 フレッツスクウェアの動画コンテンツや回線速度計測などを気軽に利用できます。
最後になりますが、本稿についてコメントをお寄せくださった方々に感謝します。
Copyright (C) 2002-2004 ITO Takayuki, All rights reserved.