当我在路由器上使用库存 Linksys 固件时,我的联网设备只能正确使用 IPv4 来访问互联网。
当我使用 OpenWRT 15.05.1 时,设备会尝试使用 IPv6 地址连接到各种站点,如果我的 ISP 提供 IPv6 服务,那就太好了,但事实并非如此。
我尝试了一些没有效果的方法:关闭 DHCPv6、禁用 dnsmasq 的 DNS 缓存、设置 dnsmasq 的 DHCP 服务器以提供静态 DNS 服务器地址(8.8.8.8
),并设置 OpenWRT 的内部 DNS 服务器设置以使用该 DNS 服务器。
如何让 OpenWRT 停止告诉设备可以使用 IPv6?
联网设备上的命令结果
结果ip addr
是:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:1a:80:7a:4e:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.107/24 brd 192.168.1.255 scope global dynamic enp6s0
valid_lft 42521sec preferred_lft 42521sec
inet6 fd7f:77c6:629f::9e8/128 scope global
valid_lft forever preferred_lft forever
inet6 fd7f:77c6:629f::4e3/128 scope global
valid_lft forever preferred_lft forever
inet6 fd7f:77c6:629f:0:21a:80ff:fe7a:4e47/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::21a:80ff:fe7a:4e47/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:1d:e0:44:04:57 brd ff:ff:ff:ff:ff:ff
结果route -6
是:
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
fd7f:77c6:629f::4e3/128 :: U 256 0 0 enp6s0
fd7f:77c6:629f::9e8/128 :: U 256 0 0 enp6s0
fd7f:77c6:629f::/64 :: U 100 1 3 enp6s0
fd7f:77c6:629f::/48 fe80::c256:27ff:fe77:37a7 UG 100 0 0 enp6s0
fe80::/64 :: U 256 2 10 enp6s0
::/0 :: !n -1 1 729 lo
::1/128 :: Un 0 3 6 lo
fd7f:77c6:629f::4e3/128 :: Un 0 1 0 lo
fd7f:77c6:629f::9e8/128 :: Un 0 1 0 lo
fd7f:77c6:629f:0:21a:80ff:fe7a:4e47/128 :: Un 0 2 3 lo
fe80::21a:80ff:fe7a:4e47/128 :: Un 0 2 30 lo
ff00::/8 :: U 256 2 67 enp6s0
::/0 :: !n -1 1 729 lo
ping6 google.com
和的结果ping6 2607:f8b0:4008:808::200e
是:
connect: Network is unreachable
答案1
一个更简单的方法是通过 SSH 进入你的 OpenWrt 路由器并执行以下命令:
uci set 'network.lan.ipv6=off'
uci set 'network.wan.ipv6=off'
uci set 'dhcp.lan.dhcpv6=disabled'
/etc/init.d/odhcpd disable
uci commit
第一个命令禁用 IPv6 LAN 接口,第二个命令禁用 IPv6 WAN 接口,第三个和第四个命令禁用 DHCPv6 服务器并uci commit
提交更改。
更新
看来我的信息已经过时了……设置有点不同,这些都是附加信息。现在这些信息应该是 2021 年的最新信息。
语法稍有改变:
uci set 'network.lan.ipv6=0'
uci set 'network.wan.ipv6=0'
uci set 'dhcp.lan.dhcpv6=disabled'
/etc/init.d/odhcpd disable
uci commit
然后禁用 RA 和 DHCPv6,这样就不会分发任何 IPv6 IP:
uci -q delete dhcp.lan.dhcpv6
uci -q delete dhcp.lan.ra
uci commit dhcp
/etc/init.d/odhcpd restart
您现在可以禁用 LAN 委派:
uci set network.lan.delegate="0"
uci commit network
/etc/init.d/network restart
您不妨禁用 odhcpd:
/etc/init.d/odhcpd disable
/etc/init.d/odhcpd stop
最后,您可以删除 IPv6 ULA 前缀:
uci -q delete network.globals.ula_prefix
uci commit network
/etc/init.d/network restart
更新2
引用@Kurt Fitzner:
使用 ifconfig 显示所有网络设备并注意哪些设备具有 IPv6 地址。然后通过图形 OpenWRT 界面导航到网络->接口,并选择设备选项卡。对于每个具有 IPv6 地址的设备,选择该设备的“配置”并取消选中“启用 IPv6”。
答案2
在初始安装(或重置设置)时,OpenWrt 会生成一个唯一的本地地址前缀并将 ULA 分配给网络中的所有设备,即使没有全局 IPv6 连接,也允许它们通过 IPv6 进行内部通信。
通常情况下,这种方法很有效,但以下两种情况除外:
- 终端设备无论如何都会尝试路由全球 IPv6 流量,尽管此地址范围不可用于此目的。您的路由表并未表明正在发生这种情况,并且过去十年左右没有一个常用的操作系统会这样做。
- 应用程序行为不当,在计算机没有全局 IPv6 连接(或更具体地说,没有默认路由)时尝试建立全局 IPv6 连接。根据您的描述,似乎就是这样的。
明确地说:通过宣传 ULA 前缀,OpenWrt不是告诉您的设备可以通过 IPv6 访问互联网。它只是告诉它们可以通过 IPv6 访问您的家庭网络。
长期解决方案是修复行为不当的应用程序。如果您在某个应用程序中遇到了此行为,则应将其作为错误报告给其开发人员。
短期的解决方法是使用 OpenWrt不是宣传 ULA 前缀。您可以访问网络>接口,空白IPv6 ULA 前缀框,然后单击保存并应用。这将阻止 OpenWrt 通告 ULA 前缀。如果您将路由器的设置重置为默认设置,则可能需要再次执行此操作。
答案3
/etc/modules.d 包含引导时加载的内核模块链接。只需删除 ip6tables、ipt6-nat 和 nf-conntrack6 链接,然后重新启动即可。IPv6 将永远消失,除非您进行硬重置。
这种方法的另一个好处是可以释放更多的 RAM,因为模块从未加载。