Padavan/Openwrt/LEDE下实现ipv6 nat

作者: libgcc | 来源:发表于2017-05-17 13:03 被阅读7397次

    目录

    • 环境
    • 方案比选
    • 用NAT搞定
    • napt66.ko下载(适用于3.4内核的padavan)

    环境

    • 网络 :scut南校区校园网,双栈接入。ipv6无状态自动分配公网地址,不限速不限流不断网,但封掉了80端口;ipv4采用drcom认证(802.1x?),可用scutclient认证,似乎是固定ip,由于大一新生不能开网所以不太了解。
    • 设备:斐讯K2(padavan和PandoraBox固件);品胜AR71xx小路由(Openwrt CC以及LEDE)

    即便是不开网,宿舍网口仍可以分配到ipv6的公网ip,只是似乎封掉了80端口,很多网站打不开,但443端口没有封,你可以直接上https的YouTube和google.co.jp(google.com不行,估计是特殊照顾了)

    这样,完全可以通过ipv6的各种代理满足上网需求,如vpn,ss等等,然而国内的vps商普遍没有ipv6,所以必须选择香港或者境外的vps或者代理商。在这里我使用的是linode还有vultr,也曾经试过digitalocean,不过这家喜欢动不动就封账号,现在也不敢用了。

    这样可以解决大部分上网需求,不过要想让路由器内的手机,电脑也能拥有原生的ipv6(虽然是不能访问80端口的残废)以访问一些特殊资源,如北邮iptv(https://tv.byr.cn 少数支持ipv6+https的iptv),免vps流量看YouTube(直接走ipv6而不经代理),就还需要再折腾一下。


    两种方案

    • 中继方案:使用6relayd,odhcpd等,让路由器内的设备获取2xxx开头的公网ipv6地址
    • NAT方案:使用nat6/napt66+radvd/odhcpd,让路由器内的设备获取内网ipv6地址,然后路由器做NAT转发

    据说6relayd有缺陷,现在也已经不在op/cc的软件包列表里了(用odhcpd代替了),padavan的entware倒是还有6relayd。经过数日折腾,虽然能让内网设备获取到公网ipv6地址,但是链接并不稳定,看iptv过一会就会卡住,遂放弃6relayd。
    然后去lede折腾odhcpd中继,也能让内网设备获取到ipv6公网ip,但是上不了网,不知原因所在,最终放弃了中继方案。


    用NAT搞定

    Padavan+NAPT66

    Padavan的Linux内核原生不支持ipv6的NAT;
    NAPT66是北邮学生开发的在较旧内核的Linux上实现ipv6 nat的内核模块;
    项目地址:https://github.com/mzweilin/napt66
    要想使用NAPT66,需要对内核代码做修改,参考:
    http://www.jianshu.com/p/3a9ec169336e

    捕获.PNG

    接着修改napt66的Makefile,用工具链编译出.ko模块,我的工具链在/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/,内核源码在/opt/rt-n56u/trunk/linux-3.4.x ,修改Makefile为:

    # Makefile under 2.6.25
    ifneq ($(KERNELRELEASE),)
    #kbuild syntax. dependency relationshsip of files and target modules are listed here.
    obj-m := napt66.o
    napt66-objs := napt66_main.o napt66_conntrack.o napt66_nat.o napt66_hash_table.o napt66_ftp_alg.o
    else
    PWD  := $(shell pwd)
    KVER ?= $(shell uname -r)
    KDIR := /opt/rt-n56u/trunk/linux-3.4.x
    all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=mips CROSS_COMPILE=/opt/rt-n56u/toolchain-mipsel/toolchain-3.4.x/bin/mipsel-linux-uclibc-
    clean:
        rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.symvers *.order
    endif
    

    注意,编译NAPT66时首先要编译好工具链,并且要完整编译过一次固件并且未执行./clear_tree才能成功
    本文末尾提供编译好的napt66.ko下载,适用于padavan的3.4内核

    把napt66.ko拷贝到/opt或者/etc/storage,加载模块:

    insmod /opt/napt66.ko wan_if=eth2.2  #napt66.ko的路径,wan_if=WAN口名称
    

    要想每次开机自动加载,只需要在/opt/etc/init.d/S01system的func_start()内加入这行命令即可(不要添加在自定义设置-脚本-启动后中,因为该脚本执行时可能还没有挂载上/opt

    S01system

    至此NAPT66已经安装完成,接下来是路由器上的配置。
    由于我们的ipv6禁止了80端口,只能上为数不多的网站,这里还是用ss-tunnel做DNS转发(ipv6的dns也存在污染),需要启动两个ss-tunnel 一个给ipv4用,一个给ipv6用。
    假定ipv6 dns的ss-tunnel监听端口为5301;ipv4的监听端口为5300
    在自定义配置文件 "dnsmasq.servers"下填入

    server=/ytimg.com/youtube.com/googlevideo.com/byr.cn/wikipedia.org/127.0.0.1#5301
    server=127.0.0.1#5300
    

    如果没有你没有SS,也可以设置成使用Google的ipv6 dns,但可能会有污染

    server=2001:4860:4860::8844#53
    

    dnsmasq配置完成,然后设置ipv6地址分配

    外部网络(WAN) - IPv6设置,按下图设置:

    05.png

    最后别忘了把ip6tables禁用,在自定义设置 - 脚本 - 防火墙规则中,加入

    ip6tables -F
    ip6tables -P INPUT ACCEPT
    ip6tables -P FORWARD ACCEPT
    ip6tables -P OUTPUT ACCEPT
    

    重启路由器,手机/电脑启用ipv6并且设置为自动获取,看能否获取到内网ipv6地址:


    ipv6.PNG

    用浏览器访问[fc00:101:101::1],测试能否进入路由器页面
    最后用浏览器打开 https://tv.byr.cn (我这里测试,用chrome打开较慢,约需要15s,不过进去了网页就不会卡)
    enjoy


    OpenWrt / LEDE / PandoraBox + ipv6 nat

    参考:

    http://blog.csdn.net/cod1ng/article/details/45421025
    注意在 "ip6tables -t nat -A POSTROUTING -o eth0.2 -j MASQUERADE"中,eth0.2要改成你自己的网卡名
    如果路由器自身能获取到ipv6地址却无法ping通外网ipv6(多半是PandoraBox),请尝试如下操作:

    uci set network.wan6.sourcefilter=0
    uci commit network
    ifup wan6
    

    另外,如果按照上文配置后内网机器能Ping通ipv6但是无法上网,可能是因为ip6tables阻断,需要关闭ip6tables

    ip6tables -F
    ip6tables -P INPUT ACCEPT
    ip6tables -P FORWARD ACCEPT
    ip6tables -P OUTPUT ACCEPT
    

    napt66.ko下载(适用于3.4内核的padavan)

    链接: https://pan.baidu.com/s/1qYCuQ3U 密码: pyja

    相关文章

      网友评论

      • 捏不圆太阳:楼主您好,我们学校的网络情况是这样:ipv6不需要登陆使用,在windows插网线可以直接获取ipv6地址,但在Mac和padavan路由器下插网线无法获取,路由器log一直显示get_ip6_by_name() failed,这是什么情况啊。。然后我关闭(不关闭依然不行)了dhcpv6,在控制台里输入这三条命令
        modprobe ip6table_mangle
        ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth2.2
        brctl addif br0 eth2.2
        路由器端依然无法获取ipv6地址,但连上WiFi的设备都分配到地址了。。
        libgcc:@捏不圆太阳 你们分配的v6地址是有状态的
        捏不圆太阳:已搞定,,获取ipv6wan改成ia-na。。不知道为什么
      • 街东:Windows 试了可以,但 Ubuntu 和 OpenSUSE 不行,请问 Linux 会优先解析 IPv4 地址吗?
        libgcc:@街东 因为我现在只上那几个常用的v6站,所以还应付的过来……
        街东:@libgcc 噢~~这是不是就是类似于维护了一长串 IPv6 hosts 了
        libgcc:@街东 dns的问题比较麻烦,如果上游dns返回v4和v6地址的话,似乎没法在dnsmasq里强制指定v6。我现在的临时解决办法是在路由器的dnsmasq里用address=强制指定v6地址……
      • 木子识时务:你好,请问下面的这些命令是关闭 ip6tables 吗?
        我怎么感觉像是开启。
        谢谢。

        ip6tables -F
        ip6tables -P INPUT ACCEPT
        ip6tables -P FORWARD ACCEPT
        ip6tables -P OUTPUT ACCEPT
        libgcc:@木子识时务 不影响……这只操作filter表
        木子识时务:@libgcc 厉害。
        另外一个疑问,禁用的话会影响下面这个命令吗?
        ip6tables -t nat -A POSTROUTING -o eth0.2 -j MASQUERADE
        libgcc:@木子识时务 accept三条chain,相当于关闭了...
      • 曹恭泽:newifi mini RT-AC54U 3.4.3.9
        insmod 倒是没什么问题,但是网页端的 log 一直弹出:
        kernel: get_ip6_by_name() failed
        请问这是不是一定要自己编译一遍了?
        曹恭泽:@libgcc 谢谢...真是奇了怪了...虽然外网好了之后我就放弃了,但是学校是有 ipv6 接入的
        libgcc:@曹恭泽 这是还没获取到ipv6公网地址...
      • 且听风叹:博主 我用你的napt66.so文件出现个错误
        insmod的时候 提示我invalid module format 然后我dmesg查看 他提示我内核不符,你的.so要求3.4.113 SMP mod_unload 我的k2p没有SMP 这应该怎么办?
        libgcc:@且听风叹 没折腾过K2P的老毛子...
        且听风叹:emm 找了个7621aCPU的型号(RT-N56UB1)编译了下固件然后再编译napt66 这次可以insmod了
        且听风叹:应该是K2P开启了SMP,而编译napt66的k2内核没有smp因为7620是单核,7621a是2c4t的
        编译k2p是napt66该怎么操作?

      本文标题:Padavan/Openwrt/LEDE下实现ipv6 nat

      本文链接:https://www.haomeiwen.com/subject/akbrxxtx.html