はじめに
この記事で出来る事
この記事はコピペで動きます
理解は後でOK
-
IPoEの自動設定:
OCNバーチャルコネクト・v6プラス・nuro光・transix・Xpass・v6コネクトの接続設定 -
マルチセッション(ニチバンベンチ)対策:
map.shパッチによるポート枯渇問題の解決 -
APKパッケージマネージャー対応:
従来のOPKGから変更されたAPKに対応
初心者対応構成
- Windowsからの導入手順
- スクリプトでの自動設定
- 学びたい人はUCI (ttyd)、Webコンソール (LuCi)、ファイラー (SFTP)にて比較作業がおススメ
ネットワーク自動構成API
クラウドフレアワーカー
| カテゴリ | 項目(JSON Key) | 機能・説明 |
|---|---|---|
| 基本情報 | notice |
通知・警告 |
language / country
|
言語コード / 国コード | |
timezone / zonename
|
タイムゾーン / ゾーン名 | |
| 接続状況 |
ipv4 (排他表示) |
パブリックIPv4アドレス |
ipv6 (排他表示) |
パブリックIPv6アドレス | |
isp / as
|
ISP名称 / AS番号 | |
| MAP-E | brIpv6Address |
IPv6アドレス (BR) |
ipv4Prefix / ipv4PrefixLength
|
IPv4プレフィックス / 長さ | |
ipv6Prefix / ipv6PrefixLength
|
IPv6プレフィックス / 長さ | |
eaBitLength |
EAビット長 | |
psid / psidlen / psIdOffset
|
PSID / PSID長 / オフセット | |
ipv6Prefix_static |
静的IPv6プレフィックス | |
| DS-Lite | aftrType |
終端装置タイプ |
aftrFqdn / aftrAddress
|
AFTR FQDN / アドレス | |
aftrIpv6Address / peeraddr
|
AFTR IPv6直値 / トンネル対向先 | |
jurisdiction |
提供元・管轄情報 |
設定ファイルなど
-
IPv6自動取得
auto-config.site-u.workers.dev/ -
設定ファイル
auto-config.json -
実行ファイル
auto-config.js
※GitHubからクラウドフレアにデプロイ
元祖:config-softwire - FC2ホームページ
※データーベースが少し古くなってきている
接続情報確認スクリプト(全JSON出力)
#!/bin/sh
mkdir -p /tmp/aios2
cat > "/tmp/aios2/auto-config.sh" << 'SCRIPT_END'
#!/bin/sh
set -eu
echo "情報を取得中..."
API_RESPONSE="$(wget -qO- https://auto-config.site-u.workers.dev/)"
# --- 基本情報 ---
echo "NOTICE=$(echo "$API_RESPONSE" | jsonfilter -e '@.notice')"
echo "LANGUAGE=$(echo "$API_RESPONSE" | jsonfilter -e '@.language')"
echo "COUNTRY=$(echo "$API_RESPONSE" | jsonfilter -e '@.country')"
echo "REGION_NAME=$(echo "$API_RESPONSE" | jsonfilter -e '@.regionName')"
echo "REGION_CODE=$(echo "$API_RESPONSE" | jsonfilter -e '@.region')"
echo "TIMEZONE=$(echo "$API_RESPONSE" | jsonfilter -e '@.timezone')"
echo "ZONENAME=$(echo "$API_RESPONSE" | jsonfilter -e '@.zonename')"
# --- 接続情報 ---
echo "IPV4=$(echo "$API_RESPONSE" | jsonfilter -e '@.ipv4')"
echo "IPV6=$(echo "$API_RESPONSE" | jsonfilter -e '@.ipv6')"
echo "ISP=$(echo "$API_RESPONSE" | jsonfilter -e '@.isp')"
echo "AS=$(echo "$API_RESPONSE" | jsonfilter -e '@.as')"
# --- MAP-E オプション ---
echo "MAPE_BR=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.brIpv6Address')"
echo "MAPE_IPV4_PREFIX=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv4Prefix')"
echo "MAPE_IPV4_PREFIXLEN=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv4PrefixLength')"
echo "MAPE_IPV6_PREFIX=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv6Prefix')"
echo "MAPE_IPV6_PREFIXLEN=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv6PrefixLength')"
echo "MAPE_EALEN=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.eaBitLength')"
echo "MAPE_PSIDLEN=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.psidlen')"
echo "MAPE_PSID=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.psid')"
echo "MAPE_PSID_OFFSET=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.psIdOffset')"
echo "MAPE_STATIC_PREFIX=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv6Prefix_static')"
# --- DS-Lite オプション ---
echo "DSLITE_AFTR_TYPE=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.aftrType')"
echo "DSLITE_AFTR_FQDN=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.aftrFqdn')"
echo "DSLITE_AFTR=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.aftrAddress')"
echo "DSLITE_AFTR_IPV6=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.aftrIpv6Address')"
echo "DSLITE_PEERADDR=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.peeraddr')"
echo "DSLITE_JURISDICTION=$(echo "$API_RESPONSE" | jsonfilter -e '@.aftr.jurisdiction')"
SCRIPT_END
sh "/tmp/aios2/auto-config.sh"
MAP-E
OCNバーチャルコネクト・V6プラス・NURO光
OCNバーチャルコネクトの回線種別による違い:
| 回線種別 | IPv6割り当て | 推奨モード |
|---|---|---|
| 1G回線 | GUA (RA)のみ | Static必須 |
| 10G回線 | GUA + PD | Static/PD両対応 |
| ひかり電話ルーター | GUA + PD | Static/PD両対応 |
本スクリプトの動作:
- GUA (RA)を優先検出し、Staticモードで動作
- 全回線種別で確実に接続可能
OCNバーチャルコネクト・v6プラス・nuro光設定
#!/bin/sh
set -e
# 変数の定義
MAPE="mape"
MAPE6="mape6"
# パッケージのインストール
PKGS="map"
UPDATE="${UPDATE:-$(command -v opkg && opkg update >&2; command -v apk && apk update >&2; echo 1)}"
command -v opkg && opkg install $PKGS 2>/dev/null
command -v apk && apk add $PKGS 2>/dev/null
# OpenWrt network APIをロード
. /lib/functions/network.sh
# デバイスからGUA (RA)とPDを判定
echo "IPv6アドレス情報を取得中..."
network_flush_cache
# WAN6インターフェースを取得
network_find_wan6 WAN6_IF
if [ -z "$WAN6_IF" ]; then
echo "警告: IPv6 WANインターフェースが見つかりません"
WAN6_IF="wan6"
fi
# WANデバイス(物理)を取得
network_get_physdev WAN_DEVICE "${WAN6_IF}"
if [ -z "$WAN_DEVICE" ]; then
WAN_DEVICE=$(uci -q get network.wan.device || echo "wan")
fi
echo "検出されたWANデバイス: ${WAN_DEVICE}"
DETECTED_STATIC=""
DETECTED_PD=""
MAPE_TYPE="static" # デフォルトはStatic (GUA/RA)
# IPv6アドレス取得(GUA検出)
network_get_ipaddr6 DETECTED_STATIC "${WAN6_IF}"
# IPv6プレフィックス取得(PD検出)
network_get_prefix6 DETECTED_PD "${WAN6_IF}"
# GUA/PD判定とStatic Prefix生成
if [ -n "$DETECTED_STATIC" ]; then
case "$DETECTED_STATIC" in
fe80:*|FE80:*)
DETECTED_STATIC=""
;;
2*|3*)
MAPE_STATIC_PREFIX="$(echo "$DETECTED_STATIC" | cut -d: -f1-4)::/64"
MAPE_TYPE="static"
echo "検出モード: Static (GUA: $DETECTED_STATIC)"
echo "Static Prefix: $MAPE_STATIC_PREFIX"
;;
esac
fi
if [ -z "$DETECTED_STATIC" ] && [ -n "$DETECTED_PD" ]; then
MAPE_TYPE="pd"
echo "検出モード: PD (Prefix: $DETECTED_PD)"
fi
if [ -z "$DETECTED_STATIC" ] && [ -z "$DETECTED_PD" ]; then
echo "警告: IPv6アドレス/プレフィックスが検出できませんでした"
echo "Static モードで続行しますが、接続できない可能性があります"
fi
# APIからMAP-E設定情報を取得
echo "MAP-E設定情報を取得中..."
API_RESPONSE=$(wget -qO- https://auto-config.site-u.workers.dev/)
mape_br=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.brIpv6Address')
mape_ipv4_prefix=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv4Prefix')
mape_ipv4_prefixlen=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv4PrefixLength')
mape_ipv6_prefix=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv6Prefix')
mape_ipv6_prefixlen=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.ipv6PrefixLength')
mape_ealen=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.eaBitLength')
mape_psidlen=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.psidlen')
mape_psid_offset=$(echo "$API_RESPONSE" | jsonfilter -e '@.mape.psIdOffset')
if [ -z "$mape_br" ] || [ -z "$mape_ipv4_prefix" ]; then
echo "エラー: MAP-E設定情報の取得に失敗しました"
exit 1
fi
# Network設定
uci batch <<EOF
set network.wan.disabled='1'
set network.wan.auto='0'
set network.wan6.disabled='1'
set network.wan6.auto='0'
set network.${MAPE6}=interface
set network.${MAPE6}.proto='dhcpv6'
set network.${MAPE6}.device='${WAN_DEVICE}'
set network.${MAPE6}.reqaddress='try'
set network.${MAPE6}.reqprefix='auto'
set network.${MAPE}=interface
set network.${MAPE}.proto='map'
set network.${MAPE}.maptype='map-e'
set network.${MAPE}.peeraddr='${mape_br}'
set network.${MAPE}.ipaddr='${mape_ipv4_prefix}'
set network.${MAPE}.legacymap='1'
set network.${MAPE}.ip4prefixlen='${mape_ipv4_prefixlen}'
set network.${MAPE}.ip6prefix='${mape_ipv6_prefix}'
set network.${MAPE}.ip6prefixlen='${mape_ipv6_prefixlen}'
set network.${MAPE}.ealen='${mape_ealen}'
set network.${MAPE}.psidlen='${mape_psidlen}'
set network.${MAPE}.offset='${mape_psid_offset}'
set network.${MAPE}.mtu='1460'
set network.${MAPE}.encaplimit='ignore'
set network.${MAPE}.tunlink='${MAPE6}'
EOF
if [ "$MAPE_TYPE" = "static" ] && [ -n "$MAPE_STATIC_PREFIX" ]; then
uci -q set network.${MAPE6}.ip6prefix="${MAPE_STATIC_PREFIX}"
echo "Static Prefixを設定: ${MAPE_STATIC_PREFIX}"
fi
uci commit network
# DHCP設定
uci batch <<EOF
set dhcp.${MAPE6}=dhcp
set dhcp.${MAPE6}.interface='${MAPE6}'
set dhcp.${MAPE6}.master='1'
set dhcp.${MAPE6}.ra='relay'
set dhcp.${MAPE6}.dhcpv6='relay'
set dhcp.${MAPE6}.ndp='relay'
set dhcp.${MAPE6}.ignore='1'
set dhcp.lan.ra='relay'
set dhcp.lan.dhcpv6='relay'
set dhcp.lan.ndp='relay'
set dhcp.lan.force='1'
commit dhcp
EOF
# Firewall設定
uci batch <<EOF
del_list firewall.@zone[1].network='wan'
del_list firewall.@zone[1].network='wan6'
add_list firewall.@zone[1].network='${MAPE}'
add_list firewall.@zone[1].network='${MAPE6}'
set firewall.@zone[1].masq='1'
set firewall.@zone[1].mtu_fix='1'
commit firewall
EOF
echo ""
echo "MAP-E設定が完了しました (モード: ${MAPE_TYPE})"
echo "Enterキーを押すとサービスを再起動します"
read dummy </dev/tty
for s in network firewall dnsmasq odhcpd; do /etc/init.d/$s restart 2>/dev/null; done
until ip addr show br-lan 2>/dev/null | grep -q 'inet '; do sleep 1; done
/etc/init.d/ttyd restart 2>/dev/null
echo "完了しました"
ニチバン対策(ホットプラグ適用方式)
ニチバンベンチについて
ニチバンベンチとは
ニチバン株式会社の公式サイトは、大量の小さなファイルを同時セッションで配信する構造のため、OpenWrtのMAP-E環境でNATポート枯渇を引き起こしやすい
このサイトを10窓程度でリロードすることでポート枯渇問題を簡易的に再現できることから、「ニチバンベンチ」と呼ばれるようになった
ニチバン(SNATポート枯渇)対策とは
OpenWrtのmap.shが複数セッション確立時にSNATテーブルの競合によってポート枯渇エラー(SNAT failed)を引き起こす問題に対処することをいう
※ニチバン株式会社及びそのサービスに問題があるわけではなく、OpenWrtのMAP-E環境側の制約による現象です
map.shについて
mapパッケージに付属してる
MAP-E方式をサポートするネットワーク設定スクリプト
19.07まではFW3対応、21.02以降FW4対応となった
sha1sum map-19.07.sh
- 431ad78fc976b70c53cdc5adc4e09b3eb91fd97f map-19.07.sh
sha1sum map-21.02.sh ~ map-25.12.sh
- 7f0682eeaf2dd7e048ff1ad1dbcc5b913ceb8de4 map-21.02.sh ~ map-25.12.sh
wget -qO- https://raw.githubusercontent.com/openwrt/openwrt/openwrt-**.**/package/network/ipv6/map/files/map.sh | sha1sum
問題点
MAP-Eはfw4/nftablesと互換性がありません #11972
MAP-T が割り当てられたポート範囲全体を活用しない #14449
ホットプラグ適用方式
attendedsysupgrade(owut)でmap.shがデフォルトで上書きされる為、ホットプラグ適用方式(永続方式)に変更
| ファイル | 役割 | タイミング |
|---|---|---|
/etc/init.d/mape-patch |
map.sh portsetループ無効化 | START=19(netifd起動前) |
/etc/hotplug.d/iface/99-mape-snat |
numgen SNAT + DSCPリセット + conntrack | mape ifup後 |
起動シーケンス
ブート
└─ START=19 mape-patch start()
├─ map.sh portsetループを無効化(sed)
└─ 99-mape-snat を生成
└─ netifd が mape ifup
└─ 99-mape-snat 発火
├─ numgen SNAT構築(全ポート均等分散)
├─ DSCPリセット(CS0)
└─ conntrackタイムアウト短縮
有効・無効の切り替え
/etc/init.d/mape-patch start # 有効化(map.sh sed + hotplug生成)
/etc/init.d/mape-patch stop # 無効化(hotplug削除 + nftクリーン + map.sh復元 + conntrackリストア)
対策内容
numgen SNAT(ポート均等分散)
numgen inc modで全割り当てポートを均等ラウンドロビン
デフォルトmap.shは先頭16ポートに偏るが、本対策で240または1008ポート全てを均等に使用
DSCPリセット(NTT QoS帯域制限回避)
IPv4/IPv6両方のDSCPをCS0にリセット
conntrackタイムアウトチューニング
MAP-Eのポート数制約に合わせてconntrackの保持時間を短縮(ポート枯渇対策)
Block-QUIC-MAP-E
MAP-E環境ではQUIC(UDP/443)が大量のポートを消費するため、
QUICをブロックしてTCP/443にフォールバックさせることでポート枯渇を抑制
FMR(網内折り返し:Forwarding Mapping Rule: RFC 7597) UCI rule
※map.sh.all のみ対応
network.*.fmr_ruleからFMRルール読み込み
※ホットプラグ方式は非対応
map.shホットプラグ適用設定
#!/bin/sh
(
{ command -v apk > /dev/null 2>&1 && apk info -e map > /dev/null 2>&1; } || \
{ command -v opkg > /dev/null 2>&1 && opkg list-installed map | grep -q .; } || \
{ echo "先にMAP-E設定スクリプトを実行してください"; exit 1; }
cat > /etc/init.d/mape-patch << 'INITD'
#!/bin/sh /etc/rc.common
START=19
STOP=19
start() {
sed -i '/for portset in.*PORTSETS/c\ for portset in _; do continue' /lib/netifd/proto/map.sh 2>/dev/null
uci batch <<EOF
set firewall.block_quic_mape=rule
set firewall.block_quic_mape.name='Block-QUIC-MAP-E'
set firewall.block_quic_mape.proto='udp'
set firewall.block_quic_mape.dest_port='443'
set firewall.block_quic_mape.src='lan'
set firewall.block_quic_mape.dest='wan'
set firewall.block_quic_mape.target='DROP'
set firewall.block_quic_mape.family='ipv4'
set firewall.block_quic_mape.enabled='1'
commit firewall
EOF
mkdir -p /etc/hotplug.d/iface
printf '%s\n' \
'#!/bin/sh' \
'[ "$ACTION" = "ifup" ] && [ "$INTERFACE" = "mape" ] && {' \
' R="/tmp/map-mape.rules"; [ -f "$R" ] || exit 0' \
' eval $(cat "$R"); k=$RULE_BMR; [ -z "$k" ] && exit 0' \
' n=0; P=""' \
' for p in $(eval "echo \$RULE_${k}_PORTSETS"); do' \
' s=${p%%-*}; e=${p##*-}; x=$s' \
' while [ $x -le $e ]; do P="$P $n : $x ,"; n=$((n+1)); x=$((x+1)); done' \
' done' \
' [ "$n" -eq 0 ] && exit 0; P=${P%?}' \
' nft delete table inet mape 2>/dev/null' \
' nft add table inet mape' \
' nft add chain inet mape srcnat { type nat hook postrouting priority 0\; policy accept\; }' \
' V=$(eval "echo \$RULE_${k}_IPV4ADDR")' \
' for t in icmp tcp udp; do' \
' nft add rule inet mape srcnat ip protocol $t oifname "map-mape" counter snat ip to $V : numgen inc mod $n map {$P }' \
' done' \
' nft delete table inet mape_dscp 2>/dev/null' \
' nft add table inet mape_dscp' \
' nft add chain inet mape_dscp postrouting { type filter hook postrouting priority mangle\; policy accept\; }' \
' nft add rule inet mape_dscp postrouting ip dscp set cs0 comment \"mape-dscp-reset-v4\"' \
' nft add rule inet mape_dscp postrouting ip6 dscp set cs0 comment \"mape-dscp-reset-v6\"' \
' sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600 \' \
' net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 \' \
' net.netfilter.nf_conntrack_udp_timeout=120 \' \
' net.netfilter.nf_conntrack_udp_timeout_stream=120 \' \
' net.netfilter.nf_conntrack_icmp_timeout=60 \' \
' net.netfilter.nf_conntrack_generic_timeout=60 >/dev/null 2>&1' \
'}' \
'[ "$ACTION" = "ifdown" ] && [ "$INTERFACE" = "mape" ] && {' \
' nft delete table inet mape 2>/dev/null' \
' nft delete table inet mape_dscp 2>/dev/null' \
'}' \
> /etc/hotplug.d/iface/99-mape-snat
chmod +x /etc/hotplug.d/iface/99-mape-snat
}
stop() {
rm -f /etc/hotplug.d/iface/99-mape-snat
nft delete table inet mape 2>/dev/null
nft delete table inet mape_dscp 2>/dev/null
cp /rom/lib/netifd/proto/map.sh /lib/netifd/proto/map.sh 2>/dev/null
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400 \
net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 \
net.netfilter.nf_conntrack_udp_timeout=30 \
net.netfilter.nf_conntrack_udp_timeout_stream=180 \
net.netfilter.nf_conntrack_icmp_timeout=30 \
net.netfilter.nf_conntrack_generic_timeout=600 >/dev/null 2>&1
uci -q delete firewall.block_quic_mape
uci commit firewall
for s in network firewall dnsmasq odhcpd; do /etc/init.d/$s restart 2>/dev/null; done
until ip addr show br-lan 2>/dev/null | grep -q 'inet '; do sleep 1; done
/etc/init.d/ttyd restart 2>/dev/null
}
INITD
chmod +x /etc/init.d/mape-patch
/etc/init.d/mape-patch enable
/etc/init.d/mape-patch start
echo -e '/etc/hotplug.d/iface/99-mape-snat\n/etc/init.d/mape-patch' >> /etc/sysupgrade.conf
echo "設定が完了しました"
echo "Enterキーを押すとサービスを再起動します"
read dummy </dev/tty
for s in network firewall dnsmasq odhcpd; do /etc/init.d/$s restart 2>/dev/null; done
until ip addr show br-lan 2>/dev/null | grep -q 'inet '; do sleep 1; done
/etc/init.d/ttyd restart 2>/dev/null
echo "完了しました"
)
完全削除
/etc/init.d/mape-patch stop
/etc/init.d/mape-patch disable
rm -f /etc/init.d/mape-patch
正常性確認
#!/bin/sh
(
DONE=0; NONE=0
done_() { echo "設定済み: $1"; DONE=$((DONE+1)); }
none_() { echo "未設定 : $1"; NONE=$((NONE+1)); }
grep -q 'for portset in _; do continue' /lib/netifd/proto/map.sh 2>/dev/null && done_ "map.sh パッチ適用済み" || none_ "map.sh 未適用"
[ -x /etc/init.d/mape-patch ] && done_ "init.d/mape-patch 配置済み" || none_ "init.d/mape-patch 未配置"
[ -x /etc/hotplug.d/iface/99-mape-snat ] && done_ "hotplug/99-mape-snat 配置済み" || none_ "hotplug/99-mape-snat 未配置"
NUMGEN=$(nft list table inet mape 2>/dev/null | grep -c numgen)
[ "$NUMGEN" -ge 3 ] && done_ "numgen SNAT ${NUMGEN}本 検出" || none_ "numgen SNAT ${NUMGEN}本 未検出 (期待: 3)"
nft list table inet mape_dscp >/dev/null 2>&1 && done_ "mape_dscp 検出" || none_ "mape_dscp 未検出"
for p in \
"net.netfilter.nf_conntrack_tcp_timeout_established 3600" \
"net.netfilter.nf_conntrack_udp_timeout 120" \
"net.netfilter.nf_conntrack_udp_timeout_stream 120"; do
k=${p% *}; v=${p##* }; val=$(sysctl -n $k 2>/dev/null)
[ "$val" = "$v" ] && done_ "$k=$val" || none_ "$k=$val (期待: $v)"
done
FW4=$(fw4 restart 2>&1 | grep -c "ignoring section")
[ "$FW4" -eq 0 ] && done_ "fw4 クリーン" || none_ "fw4 portsetルール ${FW4}件残存"
ping -c 2 -W 3 1.1.1.1 >/dev/null 2>&1 && done_ "IPv4疎通あり" || none_ "IPv4疎通なし"
echo "========================"
echo "設定済み: $DONE / 未設定: $NONE"
)
ブラウザ動作確認
ベンチマーク該当サイトの構造
偶然にも同じホスティングサービス:KDDI Web Communications Inc.(KWC-NET: 150.60.0.0/16)
CDNなし:オリジンサーバー(Cloudflare等を挟まない)から直接配信
HTTP/1.1スタイル:多数の並列TCPコネクションを開く
対策の有効・無効化切り替え
コマンド:
/etc/init.d/mape-patch start # 有効化
/etc/init.d/mape-patch stop # 無効化
LuCI:
システム > 起動 >
mape-patchの開始停止ボタン
ベンチマーク:
切り替え後、10窓程度リロードして挙動を比較
※3窓以上で体感出来るはず
DS-LITE
Transix・Xpass・v6コネクト
AFTR自動検出:
-
DHCPv6 Option 64からAFTRアドレスを自動取得
-
自動検出失敗時の手動選択
| 選択肢 | ISP | AFTRアドレス |
|---|---|---|
| 1 | transix (東日本) | 2404:8e00::feed:100 |
| 2 | transix (西日本) | 2404:8e01::feed:100 |
| 3 | Xpass | dgw.xpass.jp |
| 4 | v6connect | dslite.v6connect.net |
| 5 | 手動入力 | ユーザー指定 |
Transix・Xpass・v6コネクト設定
DSCPリセット(CS0)
ニチバン対策。IPv4/IPv6両方のDSCPをCS0にリセット
#!/bin/sh
set -e
# パッケージのインストール
PKGS="ds-lite"
command -v opkg && for pkg in $PKGS; do opkg list-installed | grep -qw "$pkg" || opkg install "$pkg" 2>/dev/null; done
command -v apk && for pkg in $PKGS; do apk info -e "$pkg" 2>/dev/null || apk add "$pkg" 2>/dev/null; done
# OpenWrt network APIをロード
. /lib/functions/network.sh
# 変数の定義
DSL="dsl"
DSL6="dsl6"
# AFTR選択肢の定義
AFTR_PROVIDERS="transix-east transix-west xpass v6connect manual"
AFTR_MAP_TRANSIX_EAST="2404:8e00::feed:100"
AFTR_MAP_TRANSIX_WEST="2404:8e01::feed:100"
AFTR_MAP_XPASS="dgw.xpass.jp"
AFTR_MAP_V6CONNECT="dslite.v6connect.net"
echo "DS-Lite AFTR情報を取得中..."
network_flush_cache
# WAN6インターフェースを取得
network_find_wan6 WAN6_IF
if [ -z "$WAN6_IF" ]; then
echo "警告: IPv6 WANインターフェースが見つかりません"
WAN6_IF="wan6"
fi
# WANデバイス(物理)を取得
network_get_physdev WAN_DEVICE "${WAN6_IF}"
if [ -z "$WAN_DEVICE" ]; then
WAN_DEVICE=$(uci -q get network.wan.device || echo "wan")
fi
echo "検出されたWANデバイス: ${WAN_DEVICE}"
# 一時DHCPv6インターフェース作成
uci batch <<EOF
set network.${DSL6}_temp=interface
set network.${DSL6}_temp.proto='dhcpv6'
set network.${DSL6}_temp.device='${WAN_DEVICE}'
set network.${DSL6}_temp.reqaddress='try'
set network.${DSL6}_temp.reqprefix='auto'
commit network
EOF
/etc/init.d/network restart
sleep 10 # DHCPv6応答待機
# ubus経由でAFTRアドレスを取得
DSLITE_AFTR=$(ubus call network.interface.${DSL6}_temp status 2>/dev/null | jsonfilter -e '@.data.aftr' 2>/dev/null)
# 一時インターフェース削除
uci delete network.${DSL6}_temp
uci commit network
# 自動取得成功
if [ -n "$DSLITE_AFTR" ]; then
echo "AFTR自動検出成功: $DSLITE_AFTR"
else
# 自動取得失敗 → 手動選択
echo ""
echo "==============================================="
echo "AFTRアドレスを自動取得できませんでした"
echo "ISPを選択してください"
echo "==============================================="
echo ""
echo "1) transix (東日本) - 2404:8e00::feed:100"
echo "2) transix (西日本) - 2404:8e01::feed:100"
echo "3) Xpass - dgw.xpass.jp"
echo "4) v6connect - dslite.v6connect.net"
echo "5) 手動入力"
echo ""
printf "選択 [1-5]: "
read selection
case "$selection" in
1)
DSLITE_AFTR="$AFTR_MAP_TRANSIX_EAST"
echo "選択: transix (東日本)"
;;
2)
DSLITE_AFTR="$AFTR_MAP_TRANSIX_WEST"
echo "選択: transix (西日本)"
;;
3)
DSLITE_AFTR="$AFTR_MAP_XPASS"
echo "選択: Xpass"
;;
4)
DSLITE_AFTR="$AFTR_MAP_V6CONNECT"
echo "選択: v6connect"
;;
5)
echo ""
echo "AFTRアドレスを入力してください"
echo "(例: gw.transix.jp / 2404:8e00::feed:100)"
printf "AFTR: "
read DSLITE_AFTR
;;
*)
echo "エラー: 無効な選択です"
exit 1
;;
esac
# 入力検証
if [ -z "$DSLITE_AFTR" ]; then
echo "エラー: AFTRアドレスが指定されていません"
exit 1
fi
echo "設定AFTR: $DSLITE_AFTR"
fi
# DSCP zero化(NTT QoS帯域制限回避)
mkdir -p /etc/nftables.d
cat > /etc/nftables.d/10-dscp-zero.nft << 'EOF'
chain dscp_postrouting {
type filter hook postrouting priority mangle; policy accept;
ip dscp set cs0 comment "dscp-reset-v4"
ip6 dscp set cs0 comment "dscp-reset-v6"
}
EOF
fw4 restart 2>/dev/null
# Network設定
uci batch <<EOF
set network.wan.disabled='1'
set network.wan.auto='0'
set network.wan6.disabled='1'
set network.wan6.auto='0'
set network.${DSL6}=interface
set network.${DSL6}.proto='dhcpv6'
set network.${DSL6}.device='${WAN_DEVICE}'
set network.${DSL6}.reqaddress='try'
set network.${DSL6}.reqprefix='auto'
set network.${DSL}=interface
set network.${DSL}.proto='dslite'
set network.${DSL}.peeraddr='${DSLITE_AFTR}'
set network.${DSL}.tunlink='${DSL6}'
set network.${DSL}.mtu='1460'
set network.${DSL}.encaplimit='ignore'
commit network
EOF
# DHCP設定
uci batch <<EOF
set dhcp.${DSL6}=dhcp
set dhcp.${DSL6}.interface='${DSL6}'
set dhcp.${DSL6}.master='1'
set dhcp.${DSL6}.ra='relay'
set dhcp.${DSL6}.dhcpv6='relay'
set dhcp.${DSL6}.ndp='relay'
set dhcp.${DSL6}.ignore='1'
set dhcp.lan.ra='relay'
set dhcp.lan.dhcpv6='relay'
set dhcp.lan.ndp='relay'
set dhcp.lan.force='1'
commit dhcp
EOF
# Firewall設定
uci batch <<EOF
del_list firewall.@zone[1].network='wan'
del_list firewall.@zone[1].network='wan6'
add_list firewall.@zone[1].network='${DSL}'
add_list firewall.@zone[1].network='${DSL6}'
set firewall.@zone[1].masq='1'
set firewall.@zone[1].mtu_fix='1'
commit firewall
EOF
echo ""
echo "DS-Lite設定が完了しました"
echo "何かキーを押すとサービスを再起動します"
read dummy </dev/tty
# サービス再起動
for s in network firewall dnsmasq odhcpd; do /etc/init.d/$s restart 2>/dev/null; done
until ip addr show br-lan 2>/dev/null | grep -q 'inet '; do sleep 1; done
/etc/init.d/ttyd restart 2>/dev/null
echo "完了しました"
フラッシュ&インストールシステム
おすすめ外部サイト
OpenWrt を日本 NTT IPv6 (MAP-E) サービスで動作するように設定
OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト

