2018/01/25追記:現在のところ、何らかの理由でシェルスクリプト内のipコマンドが「systemdから呼ばれた場合に限って」正しく動きません。サービスファイルかスクリプトそのものか、どちらかに修正が必要ですが今の私にはわからないままです。
お待たせしました、systemdなLinux向けのDS-Lite systemd-unit記事です。
トンネル掘りスクリプト
シェルスクリプトはおなじみてくろぐさんとこのスクリプトにいくらか手を入れたものを使います。
ルータではないマシンが自力でトンネルを使って(LANにIPv4パケットを投げずに)IPv4オンリーなウェブサイトを利用する想定なので、ルータにしたい人はてくろぐ記事と見比べながら不足を補ってください。
# !/bin/sh
NIC=NGNに接続したNICのデバイスネーム
REMOTE=`お使いのDNSコマンドで目指すAFTRを引いて、アドレスのみを抽出するワンライナー`
LOCAL=`ip addr show $NIC | grep 'mngtmpaddr' | awk '{print $2}' | awk -F/ '{print $1}'`
modprobe ip6_tunnel
ip -6 tunnel add dslite0 mode ip4ip6 remote $REMOTE local $LOCAL dev $NIC
ip link set dev dslite0 mtu 1500 up
sysctl -w net.ipv4.conf.$NIC.forwarding=1
ip route del default
ip route add default dev dslite0
ip route del default
ip tunnel del dslite0
スクリプト内に紛れている日本語部を適宜各自の環境に合わせたものに書き換えてご利用ください。
なお、デバイスネームをdslite0としていますが、どうも名前は重複していなければ何でも受け入れてくれるみたいです。これでは生理的にダメな方はてくろぐ記事と同じようにip6tnl1としておけば普通の名前になります。
REMOTEアドレスに関しては、念のためちゃんと名前解決してから使うようにしてあります。例えばdig(1)
やdrill(1)
が使える方がgw.transix.jpを目指すとすると(transixの場合はクエリに答えてくれるサーバが限られる点に留意の上)、dig gw.transix.jp AAAA +short | sed -n '1p'
といった感じで。systemd-resolved(8)
をお使いの方であればsystemd-resolve --type=AAAA gw.transix.jp | grep AAAA | awk '{print $4}' | sed -n '1p'
などとするとよいかと思います。
本当は、得られた複数のクエリ結果から一つを抽出する段でどれを抽出するかをランダムにできるとより良さそうですが、シェルスクリプトがド素人の私には一目でそれとわかるような書き方が全く分からず、とりま改行区切りで得られた結果からsedで先頭行を抽出した格好です。
systemdユニットファイル
それから、systemdのユニットファイルはこんな感じになります。
[Unit]
Description=RFC6333 4in6 tunnel
After=network-online.target
[Service]
ExecStart=/(スクリプトを置いた場所)/setup-dslite.sh
ExecStop=/(上に同じ)/destroy-dslite.sh
Type=oneshot
User=root
[Install]
WantedBy=multi-user.target
Descriptionはお好みの説明書きを入れるとジャーナルに「今~を走らせたよ」って出てくるものなので、ジャーナルが見づらくならない程度の長さで書きましょう。
このユニットファイルを/etc/systemd/system
に置いて、# systemctl enable ds-lite.service
すれば次回起動時から自動で掘ってもらえるようになります。
スクリプトに実行権限を与え忘れドボンするケースに気を付けましょう。
こうして、うちではメインマシンからIPv4パケットが出なくなりました。
あと手元の対応機ではMac(Sierra)が残りなんですが、一見開通したようでブラウザ以外のソフトウェアではうまくつながらなくなってしまうという症状によりいったん諦めてます。High Sierraにしたらもう一回挑戦しようかな。
あ、Gentooもありました……Gentooは、DS-Liteのためのカーネルコンフィグがよくわからずにいます。CONFIG_IPV6_TUNNELを有効にしてありはするのですが、どうもそれだけでは不足な模様。
ではでは。
参考文献
http://techlog.iij.ad.jp/contents/dslite-raspi
http://shellscript.sunone.me/filter_sed.html#特定の行のみを表示する
systemd.unit(5)のmanpage