找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 6550|回复: 3

Linksys EA4500 / K2 / DW33D 配置 IPv6 NAT 实录,支持 Android

[复制链接]
发表于 2017-4-12 14:48 | 显示全部楼层 |阅读模式
本帖最后由 dsanke 于 2017-6-10 21:16 编辑

前几天搞的IPV6 Relay穿透中继很不稳定,不知道是odhcpd还是什么别的东西有问题。
反正没有IPV6公网IP的需求,我也就看看U2B,索性用NAT解决。固件用的是lean的LEDE R5,之前他的OP内核不支持IPV6 NAT。
linux kernel 版本是 4.4.50

1.安装相关软件
  1. opkg update && opkg install kmod-ipt-nat6 ip6tables-mod-nat
复制代码

2.设置 网络 - 接口 - Global ULA Prefix
这里不能用F开头,不然有些网站速度奇慢。

3.设置 odhcpd
网络 - 接口 - LAN
IPv6 分配长度 :64

这里RA交给radvd来做,odhcpd的RA不支持 RFC6106,Android设备用SLAAC获取不到正确的DNS。
而 Windows 的 SLAAC 获取 DNS 是从 DHCPv6 服务器来的,所以这里需要填上DNS。如果在radvd启用stateful的话,Android设备又不能获取到DNS,算是很奇怪吧。
4. 配置NAT6
新建/etc/init.d/nat6
写入如下内容:
  1. #!/bin/sh /etc/rc.common
  2. # NAT6 init script for OpenWrt // Depends on package: kmod-ipt-nat6

  3. START=55

  4. # Options
  5. # -------

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

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

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

  14. # Logical interface name of outbound IPv6 connection
  15. # There should be no need to modify this, unless you changed the default network interface names
  16. # 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"
  17. WAN6_NAME="wan6"

  18. # ---------------------------------------------------
  19. # Options end here - no need to change anything below

  20. boot() {
  21.         [ $DELAY -gt 0 ] && sleep $DELAY
  22.         logger -t NAT6 "Probing IPv6 route"
  23.         PROBE=0
  24.         COUNT=1
  25.         while [ $PROBE -eq 0 ]
  26.         do
  27.                 if [ $COUNT -gt $MAX_TRIES ]
  28.                 then
  29.                         logger -t NAT6 "Fatal error: No IPv6 route found (reached retry limit)" && exit 1
  30.                 fi
  31.                 sleep $COUNT
  32.                 COUNT=$((COUNT+1))
  33.                 PROBE=$(route -A inet6 | grep -c '::/0')
  34.         done

  35.         logger -t NAT6 "Setting up NAT6"

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

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

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

  60.         if [ $PRIVACY -eq 1 ] ; then
  61.                 echo 2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/accept_ra"
  62.                 if [ $? -eq 0 ] ; then
  63.                         logger -t NAT6 "Accepting router advertisements on $WAN6_INTERFACE even if forwarding is enabled (required for temporary addresses)"
  64.                 else
  65.                         logger -t NAT6 "Error: Failed to change router advertisements accept policy on $WAN6_INTERFACE (required for temporary addresses)"
  66.                 fi
  67.                 echo 2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/use_tempaddr"
  68.                 if [ $? -eq 0 ] ; then
  69.                         logger -t NAT6 "Using temporary addresses for outgoing connections on interface $WAN6_INTERFACE"
  70.                 else
  71.                         logger -t NAT6 "Error: Failed to enable temporary addresses for outgoing connections on interface $WAN6_INTERFACE"
  72.                 fi
  73.         fi

  74.         exit 0
  75. }
复制代码

5.配置NAT6 服务
  1. chmod +x /etc/init.d/nat6
  2. /etc/init.d/nat6 enable && /etc/init.d/nat6 start
复制代码

6.修改防火墙配置
禁用“Allow-ICMPv6-Forward” 规则
  1. uci set firewall.@rule["$(uci show firewall | grep 'Allow-ICMPv6-Forward' | cut -d'[' -f2 | cut -d']' -f1)"].enabled='0'
  2. uci commit firewall
复制代码

自定义规则加一条:
  1. ip6tables -t nat -I POSTROUTING -s $(uci get network.globals.ula_prefix) -j MASQUERADE
复制代码

7.开启IPV6转发
修改/etc/sysctl.conf
加上如下内容:
  1. net.ipv6.conf.default.forwarding=2
  2. net.ipv6.conf.all.forwarding=2
  3. net.ipv6.conf.default.accept_ra=2
  4. net.ipv6.conf.all.accept_ra=2
复制代码

8.配置radvd
由于OpenWRT和LEDE目前的trunk都没有radvd了,所以要自己编译一个
把radvd放在/bin,给执行权限
  1. chmod +x /bin/radvd
复制代码
新建/etc/radvd.conf,权限644(刚开始设了777结果radvd跑不起来)
写入如下内容:
  1. interface br-lan
  2. {
  3.         AdvSendAdvert on;
  4.         AdvManagedFlag on;
  5.         #配置M标记为0,禁用stateful
  6.         AdvOtherConfigFlag on;
  7.         #配置O标记为1,启用stateless
  8.         MinRtrAdvInterval 3;
  9.         MaxRtrAdvInterval 10;
  10.         AdvDefaultPreference high;
  11.         AdvHomeAgentFlag off;
  12.         prefix dddd:cccc:bbbb:aaaa::/64
  13.         #配合Global ULA Prefix
  14.         {
  15.                 AdvOnLink on;
  16.                 AdvAutonomous on;
  17.                 AdvRouterAddr off;
  18.         };
  19.         RDNSS dddd:cccc:bbbb:aaaa::1 2001:4860:4860::8888
  20.         #RFC 6106 配置 DNS
  21.         {
  22.                 AdvRDNSSLifetime 30;
  23.         };
  24. };
复制代码

9.配置radvd服务
新建/etc/init.d/radvd,写入如下内容,并给执行权限
  1. #!/bin/sh /etc/rc.common

  2. START=99

  3. stop() {
  4.         killall radvd
  5. }

  6. start() {
  7.         /bin/radvd
  8. }
复制代码
执行
  1. /etc/init.d/radvd enable && /etc/init.d/radvd start
复制代码

启动服务

至此大功告成。

编译radvd单独来讲:
1.我的路由器是Linksys EA4500,架构是ARM v5,需要交叉编译工具链
先进行一次不完整的固件编译(比较节省时间,编译起来之后Ctrl+Z中断)
再从LEDE的源码里找,
lede/source/staging_dir/toolchain-arm_xscale_gcc-5.4.0_musl_eabi/bin
记下位置
2.配置radvd
http://www.litech.org/radvd/ 下载源码并解压
在radvd目录内执行(假设lede是在~目录下)
  1. ./configure --host=arm-openwrt-linux CC=~/lede/source/staging_dir/toolchain-arm_xscale_gcc-5.4.0_musl_eabi/bin/arm-openwrt-linux-gcc
复制代码

3.开始make
这个编译速度很快,一下子就好了,得到radvd二进制文件

相关文件我打包传1个附件包含arm_xscale的radvd,以及上面的nat6等脚本和配置文件。

再传一个ramips的radvd给K2 Y1之类的用,适合linux kernel 4.4的
还有ar71xx的给dw33d用,也是kernel 4.4用的


折腾这个的时候参考了如下内容,对原作者表示衷心的感谢
IPv6 NAT + 公网地址 DHCPv6 配置实录,再也不用担心我的Android!
http://koolshare.cn/thread-68208-1-1.html
IPv6 位址的取得 (Autoconfiguration and DHCPv6)
http://hlchang.com/?p=217 ;
openwrt+ndp+ndppd+radvd+dhcpv6,ipv6穿透配置指南
http://bbs.swdyz.com/thread270sw1dyz1.shtml
【转载】 通过openwrt的NAT6转发,使后端设备获得ipv6网络
https://www.right.com.cn/Forum/thread-198647-1-1.html
【进阶类教程】多种无PD的情况下给内网配置IPv6的方法
http://koolshare.cn/thread-46415-1-1.html
2012台網中心電子報─IPv6位址配發技術介紹
http://www.myhome.net.tw/2012_09/p03.htm ;
IPv6 DNS
https://wiki.openwrt.org/doc/howto/ipv6.dns
Router Advertisement (radvd) configuration
https://wiki.openwrt.org/doc/techref/odhcpd
odhcpd
https://wiki.openwrt.org/doc/uci/radvd ;
Linux(RedHat6.4)下配置radvd和dhcpv6
http://xiaoshe.blog.51cto.com/7977863/1305084/ ;






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-4-12 17:24 | 显示全部楼层
感谢楼主分享经验。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-9-30 18:22 | 显示全部楼层
你好,我也是ea4500,请问lean大大的LEDE R5固件在哪下载呢?谢谢!

点评

http://code.taobao.org/svn/GargoyleTools/LEDE-R5-EA3500%20EA4500/lede-17.01.0-R5-kirkwood-linksys-EA4500r-squashfs-sysupgrade.rar  详情 回复 发表于 2017-10-10 13:44
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-10-10 13:44 | 显示全部楼层
sammy84 发表于 2017-9-30 18:22
你好,我也是ea4500,请问lean大大的LEDE R5固件在哪下载呢?谢谢!

http://code.taobao.org/svn/Gargo ... shfs-sysupgrade.rar
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-18 10:58

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表