SEILでつくる、“最強”ご家庭用ルータ ~ひかり電話無しプラン~

2021年12月02日 木曜日


【この記事を書いた人】
くまさか

セキュリティオペレーションセンター と セキュリティ情報統括室 に所属。システム開発者(極) を目指すプログラマ としての活動と、セキュリティアナリストとして活動をしています。うさぎさんのぬいぐるみが相棒

「SEILでつくる、“最強”ご家庭用ルータ ~ひかり電話無しプラン~」のイメージ

IIJ 2021 TECHアドベントカレンダー 12/2(木)の記事です】

くまさかです。

弊社では、ご家庭の情シス主幹として活動している方がそれなりにいます。かくいう私もその一人です。
OSアップデートから、プリンタの設定など、ワンオペなのでやることは多岐にわたります。
そのような家務の中には、もちろんネットワーク運用も含まれます。
弊家のネットワーク運用では、ゲートウェイルータとして、IIJ製のルータであるSEIL を採用し、細かな経路設計なども実現できています。

今回は、そのようなSEILの経路設計から、
ひかり電話無し契約時のIPoE+DS-Lite/PPPoE な設定例を紹介させていただきます。

IPoE+DS-LiteとPPPoEの併用する目的

ご存知の方も多いと思いますが、現在のNTT網では、IPoEとPPPoEという二つの接続方式が選択可能です。
現在のPPPoEでは、NTT網内の終端機器に収容される顧客のバランスによって、安定したスループットが出ないことがあります。
対して、現在のIPoEでは、そのようなバランスの偏りが起きにくい構成となっており、PPPoEより安定したスループットが出せます。
IPoEにするとインターネットが速くなるというPOPを家電量販店等で見かけますが、このような理由からきているのです。

弊家でも、PPPoEの詰まりを感じることはあったため、IPoEへの切り替えを検討しておりましたが、これからご紹介する課題に直面しました。
そのため、IPoEとPPPoEを併用し、IPoEで課題となる点をPPPoE側を活用することで回避する構成としています。

一般のご家庭の方が困るであろう点、IPv4アドレスがない

IPoEでは、グローバルIPv6アドレスがルータに付与され、IPv4アドレスが付与されません。
そのため、IPv4しか対応していないWebサービスが利用できない状況となります。
これらの解決策として、IPv4 over IPv6 という技術があります。
ざっくりと説明すると、自宅のルータでIPv4の通信をIPv6で包み込み、通信事業者に設置されたゲートウェイ経由で、IPv4なWebサービスを利用できる技術です。
IPv4をIPv6で包み込む通信が可能となる規格はいくつかあり、IIJmioひかり IPoEオプションまたは mio FiberAccess/NF では、IIJグループのマルチフィード社が提供するtransixというサービスが採用した、DS-Liteを利用することができます。

多くの通信事業者で一般向けに提供しているIPoEサービスでは、IPv4 over IPv6の接続を合わせて利用できるようなサービスが多い印象です。
これは、IPv4なインターネットサービスに接続できないと、普段の利用に支障が出るほど、まだまだIPv4アドレスによる接続が必要な状況だからです。
例えば、IPv4アドレスによる接続が行えないと、大手動画サービスは見れるが、大手SNSが利用できないような状況がありえます。

もちろん、今回紹介する設定例ではIPv4通信も行えるように、DS-Liteを利用する構成としています。
そのため、タイトルは、IPoE+DS-Liteと表記しています。

逸般の誤家庭の方が困るであろう点、グローバルIPv4アドレスがない

さて、読者の方々には、逸般の誤家庭の方や、これから誤自宅でサーバを公開したい方がいるかもしれません。
先ほど紹介したtransixの環境では、自宅からインターネット上のIPv4サービスを利用することはできますが、インターネットに自宅のIPv4サービスを公開することができません。
これは、transixにぶら下がる複数の利用者がtransixのグローバルIPv4アドレスを共有する、NAPT構成になっているためです。

弊家の場合…。

外出先からのリモートアクセス用にグローバルIPv4アドレスによるサーバ公開を行いたい要件があります。

実は、transixでは、グローバルIPv4アドレスを1対1で紐づけるサービスを契約できれば、インターネットに自宅のIPv4サービスを公開することが可能です。しかし、弊家で利用している個人向けのIIJmioブランドでは、提供されていません。
そのため、サーバをグローバルIPv4アドレスで公開したい場合、PPPoEでグローバルIPv4アドレスの終端を行う選択肢が考えられてきます。

構成としては、グローバルIPv4アドレスは、PPPoE。グローバルIPv6アドレスは、IPoEの構成にすれば、アドレスの付与問題は解決します。
しかし、私がリモートアクセスしたいために、妻が利用するSNSの通信をより安定させられないのは、気が引けます。
そのため、弊家では、インターネット上のサービスを利用する場合は、IPoE+DS-Liteにて、IPv4, IPv6 を通し、
インターネット経由で自宅へ接続する場合は、PPPoEにてIPv4 という形で、経路を分けた構成としました。

経路設計概要図

では、具体的に弊家ルータのIPoEとPPPoE設定を紹介していきます。

IPoE+DS-Liteの設定

まずは、自宅からインターネットを利用するための経路、IPoE+DS-Liteの紹介です。

ひかり電話有無による設定差

突然ですが、皆さんのご自宅に、固定電話はございますか?
最近、契約などで記入する電話番号欄も携帯電話で問題がないケースも出てきているので、固定電話がなくても困らない時代になったと感じます。
私自身も、持つ理由が見当たらず、ありません。

さて、この固定電話がないことによって、グローバルIPv6アドレスの取得方法を少し悩むことになりました。
というのも、私が当時参考(というかコピペ)にした、弊社から公開されている参考記事がひかり電話有りのものだったからです。

実は、光回線で契約するひかり電話の申し込み有無によって、グローバルIPv6アドレスの付与方法が変化します。
そのため、ひかり電話有りの設定をそのまま利用すると、ひかり電話無しの弊家では、グローバルIPv6アドレスがうまく取得/再配布できませんでした。

ざっくり説明すると、
ひかり電話はひかり電話自身にIPv6を割り当てるため、ひかり電話の範囲を含む、大きな範囲をNTT網が渡してくれます。
対して、ひかり電話が無い場合は、ひかり電話へ割り当てる範囲が不要なため、より狭い範囲をNTT網から受け取れるという差があります。

もう少し詳しく知りたい方は、'DHCPv6-PD''RA' というキーワードを調べたり、
弊社イベントの IIJ Technical Week 2011 の “フレッツにおけるIPv6接続について” で紹介されている資料が参考になると思います。
なお、上記資料の値は、NGN網の仕様変更により、本記事執筆時点と異なります。本記事執筆時点では、ひかり電話有りの場合に網から付与されるprefixは、/56。受け取ったHGWが/60をLANに委託します。

ひかり電話無しの設定は必要か?

先ほど取り上げた、SEIL で NGN IPv6 ネイティブ (IPoE) 接続を試す の記事中には、以下の記載があります。

「ただ、正直に言ってしまうとこの構成でルータを挟む構成にする意味はあまり無い、と言えるかもしれません」
(項目: “IPoE方式 について > ひかり電話無しの場合” から抜粋)

これは、ひかり電話無しの場合、IPoE接続で、グローバルIPv6アドレスを受け取ることに限っては、ONU配下に割り当てたい機器を直接接続すれば良いため、ルータを挟む構成は意味がないということを説明しているように思います。

しかし、transixを利用し、IPv4通信も行いたい要件が付け加えられると、少し状況が変わってきます。
IPv4をIPv6で包むDS-Lite規格のようなものは、インターネットを利用する全ての機器が対応しているわけではありません。
そのため、IPoE+DS-Liteを考えた場合、ひかり電話無しであってもIPv4通信のために、間に通信規格に対応したルータがあることが重要です。

なお、参照している記事は、あくまでIPoEを試す記事です。IPoEのみを試す状況だと、中継機器が増える=障害ポイントが増えるだけなので、ルータを挟む意味がありません。
あくまで、IPoE+DS-Lite だと意味を見出せてくると言う話です。

考えられる構成

では、ひかり電話無しのIPoE+DS-Liteを少し整理します。

  • transixを利用する場合、間に対応するルータが必要
  • ひかり電話無しの場合、間にルータがなくてもIPoEでグローバルIPv6アドレスを受け取れる

それぞれの要件をそのまま当てはめると、このような図になります。

未整理の物理設計

しかしこれでは、通信機器にNicが2本必要になってしまい、少し複雑です。
家務には多くの時間をかけることが難しいので、もう少しシンプルな構成としておきたいです。

以下のように、Nicは1本にし、IPv4もIPv6も同じ物理経路を通す構成にするとシンプルです。

整理された物理設計

IPv6に関しては、ルータには何もさせないがルータ上を通過させるブリッジ機能を活用します。

ひかり電話無しの設定

では、実際に、SEIL/x86 で DS-Lite で紹介されている設定から、
ひかり電話無しで考えられる変更点を紹介します。

といっても、変更点は至ってシンプルです。
先ほど紹介した、ブリッジ機能を活用し、IPv6パケットを転送するだけです。

bridge enable
bridge ip-bridging off
bridge ipv6-bridging on

加えて、ひかり電話有りの時に必要だった、大きな範囲から切り出し再配布する設定を無効化します。

#dhcp6 client prefix-delegation subnet lan0 sla-id 0x0 enable #切り出しを無効化するコマンドでこの行を消す
rtadvd disable #応答/配布を無効化するコマンド

なお、SEIL/X1 では、機器仕様で、本構成時にNTT網側のインタフェースをlan0にする必要があるので、lan0とlan1を入れ替えます。

interface lan0 add router-advertisement
interface lan1 add 192.168.0.1/24
dhcp6 client interface lan0

以上が、ひかり電話無し時の変更点です。

PPPoEの設定

続けて、インターネットから自宅へ接続するために、グローバルIPv4アドレスを終端する、PPPoEの設定を紹介します。

PPPoEについては、以下を参考に設定を入れるだけなので、小難しいことはありません。
PPPoE接続の設定手順(IPv4アドレス自動取得)

ただし、PPPoEの設定だけを行うと、妻のSNSの通信と、私のサーバの通信を分けることはできません。
そのため、加えて、SEILのポリシーベースルーティングという機能を活用します。
ポリシーベースルーティング機能を用いる事で、特定の条件に一致したら経路を変えることが可能です。
今回は、送信元IPアドレスが特定の値(10.255.255.1) であった場合に限り、PPPoE側を利用するといった設定としています。

filter add rt_pppoe01 interface lan1 direction in action pass src 10.255.255.0/28 dst self state disable logging off enable
filter add rt_pppoe02 interface lan1 direction in action forward pppoe0 src 10.255.255.1/32 logging off enable

ポリシーベースルーティング論理設計

本設定により、妻の利用するSNSなどの通信はデフォルト経路であるIPoE+DS-Liteを通し、私のサーバが送信元であった場合は、PPPoEを利用するといった細かい制御を行います。
これにより、大きな目的であった、私がリモートアクセスしたいために、妻が利用するSNSの通信を不安定にすることは無くす構成を実現しています。

最後に

以上が、弊家のひかり電話無し契約時のIPoE+DS-Lite/PPPoE なSEIL設定例の紹介となります。
部分部分の紹介となったため、本記事の下部に付録として、一部を除く一連のConfigを記載しておきます。

さて、読者の中に、IIJの活動を2018/03 頃からウォッチしてくださっている方はいらっしゃいますでしょうか?
もしいらっしゃいましたら、本記事のタイトルは、少し既視感があったかもしれません。

実は、2018/03/14に開催したIIJ Technical NIGHT Vol.4 にて、近い話が紹介されております。
IIJ Technical NIGHT Vol.4 SEILでつくる、”最強”ご家庭用ルータ

このように、私以外にも弊社には、休日にもSEILいじり、楽しむ社員がちらほら在籍しているのです。
また、SEIL以外でももちろん、業務内外問わずにエンジニアとして面白いことをしている社員が弊社には沢山おります。
今年のアドベントカレンダーでも引き続き、そのような弊社エンジニアから様々な話が続きます。
明日以降のIIJ アドベントカレンダー2021も是非よろしくお願いします。


そういえば、SEILはどこで手に入るの?

SEILは、個人向けには、仮想環境で利用できるソフトウェアルータのSEIL/x86ライセンスを販売しております。
https://www.amazon.co.jp/dp/B083W8HR8G
ポリシーベースルーティングのような、痒い所に手が届く機能もあり、色々な遊び方ができます。

なお、今回紹介したSEILの設定は、Fujiと呼ばれるシリーズの設定です。
販売中のソフトウェアルータ、SEIL/x86 Ayameでは、書式が異なります。
もし本記事の書式をAyame用にみてみたい場合は、コンフィグ変換ツール の用意がありますので、こちらをご利用ください。

ちなみに、もし、どうしてもハードウェアなSEILが欲しい方は、ぷらっとオンラインの販売ページから購入できます。

付録

弊家SEILの設定(一部除外)です。

hostname "rt01"
timezone "Japan"
environment login-timer 300
option ipv6 avoid-path-mtu-discovery off
option ipv6 unicast-rpf strict logging on
.......
ppp add PPP_oe keepalive 30 ipcp enable ipcp-address on ipcp-dns on ipv6cp disable authentication-method auto identifier <myid> passphrase <mypsk> tcp-mss auto tcp-mss6 none
.......
interface lan0 media auto
interface lan0 add router-advertisement
interface lan1 media auto
interface lan1 queue normal
interface lan1 add 10.255.255.14/28
.......
interface pppoe0 over lan0
interface pppoe0 ppp-configuration PPP_oe
interface tunnel0 tunnel dslite gw.transix.jp
interface tunnel0 mtu 1500
interface tunnel0 unnumbered
bridge enable
bridge ip-bridging off
bridge ipv6-bridging on
route add 192.168.255.0/24 10.255.255.13
route add default pppoe0 distance 2
route add default tunnel0 distance 1
route6 add default router-advertisement interface lan0
filter add i_pat_ssh01 interface pppoe0 direction in action pass protocol tcp srcport 0-65535 dst 10.255.255.1/32 dstport 22 state disable logging off enable
filter add o_pat_ssh01 interface pppoe0 direction out action pass protocol tcp-established src 10.255.255.1/32 srcport 22 dstport 0-65535 state disable logging off enable
filter add i_pat_e_ssh01 interface pppoe0 direction in action pass protocol tcp-established srcport 22 dst 10.255.255.1/32 dstport 0-65535 state disable logging off enable
filter add o_pat_e_ssh01 interface pppoe0 direction out action pass protocol tcp src 10.255.255.1/32 srcport 0-65535 dstport 22 state disable logging off enable
......
filter add ALLBLOCK_pppoe interface pppoe0 direction in/out action block state disable logging off enable
filter add i_dslite_01 interface tunnel0 label "wifi_seg" direction in action pass protocol tcp-established srcport 0-65535 dst 192.168.255.0/24 dstport 0-65535 state disable logging off enable
filter add o_dslite_01 interface tunnel0 label "wifi_seg" direction out action pass protocol tcp src 192.168.255.0/24 srcport 0-65535 dstport 0-65535 state disable logging off enable
filter add i_dslite_02 interface tunnel0 label "wifi_seg" direction in action pass protocol udp srcport 0-65535 dst 192.168.255.0/24 dstport 0-65535 state disable logging off enable
filter add o_dslite_02 interface tunnel0 label "wifi_seg" direction out action pass protocol udp src 192.168.255.0/24 srcport 0-65535 dstport 0-65535 state disable logging off enable
......
filter add ALLBLOCK_tunnel0 interface tunnel0 direction in/out action block state disable logging off enable
filter add rt_pppoe01 interface lan1 direction in action pass src 10.255.255.0/28 dst self state disable logging off enable
filter add rt_pppoe02 interface lan1 direction in action forward pppoe0 src 10.255.255.1/32 logging off enable
filter add i_wifi_01 interface lan1 direction in action pass src 192.168.255.0/24 state disable logging off enable
filter add o_wifi_01 interface lan1 direction out action pass dst 192.168.255.0/24 state disable logging off enable
filter add i_pat_ssh01_l1 interface lan1 direction in action pass protocol tcp-established src 10.255.255.1/32 srcport 22 dstport 0-65535 state disable logging off enable
filter add o_pat_ssh01_l1 interface lan1 direction out action pass protocol tcp srcport 0-65535 dst 10.255.255.1/32 dstport 22 state disable logging off enable
filter add i_pat_e_ssh01_l1 interface lan1 direction in action pass protocol tcp src 10.255.255.1/32 srcport 0-65535 dstport 22 state disable logging off enable
filter add o_pat_e_ssh01_l1 interface lan1 direction out action pass protocol tcp-established srcport 22 dst 10.255.255.1/32 dstport 0-65535 state disable logging off enable
......
filter add ALLBLOCK_lan1 interface lan1 direction in/out action block state disable logging off enable
filter6 add i_ra_01 interface lan0 direction in action pass protocol ipv6-icmp dst ff02::1/128 state disable logging off enable
filter6 add o_ra_01 interface lan0 direction out action pass protocol ipv6-icmp dst ff02::2/128 state disable logging off enable
filter6 add io_dslite01 interface lan0 direction in/out action pass protocol 4 state disable logging off enable
filter6 add i_icmp00 interface lan0 direction in action pass protocol ipv6-icmp dst self state disable logging off enable
filter6 add i_icmp00_0 interface lan0 direction in action pass protocol ipv6-icmp dst ff02::1:****:****/128 state disable logging off enable
filter6 add o_icmp00 interface lan0 direction out action pass protocol ipv6-icmp src self state disable logging off enable
.......
filter6 add ALLBLOCK_lan0 interface lan0 direction in/out action block state disable logging off enable
filter6 add ALLBLOCK_pppoe interface pppoe0 direction in/out action block state disable logging off enable
filter6 add ALLBLOCK_tunnel interface tunnel0 direction in/out action block state disable logging on enable
filter6 add ALLBLOCK_lan2 interface lan2 direction in/out action block state disable logging off enable
nat timeout 900
nat logging off
nat upnp off
nat upnp interface lan1
nat napt add private 10.255.255.1-10.255.255.1 interface pppoe0
nat snapt add protocol tcp listen 22-22 forward 10.255.255.1 22-22 enable interface pppoe0
.......
dhcp disable
dhcp mode server
dhcp6 client enable
dhcp6 client interface lan0
dns forwarder disable
ntp enable
ntp mode client
ntp server add <My NTP Server #1>
ntp server add <My NTP Server #2>
cbq link-bandwidth 100Mbps
snmp enable
snmp community "<My Comunity ID>"
snmp security-model community-based on
snmp security-model user-based on
snmp trap disable
syslog debug-level off
syslog alternate-timestamp on
syslog remote off
translator timeout 300
encrypted-password admin ***********
encrypted-password user ***********
encrypted-password-long admin **********************
encrypted-password-long user **********************
resolver enable
resolver address add dhcp6
rtadvd disable
httpd disable
sshd hostkey rsa1 ***********
sshd hostkey rsa ***********
sshd hostkey dsa  ***********
sshd authorized-key admin add main ssh-rsa ***********
sshd enable
sshd access allow add <Manager>
sshd access deny add ALL
telnetd disable

 

※編集部より:文中にて「逸般の誤家庭」「誤自宅」といった表現がありますが、これは筆者があえてそう記載しています。概要「一般的な家庭では到底備えないであろう、オーバースペックな機材を備えた逸脱した家庭」
Twitter上では、こんなハッシュタグもあります→ #逸般の誤家庭

IIJ Engineers blog読者プレゼントキャンペーン
  • Twitterフォロー&条件付きツイートで、
    「IoT米」と「バリーくんストラップ」のセットを抽選で20名にプレゼント!
    応募期間は2021/12/01~2021/12/31まで。詳細はこちらをご覧ください。
    今すぐツイートするならこちら→ フォローもお忘れなく!

くまさか

2021年12月02日 木曜日

セキュリティオペレーションセンター と セキュリティ情報統括室 に所属。システム開発者(極) を目指すプログラマ としての活動と、セキュリティアナリストとして活動をしています。うさぎさんのぬいぐるみが相棒

Related
関連記事