ipv6并不提倡使用nat,ipv6地址能够实现端对端通信,中间无需像ipv4那样经过nat地址转换,这对于下载工具bt ,电驴之类的而言是简便的,每个设备都拥有唯一的公网地址.
这同时也是存在隐患的,这样意味着别人可以根据ip地址访问到你的设备,如果你的设备仅仅提供内部网络的服务 例如 samba ftp 家庭nas 文件共享之类的,或者提供内部账号验证的如kerberos openldap,如果将设备暴露在公网上是不安全的,如果中间隔着一个访问限制设备–如 ipv4的网关 这样外面的地址将无法直接内网的设备,ipv6的nat在一些场合还是必要的
硬件路由似乎没有提供nat6的功能 仅支持网络运营商下发的ipv6公网前缀,路由器内部的设备只能使用其前缀的ipv6公网地址
定义 ULA地址前缀
设置 ipv6 ula地址前缀
本地唯一 IPv6单播地址 ULA,Unique Local IPv6 Unicast Address
地址段fc00::/7,包含fc00::/8和fd00::/8
fc00::/8未被定义使用 ; fd00::/8 可以使用
设置openwrt 的 ULA 前缀 ,在该openwrt下的所有主机都使用该ula前缀作为ipv6 ula地址,这就像 ipv4的子网地址 192.168.1.0/24
界面设置:
也可以使用 终端设置
/etc/config/network
#设置ula前缀
option ip6addr ‘fddc:6e16:9a74::/64’
ULA地址前缀 只要是 fd开头的 后面的 16进制数字可以任意设置你喜欢的–只要符合ipv6规范
ipv6地址 分为 每4个16进制为一个块 一共 8个块 而ula地址最多可以设置到前面 4个块,后面4个块留给客户机使用–作为它们的主机id
也就是说 fddc:6e16:9a74 可以设置 fd00:1111:2222:3333::/64 这样的样式
如果你不指定如何产生 ula地址 使用这个python脚本 会根据你的mac地址产生一个随机的ula前缀
https://github.com/yoshi0808/ula-generator
openwrt lan网卡ip6class设置为loal
参考
https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6#dhcpv6
https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6#ula_prefix
安装软件
opkg install ip6tables kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra luci-proto-ipv6 iputils-traceroute6 iptables-mod-ipopt
设置 lan网卡的ip6class 选项为local ,这样 openwrt 不会从上游运营商那里获取的pd前缀下发给 下游主机,只会将系统的ULA下发给下游主机这相当于ipv4分配 192.168.1.0/24的子网地址那样 根据上面例子
下游主机的ipv6前缀为 fddc:6e16:9a74:xxxx:xxxx:xxxx:xxxx
启动这个选项意味着 该openwrt子网内部的其他主机不能获取网络运营商下发的公网ipv6前缀–不再拥有公网ipv6地址
方法几种
1 编辑 /etc/config/network
config interface ‘lan’
#配置为local
list ip6class ‘local’
2 使用 uci
uci -q set network.lan.ip6class=‘local’
配置 lan网卡地址后缀
可以的选项
eui64 使用使用EUI64 地址 这是根据mac地址换算生成固定主机id,类似于静态地址
random 每隔一定的时间产生变化的后缀地址,多于移动客户端,如手机wifi客户机
::1 按照上述ula前缀 配置完成后的lan地址为 fddc:6e16:9a74::1
::1:2 这是静态配置主机id 如 fddc:6e16:9a74:1111:2222::3333
也可以在 /etc/config/network 配置
config interface ‘lan’
option ip6ifaceid ‘::1’
这里以 ::1 为例,假设openwrt同时提供dns服务,需要一个固定的地址
这样 LAN的ipv6 ula地址为 fddc:6e16:9a74::1
配置 odhcpd
openwrt的odhcpd 实现了 dhcp服务器和 radvd的功能
ipv6的路由通告通告icmpv6实现 而radvd就是实现该功能的,dhcp并不提供
参考 https://openwrt.org/docs/techref/odhcpd
安装odhcpd
opkg install odhcpd
###############################################
题外的,openwrt的odhcpd性能真的差,不如isc-dhcpd
单独安装 odhcpd-ipv6only ipv6部分由odhcpd提供 ipv4的由isc-dhcd提供
方法
先安装完整的 odhcpd
opkg install odhcpd
然后 安装 odhcpd-ipv6only
opkg install odhcpd-ipv6only
再卸载 完整版 odhcpd
opkg remove odhcpd
然后 在 /etc/config/dhcp
dhcp ‘lan’ 段落
#option dhcpv4 ‘disable’ 直接注释掉
###############################################
配置 dhcp
编辑 /etc/config/dhcp
config dhcp ‘lan’
option interface ‘lan’
option ra ‘server’
option dhcpv6 ‘server’
option dhcpv4 ‘server’
option ra_management ‘1’
#如果你配置dns,这是搜索域,没有则注释掉
list domain ‘test.com’
#修改ra通告间隔,linux主机不会主动发送rs请求,需要周期接收组播ra通告
option ra_mininterval ‘60’
option ra_maxinterval ‘180’
option ra_default ‘1’
#如果你配置内部dns服务器地址 设置这些地址,没有则注释掉
list dns ’ fddc:6e16:9a74::1’
list dns ‘192.168.0.1’
option ra_dns ‘1’
option start ‘100’
option limit ‘150’
option leasetime ‘12h’
禁用 ndp代理
ndp不要在 /etc/config/dhcp 出现,否则会不正常,不知原因
然后重启 网卡和odhcpd 之后就可以看到配置 lan的ula地址
/etc/init.d/network restart
/etc/init.d/odhcpd restart
配置 ipv6 nat6的默认路由
按照上述内容 客户机可以分配地址ula地址 但还无法 通过nat6 地址转换连接到外网 需要配置ip6tables MASQUERADE 和添加默认路由
#!/bin/sh
# ipv6 nat
# touch /etc/hotplug.d/iface/99-pppoenat6
# chmod 750 /etc/hotplug.d/iface/99-pppoenat6
if [ "$DEVICE" = "pppoe-wan" -o "$INTERFACE" = "wan_6" ]; then
if [ "$ACTION" = "ifup" ]; then
# option ip6class 'local'
#不要设置ip6class 这样需要重启网卡应该手动设置后重启网卡
#uci -q set network.lan.ip6class='local'
#如果pppoe-wan获取了ipv6公网地址 执行nat操作 添加为默认路由
if [ $(cat /proc/net/if_inet6 |grep pppoe-wan|grep -v ^[fF] | wc -c) -ne 0 ]; then
(ip6tables -t mangle -C POSTROUTING -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu >/dev/null 2>&1) || \
ip6tables -t mangle -A POSTROUTING -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
(ip6tables -t nat -C POSTROUTING --src fc00::/6 -o pppoe-wan -j MASQUERADE >/dev/null 2>&1) || \
ip6tables -t nat -A POSTROUTING --src fc00::/6 -o pppoe-wan -j MASQUERADE
(ip6tables -t filter -C FORWARD -o pppoe-wan -j ACCEPT >/dev/null 2>&1) || \
ip6tables -t filter -A FORWARD -o pppoe-wan -j ACCEPT
:<<!
#已经取代 在 /etc/odhcp6c.user 添加默认路由
#开机 ppppoe-wan 慢于当前脚本启动 路由表添加不会成功 因为pppoe-wan不存在
#一个循环判断直到添加成功就退出
(
while [ 0 -eq 0 ]
do
if [ $(cat /proc/net/if_inet6|grep -wc 'pppoe-wan') -ne 0 ]; then
ip -6 route add default dev pppoe-wan metric 600 >/dev/null 2>&1
break
fi
sleep 5
done
)&
!
::<<! 或者不要永远执行
(
MAXCOUNT=100
for i in $(seq 1 $MAXCOUNT)
do
if [ $(cat /proc/net/if_inet6|grep -wc 'pppoe-wan') -ne 0 ]; then
ip -6 route add default dev pppoe-wan metric 600 >/dev/null 2>&1
break
fi
sleep 3
[ $i -ge $MAXCOUNT ] && logger -t "nat6 " "ip -6 route add default via fe80 failed !"
done
)&
!
fi
fi
elif [ "$INTERFACE" = "wan" -a "$ACTION" = "ifdown" ]; then
ip6tables -t nat -D POSTROUTING --src fc00::/6 -o pppoe-wan -j MASQUERADE
ip6tables -t mangle -D POSTROUTING -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
ip6tables -t filter -D FORWARD -o pppoe-wan -j ACCEPT
#删除默认路由
ip -6 route del default dev pppoe-wan >/dev/null 2>&1
fi
添加到 /hotplug.d/iface 实现 pppoe-wan网卡启动自动加载该脚本
添加ipv6 默认网关
/etc/odhcp6c.user
#ipv6 odhcp6c 客户端更新 添加默认路由
#使用测试 kill -SIGUSR2 $(pidof odhcp6c)
DHCPC_EVENT="${2}"
DHCPC_IF="${INTERFACE}"
DHCPC_GW="${SERVER}"
DHCPC_DEV="${1}"
if [ "${DHCPC_DEV}" = "pppoe-wan" ]; then
case ${DHCPC_EVENT} in
(bound|rebound|informed)
ip -6 route delete default dev "${DHCPC_DEV}"
ip -6 route add default via "${DHCPC_GW}" dev "${DHCPC_DEV}" metric 600
;;
(unbound|stopped)
ip -6 route delete default dev "${DHCPC_DEV}"
;;
esac
fi
测试
访问 https://www.test-ipv6.com/
ping -6 www.qq.com