YAMAHA RTX1210 を Asahiネット IPIP + 固定IPアドレスオプション で使って Synology NAS をインターネットからアクセスできるようにする。

自宅 LAN 環境のルーターを NEC の IX から YAMAHA の RTX に変更したのだがなかなか苦戦したのでその顛末をメモする。 RTX1210 が Hairpin ナットに対応していないことに設定を始めてから気づいたり、自宅の模様替え以降どうにも WiFi が遅かった理由がケーブルだったりといろいろあったがなんとか解消できたので、一旦様子見としよう。

動機

NEC IX だとどうにも IKEv2 リモートアクセスを構築できなそうってことに気づき、なんだかなーと思っていたの思い切ってネット上でも IKEv2 リモートアクセスの設定例が見つかる RTX に変えることにした。

自宅 LAN にリモートアクセスするだけなら他の方式の VPN でも問題はないが、Android OS ネイティブ対応が IKEv2 のみになったのでちょっと困っていた。

回避策として Synology NAS についている OpenVPN サーバーで対応していたが、難しくはないがちょっと面倒に感じていた。

今日の時点ではリモートアクセス VPN は張っていないが、そのうちにやろうと思う。

前提

インターネット回線はタイトルにもあるが以下の通り

  • Asahiネット 光 の 1G のコース 10G だと「固定IPアドレスオプション」が使えない
  • 固定IPアドレスオプション
  • その結果、IPv4 over IPv6接続 (IPIP)
  • ひかり電話なし
  • ONU のみ

が使えるようになるってことらしい。PPPoE の IPv4 セッションも張れるがわざわざ使う必要はないだろう。
にしても ISP 界隈やケータイキャリア界隈ののネーミングセンスは壊滅的にわかりにくいと思う。名前から機能の差異がつかみにくいし、製品群の構成と名前付けルールが部外者からは理解し難く、わざとやっているのか?勘繰ってしまいたくなる。
LAN 内は、

  • Synology NAS
  • PC やスマホなどの端末機器

という構成です。NAS があること以外は至って代わり映えのない環境です。

なのでネットワーク構成は、

  • IPv6 で接続し、
  • その中を IPIP トンネルで流し、
  • DMZ はなし
  • LAN 内に配置した NAS に NAPT (ヤマハだとマスカレード) で外からアクセス
  • LAN 内に広告排除のために PiHole という DNSフィルタ (DNSサーバー)を建てるている。

って形になります。

[ここに図を入れる]

IPアドレス設計

IPアドレスはこんなふうになる。

ルーターの WAN側

IPv6 をあまり理解していないので間違いがあるかもしれない。

IPv6: 自動
IPv4: 157.107.76ZZZ

LAN 側

ルーター: 192.168.1.254

NAS: 192.168.1.244

その他端末: 192.168.1.0/24 のどこか

DNSサーバ: 192.168.1.245 (PiHole を参照するように DHCP で配布)

Asahiネットの固定IP 情報

固定IP が開通すると Asahiネット のマイページで以下のような情報を見ることができる。これらを適宜 RTX に投入する必要がある。

とはいえ、RTX のWeb管理画面でプロバイダー接続の設定はできるので、そこで一旦設定を作成してから手動で微調整した。(ネットワークガチ勢の硬派な方は GUI なんて使わないと思うがそこまでネットワークに興味ないので GUI でいきます。)

  • インターフェースID: 0000:0000:0000:0000:0000:9D6B:ZZZZ:0000 (ZZZZ はダミー)
  • AFTRエンドポイントIPv6アドレス: 2001:0C28:0001:0300:0000:0000:0000:ZZZZ
  • 固定IPv4アドレス: 157.107.76.ZZZ
  • アップデートサーバURL: https://v6update.asahi-net.or.jp/prefix
  • 認証用ユーザーID: P12345
  • 認証用パスワード: XXXYYYZZZ

開通通知の各項目は、設定画面では、(Asahiネット > RTX の Web画面 に対応する)

インターフェイスID > インターフェイスID:
上のインターフェイスID のうち上位の 0000 の並びを取り除き、再下位の 0000 を 0 に正楽略した形を指定する必要がある、要するに 9D6B:ZZZZ:0 とする必要がある。

AFTRエンドポイントIPv6アドレス > IPv6 アドレス:

固定IPv4アドレス > IPv4 アドレス:

アップデートサーバURL > アップデートサーバーの URL:

認証用ユーザーID > ユーザー名:

認証用パスワード > パスワード

にそれぞれ対応する。

RTX の設定した内容

結局こんな感じの大分類になりそう。(分け方とか認識に異論はあると思いますが、現時点の自分の中の整理ではこんなかんじ。)

  1. LAN 設定
  2. IPIP と IPv4 フィルタ
  3. NAT と IPv4 固定アドレス
  4. IPoE (IPv6) と Pv6のフィルタ
  5. DHCP
  6. あと LAN とか NTP アップデートとかもろもも
  7. LUA スクリプト

コンフィグ中に項番を入れコメントします。が基本は設定ウィザードの内容をいくらか修正しただけです。なのでフィルタの内容は十分といえないかもしれないので調整が必要だと思う。

上記の条件でよければ、コメントで開通通知の [項目名] とした部分を変更すればそのままで動くはずです。

# パスワードは encrypted な方がいいのはまちがいない
# このへんは、GUI で適当に
login password XXXXX
administrator password XXXXX
login user admin encrypted XXXXX
user attribute connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=1800
user attribute admin connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=1800

# コンソール文字化け対策
console character ja.utf8

# デフォルトで IPIP トンネルに抜ける
ip route default gateway tunnel 1

## 1. LAN設定 
ip lan1 address 192.168.1.254/24
# IPv6 アドレスを上から貰ってくる
ipv6 prefix 1 ra-prefix@lan2::/64

# 開通通知の [インターフェースID]
ipv6 lan1 address ra-prefix@lan2::9d6b:ZZZZ:0/64
ipv6 lan1 prefix change log on
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
switch control use lan1 on terminal=on

# これはようわからん、ウィザードが生成してきた。
# 削除するとイニシエーションに失敗するとか理由がありそうなので削らないほうが良さげ
lan linkup send-wait-time lan2 5

description lan2 AsahiNET

## 2. IPIP の設定 と  IPv4 フィルタ
tunnel select 1
 tunnel encapsulation ipip

#『IPv4 over IPv6接続(IPIP)接続設定情報』の
# [AFTRエンドポイントIPv6アドレス] まんま入力するとだめかも
 tunnel endpoint remote address 2001:c28:1:300::ZZZZ
 ip tunnel mtu 1460
 ip tunnel secure filter in 400003 400020 400021 400022 400023 400024 400025 400030 400032 400100 400101 400102 400103 dynamic 400082
 ip tunnel secure filter out 400013 400020 400021 400022 400023 400024 400025 400026 400027 400099 dynamic 400080 400081 400082 400083 400084 400085 400098 400099
 ip tunnel nat descriptor 20000
 tunnel enable 1
ip filter 1001 pass * * icmp * *
ip filter 400003 reject 192.168.1.0/24 * * * *
ip filter 400013 reject * 192.168.1.0/24 * * *
ip filter 400020 reject * * udp,tcp 135 *
ip filter 400021 reject * * udp,tcp * 135
ip filter 400022 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 400023 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 400024 reject * * udp,tcp 445 *
ip filter 400025 reject * * udp,tcp * 445
ip filter 400026 restrict * * tcpfin * www,21,nntp
ip filter 400027 restrict * * tcprst * www,21,nntp

# ping (icmp) を通しているが、落としてもいいと思う
ip filter 400030 pass * 192.168.1.0/24 icmp * *
ip filter 400032 pass * 192.168.1.0/24 tcp * ident
ip filter 400036 pass * 192.168.1.0/24 udp * ntp
ip filter 400037 pass * 192.168.1.0/24 udp ntp *
ip filter 400099 pass * * * * *

# Synology NAS に対する許可、ip tunnel secure filter in で使ってる 
ip filter 400100 pass * 192.168.1.244 tcp * 5000
ip filter 400101 pass * 192.168.1.244 tcp * 5001
ip filter 400102 pass * 192.168.1.244 tcp * 6690
ip filter 400103 pass * 192.168.1.244 tcp * https
ip filter 500000 restrict * * * * *
ip filter dynamic 400080 * * ftp
ip filter dynamic 400081 * * domain
ip filter dynamic 400082 * * www
ip filter dynamic 400083 * * smtp
ip filter dynamic 400084 * * pop3
ip filter dynamic 400085 * * submission
ip filter dynamic 400098 * * tcp
ip filter dynamic 400099 * * udp

## 3. NAT と IPv4 固定アドレス
nat descriptor type 20000 masquerade

# NAT の抜け先に固定 IP をあてる
nat descriptor address outer 20000 157.107.76.213
nat descriptor masquerade incoming 20000 reject 

# Synology NAS に対するアクセスを NAS の LANアドレスに向ける
nat descriptor masquerade static 20000 1000 192.168.1.244 tcp 5000
nat descriptor masquerade static 20000 1001 192.168.1.244 tcp 5001
nat descriptor masquerade static 20000 1002 192.168.1.244 tcp 6690
nat descriptor masquerade static 20000 1003 192.168.1.244 tcp https

## 4. IPv6 と IPv6フィルタ
ipv6 lan2 secure filter in 101000 101001 101002 101003 101010
ipv6 lan2 secure filter out 101099 dynamic 101080 101081 101082 101083 101084 101085 101097 101098 101099
ipv6 lan2 dhcp service client ir=on
ngn type lan2 ntt
ipv6 filter 101000 pass * * icmp6 * *
ipv6 filter 101001 pass * * tcp * ident
ipv6 filter 101002 pass * * udp * 546

# Synology NAS が使うポートを許可
ipv6 filter 101003 pass * * tcp * 5001

# IPIP を通す
ipv6 filter 101010 pass * * 4
ipv6 filter 101099 pass * * * * *
ipv6 filter dynamic 10197 * * https
ipv6 filter dynamic 101080 * * ftp
ipv6 filter dynamic 101081 * * domain
ipv6 filter dynamic 101082 * * www
ipv6 filter dynamic 101083 * * smtp
ipv6 filter dynamic 101084 * * pop3
ipv6 filter dynamic 101085 * * submission
ipv6 filter dynamic 101098 * * tcp
ipv6 filter dynamic 101099 * * udp

## 5. dhcp
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.1.1-192.168.1.244/24

# まあこれは趣味、NAS に常時同じIP を降らせてる
dhcp scope bind 1 192.168.1.244 01 90 09 d0 4b 06 cd

# Pihole: 192.168.1.245 と RTX自身と、pubulic な DNS を降らせる
dhcp scope option 1 dns=192.168.1.245,192.168.1.254,9.9.9.9
dns host lan1
dns service fallback on
dns server dhcp lan2 edns=on
dns private address spoof on

## 6. そのたもろもろ
tftp host lan
telnetd host lan1

# スクリプト実行(スクリプト自体は生成されたものを編集して使っている)
schedule at 1 startup * lua emfs:/v6plus_map_e.lua

# 時刻動機
schedule at 2 */* 05:43:21 * ntpdate ntp.nict.jp syslog
httpd host lan1
alarm usbhost off
alarm sd off
alarm entire off
sshd service on
sshd host key generate 57712 ZZZZZZZ
# any ホストはまずいかも
sftpd host any
statistics traffic on
statistics nat on

embedded file v6plus_map_e.lua <<EOF

#『IPv4 over IPv6接続(IPIP)接続設定情報』の
# [アップデートサーバURL]、[認証用ユーザーID]、[認証用パスワード] を貼り付け
UPD_SV = "https://v6update.asahi-net.or.jp/prefix"
USERNAME = "P1234"
PASSWORD = "XXXYYYZZZ"

# ここはウィザードがやってくれるのでいじらない
WAN_IF = "LAN1"

LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. WAN_IF .. "%s+by"
LOG_LEVEL = "info"
LOG_PFX = "[v6plus]"
FAIL_MSG = "Failed to notify IPv6 address to the update server. (remaining retry: %d time(s))"

function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end

local rtn, count, log, result
local req_t = {}
local res_t
req_t.url = string.format("%s?user=%s&pass=%s", UPD_SV, USERNAME, PASSWORD)
req_t.method = "GET"
while true do
rtn = rt.syslogwatch(LOG_PTN)
if rtn then
count = 3
while true do
res_t = rt.httprequest(req_t)
if res_t.rtn1 then
logger("Notified IPv6 address to the update server.")
if res_t.code == 200 then
result = "Succeeded"
else
result = "Failed"
end
log = string.format("%s to update IPv6 address. (code=%d, body=%s)", result, res_t.code, res_t.body)
logger(log)
break
end
count = count - 1
if count > 0 then
logger(string.format(FAIL_MSG, count))
rt.sleep(10)
else
logger("Failed to notify IPv6 address to the update server.")
break
end
end
end
end
EOF

LAN内から固定IPあての通信をPiHoleで解決

上が完成形なのだが、当初は DHCP で PiHole のアドレスを配布していなかった。

というのもヘアピンNAT機能が RTX1210 に無いため、LAN内から固定IPあての通信ができないことに気づいた。詳しくいうと独自ドメインに固定IP を紐付けインターネットに公開しているサーバがあり、それにアクセスできなくなっていた。

そのサーバは実際には、 Synology NAS でホストしているのだが、Synology の NAS の画面に接続できていたので、接続 OK と思い込んでいた。

スマホからは、独自ドメインのそのサーバにに、スマホの5G / 4G からはアクセスできていたので、IPv4 で通信はできていることになる。

さいわい、 PiHole をすでに使っていたので DCHP から配布するようにし、
PiHole の ローカル DNS レコードで独自ドメインを内向けに設定した (つまり NASの 192.168.1.244 を独自ドメインの FQDN にした)。

これにより、LAN 側から独自ドメインのサービスへのアクセスも疎通するようになった。

一時は面倒なので RTX830 か 840 あるいは 1220 を買うのかとも思ったが買わずにすんでよかった。

結局のところ NAS の画面には、IPv6 で接続していることなんだろうな。個人で使える固定 IPv6 というのを見たことがないが、それがあれば、単に DNS に登録するだけで済む話なんだろう。

駄話

部屋の模様替えをしてからというもの WiFi が遅いなーとは思っていたのですが、RTX の Web 画面で見てみると 100Base で接続されていました。レイアウト変更時に間に合わせでつないだケーブルを変更するのを忘れていました。

ケーブルをカテ 6A に交換すると常時100Mbps 以下だったところが、いいときは 500Mbps 越えも記録するようになった。物理的に 100Mbps が上限だったので当然といえば当然。世間的には決して早くはないですが、前がひどかったのでだいぶ良くなった。

教訓

事前準備は周到に!

参考

IPv4 over IPv6接続(IPIP) | IPv6接続機能 | オプション | 各種サービス | プロバイダ・インターネット接続は ASAHIネット
Asahiネットの対応機種リスト

IPv4 over IPv6接続(IPIP) 固定IP接続を設定する (Asahi-Net v6プラス) – YAMAHA RTXルーターの操作方法 設定 Tips | iPentec

公式の設定サンプル v6 コネクト接続設定例

introduction for YAMAHA remote router series
RTPro 公式の資料集

コマンドリファレンス
公式のリファレンス

RTX1200のv6コネクト接続設定でハマる – GentooやIoTの覚え書きブログ
RTX1200 でもやれるらしい

RTX830 の設定、IPv6 の話 – 記憶力が無い
さらっとしか見ていないがこれとほぼ同じでできるはず。

RTXルータでパケットフィルタのログを確認する – 3流プログラマのメモ書き
これも参考になる。

【ヘアピンNATができない!】LANからだとアクセスできない問題を解決する。【ローカルDNS】
ヘアピンNATはこのページをヒントに今回は PiHole で回避した

YAMAHAルータでヘアピンNAT(NATループバック)を有効にする – OpenTecMemo / オープンテックメモ
これはよくわからなかった。pp のアドレスと固定IPを別にすると向き先が違うので NAT が効くってことらしいが、IPIP トンネルでどうしたらいいかわからなかった。できなそうな気もする。

YAMAHA RTX1200 – maruko2 Note.
チートシート的なページ

ヤマハルータのコマンド | muchbow
これもチートシート的なページ

どうでもいい話だが、AsahiネットはAasahiNet なのかASAHINETなのか表記がゆれててよくわからん