2007年09月30日(日)


multihomed まとめ

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つ走らせる必要あり、 面倒になったので、やめました。



generated by makediary-2.11