0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenWrt IPoE設定 MAP-e(OCNバーチャルコネクト・V6プラス・NURO光 ニチバン対策) DS-LITE(Transix・Xpass・v6コネクト)

0
Last updated at Posted at 2026-02-05

:flag_jp: Japanese article
OpenWrt_icon.png

はじめに

この記事で出来る事

この記事はコピペで動きます
理解は後でOK

  • IPoEの自動設定:
    OCNバーチャルコネクト・v6プラス・nuro光・transix・Xpass・v6コネクトの接続設定

  • マルチセッション(ニチバンベンチ)対策:
    map.shパッチによるポート枯渇問題の解決

  • APKパッケージマネージャー対応:
    従来のOPKGから変更されたAPKに対応

初心者対応構成

ネットワーク自動構成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 提供元・管轄情報
設定ファイルなど

※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窓以上で体感出来るはず


過去版(map.sh差し替え方式)

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 "完了しました"

接続確認

フラッシュ&インストールシステム

aios.png

おすすめ外部サイト

OpenWrt を日本 NTT IPv6 (MAP-E) サービスで動作するように設定

OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト

あとがき

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?