双栈网络时开启 IPv4 优先
查看当前状态
要查看当前 IP 转发的状态, 执行以下命令
1 | 查看IPv4的拥堵算法 |
如果返回 0, 表示 IP 被禁用;如果返回 1, 表示 IP 已启用
检查可用的控制算法
1 sysctl net.ipv4.tcp_available_congestion_control输出为:
1 net.ipv4.tcp_available_congestion_control = reno cubic
tcp_bbr模块没有被加载进来,所以bbr不在可用列表中。加载
tcp_bbr:
1 modprobe tcp_bbr编辑
/etc/modules-load.d/modules.conf,让tcp_bbr模块开机自动加载
1
2
3
4
5
6 # /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
tcp_bbr再看一下可用的控制算法,
bbr现在可用了:
1 sysctl net.ipv4.tcp_available_congestion_control输出结果:
1 net.ipv4.tcp_available_congestion_control = reno cubic bbr开启 BBR
查看当前使用的控制算法:
1 sysctl net.ipv4.tcp_congestion_control当前使用的控制算法:
1 net.ipv4.tcp_congestion_control = cubic编辑
/etc/sysctl.conf,添加下面的配置:
1
2 net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr保存后,重新加载使配置生效:
1 sysctl -p以上设置对
ipv6同样生效。OpenWRT
对于 OpenWRT,需要先安装
kmod-tcp-bbr,如果进行过版本升级,比如从 18 升级到 19,也需要重新安装:
1 opkg install kmod-tcp-bbr测试一下模块加载情况:
1 modprobe tcp_bbr输出:
1 tcp_bbr is already loaded设置
kmod-tcp-bbr为开机加载,74-tcp-bbr前面的数字根据实际情况调整:
1
2 cd /etc/modules-boot.d/
ln -sf ../modules.d/74-tcp-bbr 74-tcp-bbr编辑
/etc/sysctl.conf文件,开启bbr:
1
2 net.core.default_qdisc=fq_codel
net.ipv4.tcp_congestion_control=bbr
使用Ping6可以测试
sudo apt install iputils-ping使用 IPv4 更新和下载
如果你希望
apt强制使用 IPv4,可以在命令中添加-o选项,或者修改配置文件。
临时使用 IPv4: 你可以在运行
apt命令时临时指定使用 IPv4:
1
2 sudo apt -o Acquire::ForceIPv4=true update
sudo apt -o Acquire::ForceIPv4=true install <package_name>永久配置: 如果你希望永久使用 IPv4,可以编辑
apt的配置文件:
1 echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4使用 IPv6 更新和下载
如果你希望
apt强制使用 IPv6,可以使用类似的方法:
临时使用 IPv6: 运行
apt命令时临时指定使用 IPv6:
1
2 sudo apt -o Acquire::ForceIPv6=true update
sudo apt -o Acquire::ForceIPv6=true install <package_name>永久配置: 如果你希望永久使用 IPv6,可以编辑
apt的配置文件:
1 echo 'Acquire::ForceIPv6 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv6验证设置
无论你选择使用 IPv4 还是 IPv6,都可以通过以下命令验证网络连接:
1
2 ping -4 google.com # 验证 IPv4 连接
ping -6 google.com # 验证 IPv6 连接
修改 /etc/gai.conf
在 Debian 等 Linux 系统下,有一个 /etc/gai.conf 文件,用于系统的 getaddrinfo 调用,默认情况下,它会使用 IPv6 优先,如果您安装了 curl 并且本地支持 IPv6,那么可以使用 curl ip.sb 测试:
1 | root@debian ~ # curl ip.sb |
效果等同于 curl ip.sb -6
如果你不想使用 IPv6 优先,可以在这个文件中找到:
1 | #precedence ::ffff:0:0/96 100 |
取消注释,修改为:
1 | precedence ::ffff:0:0/96 100 |
一句话命令:
1 sed -i 's/#precedence ::ffff:0:0\/96 100/precedence ::ffff:0:0\/96 100/' /etc/gai.conf
此时再使用 curl ip.sb 测试
1 | root@debian ~ # curl ip.sb |
效果等同于 curl ip.sb -4
有时候又会需要强制 IPv6 优先 (怎么有些系统和用户那么奇怪?),因为目前 IANA 分配的公网 IPv6 还未进行到 3000:0000::/4,所以我们只要把这段之前的 IPv6 加到优先级列表即可,加入这两行 label 的优先级:
1 | label 2002::/16 1 |
禁用 IPv6
有一些极端情况下,我们可能需要禁止系统的 IPv6 功能,这时候就需要修改 /etc/sysctl.conf 文件,首先找到你的网卡名称,这里以 eth0 为例,然后加入如下内容:
1 | net.ipv6.conf.all.autoconf = 0 |
如果需要其他网卡则更改或添加 net.ipv6.conf.eth0.disable_ipv6 = 1 即可。
一句话命令
1
2
3
4
5
6
7
8
9
10 cat >> /etc/sysctl.conf << EOF
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
EOF




