PC : フレッツ ADSL から Bフレッツ(光ファイバー)への移行のまとめです。
目的は、両方の接続を保つことです。
具体的には、ISP 2つから IPv4 address 固定を /32 でそれぞれ借りて、さらに IPv6 を /48 で それぞれから借りる multihomed の設定をします。
IPv4 address は、2つの ISP ともに PPPoE を利用します。 IPv6 address は、2つの ISP ともに IPv6 over IPv4 の tunnel を gif で張ります。
主回線を Bフレッツ、副回線を ADSL にします。副回線は受け答えをするだけですけど。
PPPoE に ports/net/mpd4 を、packet の forwarding に ipfw、nat に natd を 使います。
A. PPPoE の設定
とりあえず、両方を単独で設定し、それぞれ単独で接続できることを確認します。 んで、主回線にする Bフレッツの方にのみ「set iface route default」の行を 入れます。
/usr/local/etc/mpd4/mpd.conf
startup: # Do nothing. default: load fiber load adsl fiber: new -i ng0 fiber PPPoE0 set iface route default set auth authname xxxx@xxxx.jp load common adsl: new -i ng1 adsl PPPoE1 set auth authname yyyy@yyyy.ne.jp set iface route 210.138.bbb.bbb/32 load common common: set iface addrs 1.1.1.1 2.2.2.2 set iface enable tcpmssfix set bundle disable multilink set iface disable on-demand set iface idle 0 set link no acfcomp protocomp set link disable pap chap set link accept chap set link mtu 1454 set link mru 1454 set ipcp yes vjcomp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 open
「set iface route 210.138.bbb.bbb/32」の説明は、後回しです。
対応する、mpd.links と mpd.secret も作成します。
/usr/local/etc/mpd4/mpd.links
PPPoE0: set link type pppoe set pppoe iface em0 set pppoe service "fiber" set pppoe disable incoming set pppoe enable originate PPPoE1: set link type pppoe set pppoe iface rl0 set pppoe service "adsl" set pppoe disable incoming set pppoe enable originate
/usr/local/etc/mpd4/mpd.secret の中身は、難しくないので省きます。
B. ipfw の設定
a. fwd
副回線宛に来た packet の返事が主回線に行かないよう、fwd で副回線に投げる 設定です。
/etc/rc.firewall.local
${fwcmd} add fwd ${ipa_of_isp_adsl} ip from ${oip_of_adsl} to not ${oip_of_fiber}
この行を挿入する場所は、natd の直前です。
フレッツADSL の IPv4 address から投げる packet が Bフレッツの IPv4 address 宛で ない場合は、フレッツADSL の ISP に向かって投げます。
Cf. http://www.jp.freebsd.org/QandA/HTML/2341.html
b. divert
次に、主回線の natd の直後に副回線の natd 用の行も作ります。 port は空いていれば何番でもいいので、natd(8868)の1つ後にしました。 /etc/rc.firewall.local
${fwcmd} add divert natd ip from any to any via ${oif_of_fiber} ${fwcmd} add divert 8869 ip from any to any via ${oif_of_adsl}
c. その他
その他、主副両回線用に書き換えます。
1. from と to に主副両方の IP address を入れる。
from 210.138.xxx.xxx,210.138.yyy.yyy to 210.138.xxx.yyy,210.138.yyy.yyy
"," か table を使えばいい。
見づらいが確認しやすいので、","にした。
2. via には、一度に2つ以上の if を指定できない。
"via ng0,ng1" は、「ng0,ng1」という1つの interface と理解される。
2行ずつ作るしかない。
C. natd の設定
divert 8869 用の natd を走らせなければいけません。 これをしないと、副回線から受け取った packet がどっかに行きます。
/usr/local/etc/rc.d/natd.sh
#!/bin/sh PATH=/bin:/usr/bin IF=ng1 PID=/var/run/natd.${IF}.pid case "$1" in start) env - /usr/sbin/rtprio 5 /sbin/natd -l -m -s -P "${PID}" -n ${IF} -p 8869 ;; stop) kill -TERM `cat ${PID}` ;; *) ;; esac
場所は本来、/usr/local/etc/rc.d とは違うかと思いますが、気にしないことにします。
D. ip6fw の設定
from と to、および、via は ipfw に同じです。 他にすることはありません。
E. IPv6 over IPv4
2つとも、普通に設定します。 /etc/rc.conf
gif_interfaces="gif0 gif1" gifconfig_gif0="210.138.xxx.xxx 210.138.aaa.aaa" gifconfig_gif1="210.138.yyy.yyy 210.138.bbb.bbb"
んで、gif1 用の packet は、そのままだと $oip_of_fiber から出ていこうとするので、 routing の設定をします。
# route add ${gif1 の tunnel 先 = 210.138.bbb.bbb} ${ipa_of_isp_adsl}
if 指定でも可能です。
# route add ${gif1 の tunnel 先 = 210.138.bbb.bbb} -interface ng1
"-interface gif1" ではなく、"-interface ng1" になることに注意です。
ping6 で確認します。
% ping6 -I gif0 ff02::1 PING6(56=40+8+8 bytes) fe80::20e:cff:feab:1d6e%gif0 --> ff02::1 16 bytes from fe80::20e:cff:feab:1d6e%gif0, icmp_seq=0 hlim=64 time=0.567 ms 16 bytes from fe80::2e0:4dff:fe0a:418%gif0, icmp_seq=0 hlim=64 time=15.918 ms(DUP!) ^C --- ff02::1 ping6 statistics --- 1 packets transmitted, 1 packets received, +1 duplicates, 0.0% packet loss round-trip min/avg/max/std-dev = 0.567/8.242/15.918/7.675 ms % ping6 -I gif1 ff02::1 PING6(56=40+8+8 bytes) fe80::20e:cff:feab:1d6e%gif1 --> ff02::1 16 bytes from fe80::20e:cff:feab:1d6e%gif1, icmp_seq=0 hlim=64 time=0.508 ms 16 bytes from fe80::2e0:4dff:fe0a:420%gif1, icmp_seq=0 hlim=64 time=24.661 ms(DUP!) ^C --- ff02::1 ping6 statistics --- 1 packets transmitted, 1 packets received, +1 duplicates, 0.0% packet loss round-trip min/avg/max/std-dev = 0.508/12.585/24.661/12.077 ms %
両方とも、tunnel 先から返事があることを確認します。
この設定は、mpd.conf でできます。 「set iface route 210.138.bbb.bbb/32」がそれです。 なので、「route add 〜」をどこかに設定する必要はありません。
終わりです。
F. おまけ
a. set_number
ないよりはマシですが、いまいちです。
b. divert natd
${fwcmd} add divert natd ipv4 from any to any via ng0
と 「ipv4」限定にしないと、IPv6 packet もひっかかってしまいます。
c. /boot/loader.conf : /etc/sysctl.conf
echo net.inet.ip.fw.one_pass=0 >> /etc/sysctl.conf
これは、/boot/loader.conf に書いても意味がないようです。
d. flets square ipfw で if の行がもう1行ずつ増えて、natd ももう1つ走らせる必要あり、 面倒になったので、やめました。