🕌

Openwrt 22.03.3でv6プラスのDTI(JPNE)の場合の接続方法

2023/04/05に公開

どうしてOpenwrt 22.03.3を使うことにしたのか

自宅でトレンドマイクロ for Homenetwork[1]を使ってIPS的な防御を使っています。
このトレンドマイクロ for Homenetworkだと、(脅威を本当に防御できるかは知らないが)IPv6でIPS的な防御もできるものです。しかも定義ファイルも自動更新付きです。
他にIPv6で防御できるお安く、お手軽で、一般人が買えるものは知らないのです。個人でFortinetのUTMでも買いますか?っては流石にお財布にきつい[2]
在宅ワークをしているせいで、自宅のネットワークの安定性はとても急務です。Openwrtを使う前のネットワークはルーターがアライドテレシスのAR4050S[3]で、無線APも同様にアライドテレシスのAT-TQm6602 GEN2[4]を利用しています[5]

おかげで一日中ネットワークは落ちることもなく、安定しているのですが、一つ問題が。
トレンドマイクロ for HomenetworkのIPv6の防御が動かないどころか、IPv6の通信ができなくなってしまいます。

トレンドマイクロ for HomenetworkのIPv6の防御は自身到達先としてアナウンスすることで、(たぶん)Nexthopを本来の宛先に向けるようなProxyというかMIMT的な挙動[6]をしているようです。
そのためか、トレンドマイクロ for Homenetworkのこれらの挙動の受け入れをAR4050Sが拒否をしているため[7]IPv6でのルーティングがうまく動作しなくなってしまいました。

そりゃそうですよね、トレンドマイクロ for Homenetworkに向けたパケットが転送できない状態なのですから…
トレンドマイクロ社のサポートに確認をしたらIPv6での防御を止めるしかない、とのこと。というわけで、止めていました。

でも、ほらやっぱり防御したいじゃないですかIPv6も。
そう思いません?
なんかOpenwrtとかならなんか動きそうだし。動かなくても、設定いじれそうだし。
イケル気しません?(普通しねえよな)

選んだ機種

そういうわけで、AR-4050Sから切り替え先のハードウエアはPC Engine社のAPU4d4[8]にしました。なんでって…別に無線APはすでにあるからルーターとしての機能しかいらないし、Openwrt19.0xを使っていたときにgoogle先生で調べたときに引っかかった記事で決めました。[9]

APU4はOpenwrtのAPUのサイトからダウンロードしてインストール[10]という手もありますが、これだとAPU4特有のkmodも入ってないし、あとから入れるのも面倒だしということで独自にイメージをビルドし直しています。

独自にと言っても3年ほど更新が止まっている誰かのgithubのレポジトリ[11]からcloneして、以下の内容をいじります。

update_snapshot_hash.sh
*** ../openwrt-apu4-image/update_snapshot_hash.sh       2023-03-28 19:45:51.648425076 +0900
--- update_snapshot_hash.sh     2023-03-20 20:26:45.252014145 +0900
***************
*** 1,6 ****
  #!/bin/bash
  #
  # Update entry.sh with the latest snapshot hash
! HASH=$(curl -s -L https://downloads.openwrt.org/snapshots/targets/x86/64/sha256sums | grep openwrt-imagebuilder | awk '{print $1}')
  sed -i "/IB_SUM=/s/=.*/=\"${HASH}\"/" entry.sh
  echo updated IB_SUM to ${HASH} in entry.sh
--- 1,6 ----
  #!/bin/bash
  #
  # Update entry.sh with the latest snapshot hash
! HASH=$(curl -s -L https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/sha256sums | grep openwrt-imagebuilder | awk '{print $1}')
  sed -i "/IB_SUM=/s/=.*/=\"${HASH}\"/" entry.sh
  echo updated IB_SUM to ${HASH} in entry.sh
entry.sh
*** ../openwrt-apu4-image/entry.sh      2023-03-28 19:45:51.648425076 +0900
--- entry.sh    2023-03-29 14:05:36.011587702 +0900
***************
*** 1,12 ****
  #!/bin/sh
! SRC_DIR='/src'
  BUILD_DIR="${SRC_DIR}/build/$(date +%Y%m%d)"
  
  # UPDATE ME! x86_64 snapshot
  # Platform List: https://openwrt.org/docs/platforms/start
  # Release Page: https://downloads.openwrt.org/releases/19.07.3/targets/
! IB_URL="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-imagebuilder-x86-64.Linux-x86_64.tar.xz"
! IB_SUM="13225b2f5d657471dd71d6658536d405e9213f0f548b25bc22ab2c18c6b2e260"
  
  IB_FILE=$(basename $IB_URL)
  
--- 1,12 ----
  #!/bin/sh
! SRC_DIR='/home/pcadmin/openwrt-apu4-2203/src'
  BUILD_DIR="${SRC_DIR}/build/$(date +%Y%m%d)"
  
  # UPDATE ME! x86_64 snapshot
  # Platform List: https://openwrt.org/docs/platforms/start
  # Release Page: https://downloads.openwrt.org/releases/19.07.3/targets/
! IB_URL="https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/openwrt-imagebuilder-22.03.3-x86-64.Linux-x86_64.tar.xz"
! IB_SUM="ca9477887625447b4cca042baa6831d46027629bf924341b685bacad09b7aee7"
  
  IB_FILE=$(basename $IB_URL)
  
***************
*** 45,60 ****
  
  echo "config"
  echo " - rootfs size"
! sed -i 's/CONFIG_TARGET_ROOTFS_PARTSIZE=.*$/CONFIG_TARGET_ROOTFS_PARTSIZE=256/' .config || exit 1
  echo " - grub efi images"
  sed -i 's/CONFIG_GRUB_EFI_IMAGES=y/CONFIG_GRUB_EFI_IMAGES=n/' .config || exit 1
  #echo " - squashfs images"
  #sed -i 's/CONFIG_TARGET_ROOTFS_SQUASHFS=y/CONFIG_TARGET_ROOTFS_SQUASHFS=n/' .config || exit 1
  
  # Add Pyther repository and public signing key
! RLINE="src/gz pyther https://bolt.gyurgyik.io/openwrt/snapshots/x86_64/pyther/"
! grep -qxF "$RLINE" repositories.conf || echo $RLINE >> repositories.conf
! echo -e "untrusted comment: OpenWrt usign key of Matthew Gyurgyik\nRWRH3uo4B4x71cC2HLGFhkjbsHHCys6QzGplkB2LVtT9KqLw8DrzZShd" > keys/47deea38078c7bd5
  
  HARDWARE="\
  kmod-pcengines-apuv2 \
--- 45,66 ----
  
  echo "config"
  echo " - rootfs size"
! sed -i 's/CONFIG_TARGET_ROOTFS_PARTSIZE=.*$/CONFIG_TARGET_ROOTFS_PARTSIZE=1024/' .config || exit 1
  echo " - grub efi images"
  sed -i 's/CONFIG_GRUB_EFI_IMAGES=y/CONFIG_GRUB_EFI_IMAGES=n/' .config || exit 1
  #echo " - squashfs images"
  #sed -i 's/CONFIG_TARGET_ROOTFS_SQUASHFS=y/CONFIG_TARGET_ROOTFS_SQUASHFS=n/' .config || exit 1
+ echo " - flashrom enable"
+ sed -i 's/*CONFIG_KERNEL_DEVMEM.*$/CONFIG_KERNEL_DEVMEM=y/' .config || exit 1
+ echo " - optimization flag"
+ sed -i 's/CONFIG_TARGET_OPTIMIZATION=.*$/CONFIG_TARGET_OPTIMIZATION="-Os -pipe -march=btver2"/' .config || exit 1
+ 
+ 
  
  # Add Pyther repository and public signing key
! #RLINE="src/gz pyther https://bolt.gyurgyik.io/openwrt/snapshots/x86_64/pyther/"
! #grep -qxF "$RLINE" repositories.conf || echo $RLINE >> repositories.conf
! #echo -e "untrusted comment: OpenWrt usign key of Matthew Gyurgyik\nRWRH3uo4B4x71cC2HLGFhkjbsHHCys6QzGplkB2LVtT9KqLw8DrzZShd" > keys/47deea38078c7bd5
  
  HARDWARE="\
  kmod-pcengines-apuv2 \
***************
*** 63,101 ****
  kmod-sp5100-tco \
  kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb3 \
  kmod-sound-core kmod-pcspkr \
  amd64-microcode \
  flashrom irqbalance fstrim"
  
  PKGS="\
  avahi-daemon \
  bash \
  bind-dig \
  bind-host \
  blkid \
  block-mount \
  ca-bundle \
  coreutils-dd \
  coreutils-stat \
  curl \
  diffutils \
  ethtool \
  fdisk \
  file \
  gdisk \
- goeap_proxy \
  htop \
- iptables-mod-conntrack-extra \
  iftop \
  kmod-fs-exfat \
  kmod-fs-ext4 \
  kmod-fs-vfat \
  kmod-wireguard \
  kmod-fs-xfs \
  luci-app-vnstat2 \
  luci-app-wireguard \
  luci-ssl \
  mount-utils \
- ookla-speedtest \
  openssh-server \
  pciutils \
  shadow-useradd \
--- 69,141 ----
  kmod-sp5100-tco \
  kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb3 \
  kmod-sound-core kmod-pcspkr \
+ kmod-netem \
  amd64-microcode \
  flashrom irqbalance fstrim"
  
  PKGS="\
  avahi-daemon \
+ tc-full \
  bash \
  bind-dig \
  bind-host \
  blkid \
  block-mount \
  ca-bundle \
+ coreutils \
  coreutils-dd \
  coreutils-stat \
  curl \
+ e2fsprogs \
  diffutils \
  ethtool \
  fdisk \
  file \
  gdisk \
  htop \
  iftop \
+ nftables \
+ firewall4 \
+ odhcp6c \
+ odhcpd-ipv6only \
+ procd \
+ procd-seccomp \
+ procd-ujail \
+ urandom-seed \
  kmod-fs-exfat \
  kmod-fs-ext4 \
  kmod-fs-vfat \
  kmod-wireguard \
  kmod-fs-xfs \
+ iptables-mod-ipopt \
+ luci-base \
+ luci-i18n-base-ja \
+ luci-app-ddns \
+ luci-i18n-ddns-ja \
+ luci-app-firewall \
+ luci-i18n-firewall-ja \
  luci-app-vnstat2 \
+ luci-i18n-vnstat2-ja \
  luci-app-wireguard \
+ luci-i18n-wireguard-ja \
+ luci-app-opkg \
+ luci-i18n-opkg-ja \
  luci-ssl \
+ luci-app-upnp \
+ luci-i18n-upnp-ja \
+ luci-app-acl \
+ luci-i18n-acl-ja \
+ luci-app-omcproxy \
+ luci-i18n-omcproxy-ja \
+ luci-mod-dashboard \
+ luci-app-uhttpd \
+ luci-i18n-uhttpd-ja \
+ acme \
+ acme-dnsapi \
+ luci-app-acme \
+ luci-i18n-acme-ja \
+ patch \
  mount-utils \
  openssh-server \
  pciutils \
  shadow-useradd \
***************
*** 106,112 ****
  vim-fuller \
  vnstat2 \
  wget \
! wireguard-tools"
  
  #make image PACKAGES="$HARDWARE $PKGS -kmod-r8169 -ppp -ppp-mod-pppoe" || exit 1
! make image V=sc PACKAGES="$HARDWARE $PKGS -kmod-r8169 -ppp -ppp-mod-pppoe -kmod-bnx2 -bnx2-firmware" || exit 1
--- 146,185 ----
  vim-fuller \
  vnstat2 \
  wget \
! map \
! iptables-mod-conntrack-extra \
! ip6tables-extra \
! ip6tables-mod-nat \
! ip6tables-nft \
! arptables-nft \
! ebtables-nft \
! iptables-nft \
! xtables-nft \
! iptgeoip \
! luci-i18n-statistics-ja \
! kmod-sched-ctinfo \
! iptables-mod-nat-extra \
! iptables-mod-tproxy \
! iptables-mod-u32 \
! iptables-mod-iprange \
! iptables-mod-extra \
! kmod-sched-bpf \
! kmod-sched-connmark \
! kmod-ipt-conntrack-label \
! wireguard-tools \
! luci-i18n-sqm-ja \
! collectd-mod-sqm \
! sqm-scripts-extra \
! xtables-legacy \
! sqm-scripts \
! bc"
! 
! #
! # goeap_proxy \
! #
! #ookla-speedtest \
! #luci-i18n-statistics-ja \
! 
  
  #make image PACKAGES="$HARDWARE $PKGS -kmod-r8169 -ppp -ppp-mod-pppoe" || exit 1
! make -j4 image V=sc PACKAGES="$HARDWARE $PKGS -kmod-r8169 -ppp -ppp-mod-pppoe -kmod-bnx2 -bnx2-firmware" || exit 1

変更した内容をまとめます

update_snapshot_hash.sh

  • 元々のレポジトリはsnapshot版からのコンパイルのため、安定性が微妙なのでリリース版からのシグネイチャの取得をするようにしました[12]
  • このコマンドを実行するとentry.sh内にあるIB_SUMのハッシュを書き換えてくれます。このハッシュはビルドし直すときにチェックされます

entry.sh

割と書き換えています。ただし大きな点は以下のとおりです

  • 元々のレポジトリが想定している接続環境はAT&TのDSLが念頭にありそうで、EAP Proxyの取得を指定されている
  • ookla-speedtestの取得も指定されている
  • これが一番問題だが、何故か上の2つのパッケージはgithubからの取得ではなくこの開発者が所有していると思われる外部サイトから取得している

こちらはv6プラスのJPNEの環境なので、上の内容は削除した。これでOpenwrtサイトからだけでビルドを構成できる。それに加えて以下の内容を追加している。

  • rootパーテーションの容量が少ないので拡張するためCONFIG_TARGET_ROOTFS_PARTSIZEを256MB → 1GBへ変更
  • Openwrt上でAPU4のファームウエアの書き換えができたらいいなと思うので、書き換えのためにカーネルフラグCONFIG_KERNEL_DEVMEMをyに書き換え(ただしこれは動作していない模様)
  • オプティマイズのフラグを立てるためにCONFIG_TARGET_OPTIMIZATIONを設定
  • sqmscript(AQM)のためにkmod-netem(WANシュミレーション)を指定。これがないとオンライン会議はジッターと遅延の嵐
  • coreutils patch ユーザーランドのコマンドがいくつか足りなかったので追加
  • e2fsprogs procd procd-seccomp procd-ujail urandom-seed なんで入れたんだっけか…
  • odhcpd-ipv6only map v6プラスのために入れている
  • bc RPS/XPS[13]設定値投入のための計算ツールとして入れた
  • luci-app周りと日本語リソース。入れたappは次の通り。ddns firewall vnstat2 wireguard opkg ssl upnp acl omcproxy dashboard uhttpd acme statistics
  • iptables周りはv6プラスとsqmscriptのために指定をしたものだが、いらないものも入っているだろうと思われる。
  • 末尾にあるmakeコマンドで並列化を4に増やした

これでentry.shを実行するとコンパイルが開始され「src/build/<ビルド日付>/openwrt-imagebuilder-22.03.3-x86-64.Linux-x86_64/bin/targets/x86/64」のは以下にイメージができます。

できたイメージから「openwrt-22.03.3-x86-64-generic-squashfs-combined.img.gz」でsquashfsのものを使っています。ext4だと設定がごちゃまぜになってやり直したいと思っても初期化できないので、squashfs一択です。

インストール手順

ぶっちゃけこのサイト[14]まんまです…

インストール後

インストール後のv6プラスの接続方法はこのサイト[15]が一番まとまってます。まあ、この方法ではDTIだとIPv6しかつながりませんが…。ここにダラダラ書くより一番まとまっているので、とにかく設定してIPv6でつながるのは確認しましょう。

巷にある最近のIPoEというかv6プラスは何がDTI(JPNE)[16]だとつながらないのか

以前Openwrt 19.07のときはv6プラスといってもJPNEでの接続記事[17]が多かったのですが、最近はOCN[18]の記載が多くなりました。ただうちはDTI[19]なんですよねえ。

以前はJPNEでの接続記事をそのまま流用できていたのですが、OCNとDTIは微妙に仕様違いがあるようでそのまま設定しても接続できません。

DTIのv6プラスはJPNEで間違いなく、map-eのドラフトバージョンを使っていることも違いないのですが、OCNのものをそのまま流用してもIPv4のサイトにつながりません。とくにOpenwrt 22.03での接続のためには以下の点の注意が必要です。

IPv6のWANインタフェース(WAN6とかよく名前をつけているインタフェースがおおいです)とIPv6-to-IPv4のMAPインタフェース(WAN_MAPとかいう名前がおおいです)の双方に「option encaplimit 'ignore'」が必要になります。

大嘘でした、トレンドマイクロ for Homenetworkの環境では、IPv6-to-IPv4のMAPインタフェース(WAN_MAPとかいう名前がおおいです)だけに「option encaplimit 'ignore'」が必要になります。下のnetworkファイルの引用から記載は消しています。(2023/8/2 Update)

また、PD用に別にインタフェースを作って(WAN6PD[20]とかいう名前がちらほら)っていますが、それをしても動作しないです。なので、IPv6のWANインタフェースはPD用のインタフェースは作ると動作しません。そのため、以前のバージョンのようにIPv6のWANインタフェース一つでPDの設定も入れ込むことになります。

言葉で書いてしまいましたが、設定的には以下のようになります。

/etc/config/network
config interface 'wan6'
        option device 'eth3'
        option proto 'dhcpv6'
        option reqaddress 'try'
        option reqprefix 'auto'
        option ip6prefix 'XXXX:XXXX:XXXX:XXXX::/56'

config interface 'WAN_MAP'
        option proto 'map'
        option maptype 'map-e'
        option peeraddr '2404:XXXX:XXX:XXX::XX'
        option ipaddr 'XXX.X.0.0'
        option ip4prefixlen 'XX'
        option ip6prefix '2XXX:XXX::'
        option ip6prefixlen 'XX'
        option ealen 'XX'
        option psidlen 'X'
        option offset 'X'
        option legacymap 'X'
        option tunlink 'wan6'
        option encaplimit 'ignore'

重要なのは「option tunlink 'wan6'」と「option encaplimit 'ignore'」です。「option encaplimit 'ignore'」については19.07のときはMAPインタフェースのみの指定の記述が多かったのですが、22.03ではIPv6の外部インタフェースにも指定が必要です。そうしないとIPv4での通信しかできません。
また、PD用のインタフェースも作らないため、「option tunlink 'wan6'」としています。OCNだとtunlinkもせずignoreもしなくてもつながっているようなので、どうやらv6プラスでもJPNEとは仕様違いがあり、これのため設定にも違いが出るようです。

それでトレンドマイクロ for Homenetworkはつかえましたか・・・?

IPv6でも使えました!ばっちり管理画面でクライアントのIPv6を検知しています。脅威の検知ができているかは相変わらず不明ですけど。設定したAPU4d4に「事前に」起動したトレンドマイクロ for Homenetworkを接続して、APU4d4を起動するのです…これもしかしてAR4050Sも…い、いや、sqmscriptをつかってオンライン会議の遅延が激減しているのでそれで良しとして振り返らないようにしないと[7:1]

脚注
  1. トレンドマイクロ for Homenetwork
    https://www.trendmicro.com/ja_jp/forHome/products/vbhn.html ↩︎

  2. FortinetのUTMのおねだん(参考)
    https://www.fgshop.jp/pricelist/fortigate/ ↩︎

  3. ルーター:AR4050S
    https://www.allied-telesis.co.jp/products/list/router/ar3050s_ar4050s/catalog.html ↩︎

  4. 無線AP:AT-TQm6602 GEN2
    https://www.allied-telesis.co.jp/products/list/wireless/tqm6702gen2/catalog.html ↩︎

  5. ないとは思いますが、この記事を見てアライドの無線APを買いたい!という奇特な方がいた場合は、「ルーターも一緒に買ってください」。ルーターが簡易的な無線LANコントローラを兼ねているのでこれがないと無線状況に合わせて再起動なしで無線APのチャンネルを切り替えてくれません。AR4050Sが高すぎる場合はAR2050Vでもできます。なお、うちの無線クライアントは30台ぐらい程度です。それほど多くありません。 ↩︎

  6. トレンドマイクロ for HomenetworkにはいくつかのIPv6の通信を横取りするモードがあるようで、モードAがICMPv6 NAでARP的なものを上書き、モードBがRAをアナウンスしてデフォルトゲートウェイを複数認識させるようです。どこにも説明がないので、ip -6 route show とip -6 neigh showとradvdumpの結果からの想定ですが。 ↩︎

  7. 拒否しているため。
    だったのですが、後日試したら動きました…起動順序を変えたら動作しています。最初にウイルスバスターforHomenetworkが起動できたあとに、AR4050S。 ↩︎ ↩︎

  8. APU4d4
    https://pcengines.ch/apu4d4.htm
    まさにルーター的な使い方ができる1Gbpsの4ポートNIC、miniPCIが3つ乗ってるやつです。apu4d4(ヒートスプレッダ付きボード本体)、case1d4bluu(青いアルミケース)、msata16g(miniPCIに挿すストレージ)、apufix1a0(ヒートスプレッダ装着用のガイド)を購入しました。ACアダプタはそのへんにある12V/2Aのものを買ってきました ↩︎

  9. 元のサイト
    https://y2lab.org/blog/audio/digital-audio/testing-the-pcengine-apu4d4-board-8136/ ↩︎

  10. Openwrtのサイト
    https://openwrt.org/toh/pcengines/apu
    なぜか、APU4に特化したイメージは配布されていない。x86だからか。 ↩︎

  11. 3年ほど更新が止まってるgithubのレポジトリ
    https://github.com/pyther/openwrt-apu4-image
    テンプレいじるだけで独自にイメージをビルドし直しができるのでありがたいサイトでございます。 ↩︎

  12. Openwrtのリリース版が安定しているかというのはちょっと問いかけるのはやめましょう。22のリリースってfirewall3(iptables) → firewall4(nft)に切り替わって色々な後方互換性を捨ててるリリースなので安定版が安定しているという幻想をry ↩︎

  13. RPX/XPSの設定。この設定をルーターに入れておかないとCPUの使用率に偏りが出て適正にリソースの使用がされません
    https://qiita.com/saitara/items/aabb9c8869079ceb96a2 ↩︎

  14. OpenWRT installation instructions for APU2/APU3/APU4 boards
    https://teklager.se/en/knowledge-base/openwrt-installation-instructions/ ↩︎

  15. まとまったサイト
    https://blog.osakana.net/archives/11679 ↩︎

  16. v6プラス(IPv6/IPv4インターネットサービス)
    https://www.jpne.co.jp/service/v6plus/ ↩︎

  17. たとえば
    https://zenn.dev/yakumo/articles/74c16c2e737841b6945e2309243236a2 ↩︎

  18. OCNのv6プラス
    https://service.ocn.ne.jp/hikari/ipv6/ ↩︎

  19. DTIのv6プラス
    https://4466.jp/ ↩︎

  20. WAN6PDとかいう・・・
    このWAN6PDに「option encaplimit 'ignore'」をつけるテストはやってないな… ↩︎

Discussion