OpenWrt上開啟NAT6為內網提供IPv6支持

我的博客: 菱歌's Blog | 聽見美好
筆記原文地址:OpenWrt上開啟NAT6為內網提供IPv6支持

校園網IPv6免流量闸餐,不限帶寬闸迷,同時也有一些v6 only的PT資源,非常有用,但是大部分情況下使用路由器后,內網設備就無法使用IPv6了⊙雕桑可以通過NAT6為路由器內網設備提供IPv6支持。

坐標THU蜀铲,使用教育網IPv6边琉,運營商的v6沒有測試過。

問題

之前一直使用的relay(中繼)模式為路由器下的各個設備提供IPv6记劝,具體方法可以參考這篇博客变姨,這種模式的好處是可以為內網設備分配到真實的公有IPv6地址,但是因為odhcpd不間斷抽風厌丑,需要經常重啟服務才能使用定欧。

近期突然發(fā)現(xiàn)實驗室的relay配置失效了,具體表現(xiàn)為:能夠分配到IPv6地址但是無法訪問v6網絡怒竿,經過檢查發(fā)現(xiàn)此時分配到的IPv6是2402:f000:xxxxx/128的形式砍鸠,/128表明此時的地址已經過了dhcpv6分配,而relay模式也是借助dhcpv6進行分配耕驰。因而此時只能使用IPv6的NAT爷辱,雖然它有一些效率問題。

NAT6配置

  1. 安裝所需支持耍属,事實上許多OpenWrt系統(tǒng)沒有安裝odhcpdodhcp6c托嚣,前者在這里用于內網v6地址的分配巩检,而后者作為路由器獲取外網v6地址的客戶端厚骗。
    opkg update && opkg install kmod-ipt-nat6 odhcpd odhcp6c
    
  2. 更改內網IPv6 ULA 前綴,也可以再Luci界面中操作兢哭,將首位的f改為d领舰,這樣問題少些。
    uci set network.globals.ula_prefix="$(uci get network.globals.ula_prefix | sed 's/^./d/')"
    uci commit network
    
  3. 設置LAN口dhcp
    uci set dhcp.lan.ra_default='1'
    uci commit dhcp
    
  4. 新建NAT6服務迟螺,內容見NAT6
    touch /etc/init.d/nat6
    vi /etc/init.d/nat6
    
  5. 啟動NAT6服務
    chmod +x /etc/init.d/nat6
    /etc/init.d/nat6 enable
    
  6. /etc/firewall.user中添加轉發(fā)規(guī)則冲秽,否則內網v6流量不能被轉發(fā)。
    ip6tables -t nat -A POSTROUTING -o eth0.2 -j MASQUERADE
    
  7. 重啟路由器
  8. (可選)為PT服務提供UPnP高位端口映射矩父,提高效率锉桑。uTorrent下載效果:


    滿速下載

NAT6服務腳本

#!/bin/sh /etc/rc.common
# NAT6 init script for OpenWrt // Depends on package: kmod-ipt-nat6

START=55

# Options
# -------

# Use temporary addresses (IPv6 privacy extensions) for outgoing connections? Yes: 1 / No: 0
PRIVACY=1

# Maximum number of attempts before this script will stop in case no IPv6 route is available
# This limits the execution time of the IPv6 route lookup to (MAX_TRIES+1)*(MAX_TRIES/2) seconds. The default (15) equals 120 seconds.
MAX_TRIES=15

# An initial delay (in seconds) helps to avoid looking for the IPv6 network too early. Ideally, the first probe is successful.
# This would be the case if the time passed between the system log messages "Probing IPv6 route" and "Setting up NAT6" is 1 second.
DELAY=10

# Logical interface name of outbound IPv6 connection
# There should be no need to modify this, unless you changed the default network interface names
# Edit by Vincent: I never changed my default network interface names, but still I have to change the WAN6_NAME to "wan" instead of "wan6"
WAN6_NAME="wan6"

# ---------------------------------------------------
# Options end here - no need to change anything below

boot() {
        [ $DELAY -gt 0 ] && sleep $DELAY
        logger -t NAT6 "Probing IPv6 route"
        PROBE=0
        COUNT=1
        while [ $PROBE -eq 0 ]
        do
                if [ $COUNT -gt $MAX_TRIES ]
                then
                        logger -t NAT6 "Fatal error: No IPv6 route found (reached retry limit)" && exit 1
                fi
                sleep $COUNT
                COUNT=$((COUNT+1))
                PROBE=$(route -A inet6 | grep -c '::/0')
        done

        logger -t NAT6 "Setting up NAT6"

        WAN6_INTERFACE=$(uci get "network.$WAN6_NAME.ifname")
        if [ -z "$WAN6_INTERFACE" ] || [ ! -e "/sys/class/net/$WAN6_INTERFACE/" ] ; then
                logger -t NAT6 "Fatal error: Lookup of $WAN6_NAME interface failed. Were the default interface names changed?" && exit 1
        fi
        WAN6_GATEWAY=$(route -A inet6 -e | grep "$WAN6_INTERFACE" | awk '/::\/0/{print $2; exit}')
        if [ -z "$WAN6_GATEWAY" ] ; then
                logger -t NAT6 "Fatal error: No IPv6 gateway for $WAN6_INTERFACE found" && exit 1
        fi
        LAN_ULA_PREFIX=$(uci get network.globals.ula_prefix)
        if [ $(echo "$LAN_ULA_PREFIX" | grep -c -E "^([0-9a-fA-F]{4}):([0-9a-fA-F]{0,4}):") -ne 1 ] ; then
                logger -t NAT6 "Fatal error: IPv6 ULA prefix $LAN_ULA_PREFIX seems invalid. Please verify that a prefix is set and valid." && exit 1
        fi

        ip6tables -t nat -I POSTROUTING -s "$LAN_ULA_PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE
        if [ $? -eq 0 ] ; then
                logger -t NAT6 "Added IPv6 masquerading rule to the firewall (Src: $LAN_ULA_PREFIX - Dst: $WAN6_INTERFACE)"
        else
                logger -t NAT6 "Fatal error: Failed to add IPv6 masquerading rule to the firewall (Src: $LAN_ULA_PREFIX - Dst: $WAN6_INTERFACE)" && exit 1
        fi

        route -A inet6 add 2000::/3 gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"
        if [ $? -eq 0 ] ; then
                logger -t NAT6 "Added $WAN6_GATEWAY to routing table as gateway on $WAN6_INTERFACE for outgoing connections"
        else
                logger -t NAT6 "Error: Failed to add $WAN6_GATEWAY to routing table as gateway on $WAN6_INTERFACE for outgoing connections"
        fi

        if [ $PRIVACY -eq 1 ] ; then
                echo 2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/accept_ra"
                if [ $? -eq 0 ] ; then
                        logger -t NAT6 "Accepting router advertisements on $WAN6_INTERFACE even if forwarding is enabled (required for temporary addresses)"
                else
                        logger -t NAT6 "Error: Failed to change router advertisements accept policy on $WAN6_INTERFACE (required for temporary addresses)"
                fi
                echo 2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/use_tempaddr"
                if [ $? -eq 0 ] ; then
                        logger -t NAT6 "Using temporary addresses for outgoing connections on interface $WAN6_INTERFACE"
                else
                        logger -t NAT6 "Error: Failed to enable temporary addresses for outgoing connections on interface $WAN6_INTERFACE"
                fi
        fi

        exit 0
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窍株,隨后出現(xiàn)的幾起案子民轴,更是在濱河造成了極大的恐慌攻柠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件后裸,死亡現(xiàn)場離奇詭異瑰钮,居然都是意外死亡,警方通過查閱死者的電腦和手機微驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門浪谴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人因苹,你說我怎么就攤上這事苟耻。” “怎么了容燕?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵梁呈,是天一觀的道長。 經常有香客問我蘸秘,道長官卡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任醋虏,我火速辦了婚禮寻咒,結果婚禮上,老公的妹妹穿的比我還像新娘颈嚼。我一直安慰自己毛秘,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布阻课。 她就那樣靜靜地躺著叫挟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪限煞。 梳的紋絲不亂的頭發(fā)上抹恳,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音署驻,去河邊找鬼奋献。 笑死,一個胖子當著我的面吹牛旺上,可吹牛的內容都是我干的瓶蚂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宣吱,長吁一口氣:“原來是場噩夢啊……” “哼窃这!你這毒婦竟也來了?” 一聲冷哼從身側響起征候,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杭攻,失蹤者是張志新(化名)和其女友劉穎洒试,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴上,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡垒棋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痪宰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叼架。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衣撬,靈堂內的尸體忽然破棺而出乖订,到底是詐尸還是另有隱情,我是刑警寧澤具练,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布乍构,位于F島的核電站,受9級特大地震影響扛点,放射性物質發(fā)生泄漏哥遮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一陵究、第九天 我趴在偏房一處隱蔽的房頂上張望眠饮。 院中可真熱鬧,春花似錦铜邮、人聲如沸仪召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扔茅。三九已至,卻和暖如春秸苗,著一層夾襖步出監(jiān)牢的瞬間召娜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工难述, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萤晴,地道東北人吐句。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓胁后,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗦枢。 傳聞我的和親對象是個殘疾皇子攀芯,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353