Edgerouter Xでv6プラス固定IPを使う

環境

脱PPPoEをするためにIPv4 over IPv6を使おうと思うのだが、一般に広く使われているv6プラス(MAP-E)や、transix(DS-Lite)などは、一つのIPv4アドレスを複数の契約者で共有するため利用できるポートが限られてしまう。 (自宅鯖(80/443)や一部のゲームで使用できない場合があるそう)

そこで、固定IPオプションをつけることにより一つのIPv4アドレスを占有することができ任意のポートを使用できる。

https://www.jpne.co.jp/service/v6plus-static/

https://www.mfeed.ad.jp/transix/staticip/

これらは全てNGN網から固定IP終端装置に対してIPIPトンネルを張る。

v6プラス固定IP、transix固定IPのどちらかを選ぶことになるのだが、どうやら
transix固定IPでは制限がかけられているらしいのでv6プラス固定IPを使用する。

https://qiita.com/sho7650/items/2d8d3aae5246619c9c1e#%E9%80%9F%E5%BA%A6%E3%82%92%E6%B8%AC%E3%82%8D%E3%81%86

しかし、v6プラス固定IPサービスを提供している事業者は数少ない。

https://www.jpne.co.jp/v6plus-static_list/

今回引っ越した新居には光コンセントがあったので小型ONUを簡単に出してくれるらしいフレッツコラボのenひかりを契約した。

前提

今回は光電話を契約しなかったため、/64プレフィックスがRAにより配布されているため、EdgerouterでNDproxyを導入する必要がある。

説明に用いている表記は、

# (configureモード)
$ (通常モード)

となっていて、configureモードから通常モードに移行した際はcommit; save; exitをしている。

RA Prefixの取得

回線の開通が済んだら、IPv6のPrefixを取得する。
ここで必要になるのは、

  • 隣ルータのリンクローカルアドレス : fe80::xxxx:xxxx:xxxx:xxxx
  • IPv6 Prefix : 240b:xxxx:xxxx:xxxx::/64

の二つ。

$ sudo radvdump
#
# radvd configuration generated by radvdump 2.16
# based on Router Advertisement from fe80::xxxx:xxxx:xxxx:xxxx
# received by interface eth0
#

interface eth0
{
        AdvSendAdvert on;
        # Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump
        AdvManagedFlag off;
        AdvOtherConfigFlag on;
        AdvReachableTime 300000;
        AdvRetransTimer 10000;
        AdvCurHopLimit 64;
        AdvDefaultLifetime 1800;
        AdvHomeAgentFlag off;
        AdvDefaultPreference medium;
        AdvSourceLLAddress on;

        prefix 240b:xxxx:xxxx:xxxx::/64
        {
                AdvValidLifetime 2592000;
                AdvPreferredLifetime 604800;
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr off;
        }; # End of prefix definition

}; # End of interface definition

内部LAN側のIPv6アドレスの定義

enひかりから通知された固定IP情報に記載されているインターフェイスIDをyyyy:yyyy:yyyy:yyyyとすると、内部LANのアドレスは240b:xxxx:xxxx:xxxx:yyyy:yyyy:yyyy:yyyy/64となる。

# set interfaces switch switch0 address '240b:xxxx:xxxx:xxxx:yyyy:yyyy:yyyy:yyyy/64'
# set interfaces switch switch0 description Local
# set interfaces switch switch0 ipv6 dup-addr-detect-transmits 1
# set interfaces switch switch0 ipv6 router-advert cur-hop-limit 64
# set interfaces switch switch0 ipv6 router-advert link-mtu 1500
# set interfaces switch switch0 ipv6 router-advert managed-flag false
# set interfaces switch switch0 ipv6 router-advert max-interval 600
# set interfaces switch switch0 ipv6 router-advert other-config-flag true
# set interfaces switch switch0 ipv6 router-advert prefix '240b:xxxx:xxxx:xxxx::/64' autonomous-flag true
# set interfaces switch switch0 ipv6 router-advert prefix '240b:xxxx:xxxx:xxxx::/64' on-link-flag true
# set interfaces switch switch0 ipv6 router-advert prefix '240b:xxxx:xxxx:xxxx::/64' valid-lifetime 2592000
# set interfaces switch switch0 ipv6 router-advert reachable-time 0
# set interfaces switch switch0 ipv6 router-advert retrans-timer 0
# set interfaces switch switch0 ipv6 router-advert send-advert true

IPv6のデフォルトゲートウェイを対岸のルータとする。

set protocols static route6 '::/0' next-hop 'fe80::xxxx:xxxx:xxxx:xxxx' interface eth0

IPIPトンネルを張る

enひかりから通知された固定IP情報に記載されている[固定IPアドレス]と[BRアドレス]を使用する。

# set interfaces ipv6-tunnel v6tun0 address [固定IPアドレス]
# set interfaces ipv6-tunnel v6tun0 description v6plus-static
# set interfaces ipv6-tunnel v6tun0 encapsulation ipip6
# set interfaces ipv6-tunnel v6tun0 firewall in name WAN_IN
# set interfaces ipv6-tunnel v6tun0 firewall local name WAN_LOCAL
# set interfaces ipv6-tunnel v6tun0 local-ip '240b:xxxx:xxxx:xxxx:yyyy:yyyy:yyyy:yyyy'
# set interfaces ipv6-tunnel v6tun0 mtu 1452
# set interfaces ipv6-tunnel v6tun0 multicast disable
# set interfaces ipv6-tunnel v6tun0 remote-ip '[BRアドレス]'
# set interfaces ipv6-tunnel v6tun0 ttl 64

NAT・ルーティングの設定

set service nat rule 5010 outbound-interface v6tun0
set service nat rule 5010 type masquerade
set protocols static interface-route 0.0.0.0/0 next-hop-interface v6tun0

mss-clampの設定

set firewall options mss-clamp interface-type all
set firewall options mss-clamp mss 1412

NDProxyによるIPv6環境

以下を参考にndppdを導入する

速度測定

EdgerouterのCPU性能がボトルネックになってるよう…

次はx86_64なPCでVyOSを使ってやってみたいな

最近のLaTeX事情

以前各環境でTeX Liveをインストールする記事を書いたのですが、最近はもっぱらDockerを使ってどの環境でも同じようにLaTeXを書いてるのでそれの紹介をします。

VS Code + Remote Containers

VS CodeのRemote Development機能を使ってLaTeXの環境とおなじみのLaTeX WorkshopをContainerの中に閉じ込めていつでも同じ環境で作業することが出来ます。

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop

Remote Developmentのインストール

Remote Developmentは、

  • Remote SSH
  • Remote Containers
  • Remote WSL (Windowsの場合)

の3つがセットになってるのでContainer機能だけでいい場合はRemote – Containersをインストールします。

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

いつものように拡張機能からインストールします。

使い方

準備

VS CodeでLaTeXのプロジェクトルートとなるフォルダを開きます。

ルートディレクトリに .devcontainer と言うフォルダを作ってその中に devcontainer.jsondocker-compose.yml と言うファイルを作ります。

そしてそれぞれ以下の内容を貼り付けます。

Dockerで使うイメージを今回は

arkark様のlatexmk-docker

https://github.com/arkark/latexmk-docker

を少しカスタマイズした

https://github.com/AkashiSN/latexmk-docker

を使ってますが、LaTeXの環境があれば何でもいいです。

devcontainer.json

  • name: このDevContainerの名前
  • dockerComposeFile: DevContainerの元となるイメージを指定するためのComposeファイル
  • extensions: Containerの中にインストールするVS Codeプラグイン
  • service: このDevContainerの中で動かすComposeサービスの名前
  • settings: Containerの中で有効なVS Codeの設定
    • latex-workshop.*: LaTeX Workshopに関する設定
  • workspaceFolder: WorkDirの設定(Dockerイメージと合わせる)
  • shutdownAction: DevContainerを停止するときにする動作

次に、 latexmkの設定をする。
フォルダルートに .latexmkrc と言うファイルを以下の内容で作成します。

これで準備完了

Containerの中に入る

左下の緑のところを押して

Reopen in Containerを選ぶ

すると、DockerのイメージをダウンロードしてContainerを実行してくれます。

左下の緑のところが “Dev Container:” となっていればContaeinrを開いています。

ビルド

TeXファイルを開いて左の端にあるTeXを押して “Build LaTex project” を押すとデフォルトの uplatex によるビルドが始まります。

そして、その下にある “View LaTeX PDF” を押すと、タブが別れてPDFのプレビューが表示されます。

ビルドされたPDFは、 out フォルダ以下に生成されます。

また、 lualatex でビルドしたいときは、

Ctrl + Shift + P を押して “LaTeX Workshop: Build with recipe” を選択して、

“latexmk with lualatex” を選択すると lualatex によるビルドが始まります。

一回ビルドを行うと保存を行うたびに再度ビルドがかかってプレビューも更新されるので便利