とうとう、アジア圏で、IPv4が切れたそうな
じゃ、IPv6で行こう
というこで、さくっと、IPv6に対応してみます。
IPv6を使うには、IPv6プロバイダーと契約しようなんて、面倒すぎてムリー
世界には、色々なサービスがございまして、Freenet6というサイトがございまして、ありがたいことに、グローバルIPv6をいっぱいいただけます。
では、さくっと、FreeBSDをルーターにして、LANをIPv6化してみましょう。
その前に、pfctlが使用できる環境にしておいて下さい。
※pfctl無しだと、Firewall無しで、グローバルにサーバをむき出しにすることになりますよ。
とりあえず、Freenet6にて、登録してきて下さい。
では、このサイトへのIPv6トンネリングIPv4を通しましょう。
portsから、net/gateway6 をインストールして下さい。
手順は、わかりますよね。
正常にインスコできたら、/usr/local/etc/gw6c.confがあるはずなので、編集します。
編集するのは、以下の項目です
userid=[もらったユーザID]
passwd=[登録したパスワード]
server=authenticated.freenet6.net
auth_method=any
host_type=router
if_prefix=[LANのデバイス] <- ifconfigで調べてね
keepalive=no
dns_server=ns1.freenet6.net:fbsd.example.info
if_tunnel_v6v4=gif0
if_tunnel_v6udpv4=tun1
if_tunnel_v4v6=gif0
こんなもんでしょう。
次に、接続後のスクリプトを編集します。
下のパスに、スクリプトがあります。
/usr/local/share/gateway6
freebsd.shを編集します。
#Woo's Special
#Destroy Last Interface
if [ X"`cat /var/run/gateway6if.txt`" != X"$TSP_TUNNEL_INTERFACE" ] ; then
$ifconfig `cat /var/run/gateway6if.txt` destroy
echo $TSP_TUNNEL_INTERFACE > /var/run/gateway6if.txt
fi
#################################
# Run tunnel destruction script.
#################################
Run Tunnel・・・・のコメントの前に、下線のスクリプトを埋め込みます。
次に、Firewallを入れ込みます。
#Firewall
sed -e s/TSP_TUNNEL_INTERFACE/$TSP_TUNNEL_INTERFACE/g /usr/local/share/gateway6/pf.conf >
/usr/local/share/gateway6/pfm.conf
pfctl -f /usr/local/share/gateway6/pfm.conf
pfctl -e
Display 1 '--- End of configuration script. ---'
exit 0
Display 1と書いてある前に、下線のスクリプトを埋め込みます。
以上でfreebsd.shの編集を終わります。
さらに、Firewallの設定ファイルを作成します。
面倒なので、まるごと書きます。
pf.confを新規作成して、以下の内容で作って下さい。
#interface
gatewayif = TSP_TUNNEL_INTERFACE
#macro
tcp6_services = "{ ssh, http, https }"
udp6_services = "{ }"
icmp6_types = "{ echoreq, unreach, timex, toobig, neighbrsol, neighbradv }"
v6_priv_nets = "{ fec0::/10, ::ffff:0.0.0.0/96, ::224.0.0.0/100, ::127.0.0.0/104, ::0.0.0.0/104, ::255.0.0.0/104, ::0.0.0.0/96 }"
# options
set block-policy return
# scrub
scrub in all
scrub out all random-id max-mss 1414
# Block interface
block in on $gatewayif proto tcp all
block in on $gatewayif proto udp all
# IPv6 TCP outer to inner
pass in quick on $gatewayif inet6 proto tcp from any to any port $tcp6_services flags S/SA keep state
pass out quick on $gatewayif inet6 proto tcp all flags S/SA keep state
pass out quick on $gatewayif inet6 proto udp all keep state
#pass in quick on $gatewayif inet6 proto udp from any to any port $udp6_services flags S/S A keep state
# ICMP6
pass in inet6 proto icmp6 all icmp6-type $icmp6_types keep state
さーてと、次に/etc/rc.confを編集します。
#IPv6
gateway6_enable="YES"
ipv6_enable="YES"
ipv6_gateway_enable="YES"
ipv6_network_interfaces="auto"
ipv6_defaultrouter="NO"
rtadvd_enable="YES"
rtadvd_interfaces="re0 wlan0" <-ここは、自身の環境に合わせてね
以上で、IPv6に旅立てます。
とりあえず、IPv6 Googleに行ってみて下さい。
IPv6 2chとかもありますよ
あっ
WindowsXPの人は、 コマンドプロンプトから、 ipv6 install して下さいね。
さて、これで接続できるようになったのですが、問題があります。
実は、keepaliveを行っていません。 つまり、なんらかの原因で切断されてしまった場合、それを補う手立てをおこなっていないのです。
本来なら、gateway6にkeepaliveをさせたいとこなのですが、どうも不安定のようです。
ですので、自分で接続状態をチェックして、問題があるようなら再接続する方法をとります。
perlにて、スクリプトを組みましょう。
vi /usr/local/sbin/gw6keepalive
#!/usr/local/bin/perl -w
$host=$ARGV[0];
$pidfile=$ARGV[1];
open(OUT, ">$pidfile");
print OUT $$;
close(OUT);
&run;
sub action{
my $ping6res = `ping6 -c 9 -n -q $host`;
if( $ping6res =~/[1-9] packets received/ ){
print "$host is running.\n";
} else {
my $result=`/usr/local/etc/rc.d/gateway6 restart`;
}
}
sub run {
while(1) {
# SLEEP_INTERVAL
&action;
sleep(300);
}
}
1;
実行権を与えます。
chmod a+x /usr/local/sbin/gw6keepalive
次に、起動スクリプトを組みます。
vi /usr/local/etc/rc.d/gwkeepalive
#!/bin/sh
#
#
# PROVIDE: gw6keepalive
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable gw6keepalive:
#
# gw6keepalive_enable="YES"
#
. /etc/rc.subr
name=gw6keepalive
rcvar=${name}_enable
start_cmd=gw6keepalive_start
stop_cmd=gw6keepalive_stop
pidfile=/var/run/gw6keepalive.pid
load_rc_config ${name}
: ${gw6keepalive_enable="NO"}
: ${gw6keepalive_flags="v6.host"}
gw6keepalive_start()
{
if test -f $pidfile; then
echo Already running gwkeepalive
else
echo Starting gwkeepalive
exec /usr/local/sbin/gw6keepalive $gw6keepalive_flags $pidfile > /dev/null &
RETVAL=$?
exit $RETVAL
fi
}
gw6keepalive_stop()
{
if test -f $pidfile; then
echo Stop gwkeepalive
kill `cat $pidfile`
rm $pidfile
else
echo Not running gwkeepalive
fi
}
run_rc_command "$1"
実行権を与えます。
chmod a+x /usr/local/etc/rc.d/gwkeepalive
最後に、起動宣言を行います。
rc.confに、以下を追加して下さい。
gw6keepalive_enable="YES"
gw6keepalive_flags="どこかのIPv6ホスト"
これで、再起動すればOKです。
追記
IPv6に接続できるようになったのは、良いですけど、IPv4よりIPv6を優先的に接続します。
IPv6接続をトンネリングにて接続している場合、IPv4より回線速度が大変遅くなってしまいます。
完全にネイティブにIPv6接続できるようになるまでは、IPv4優先としておいた方が無難です。
Windowsにて、IPv4を優先とするコマンドを管理者権限でコマンドプロンプトより設定しましょう。
IPv4優先
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4
リセットする場合は、以下です
netsh interface ipv6 reset
IPv6優先
netsh interface ipv6 set prefixpolicy ::1/128 50 0
netsh interface ipv6 set prefixpolicy ::/0 40 1
netsh interface ipv6 set prefixpolicy 2002::/16 30 2
netsh interface ipv6 set prefixpolicy ::/96 20 3
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 10 4
確認方法
netsh interface ipv6 show prefixpolicies