查看当前状态

要查看当前 IP 转发的状态, 执行以下命令

1
2
3
4
5
6
7
# 查看IPv4的拥堵算法
sysctl net.ipv4.tcp_available_congestion_control

# 查看IPv6的拥堵算法
sysctl net.ipv6.conf.all.disable_ipv6
# 查看IPv6是否启用
sysctl net.ipv6.tcp_available_congestion_control

如果返回 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 选项,或者修改配置文件。

  1. 临时使用 IPv4: 你可以在运行 apt 命令时临时指定使用 IPv4:

    1
    2
    sudo apt -o Acquire::ForceIPv4=true update
    sudo apt -o Acquire::ForceIPv4=true install <package_name>
  2. 永久配置: 如果你希望永久使用 IPv4,可以编辑 apt 的配置文件:

    1
    echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

使用 IPv6 更新和下载

如果你希望 apt 强制使用 IPv6,可以使用类似的方法:

  1. 临时使用 IPv6: 运行 apt 命令时临时指定使用 IPv6:

    1
    2
    sudo apt -o Acquire::ForceIPv6=true update
    sudo apt -o Acquire::ForceIPv6=true install <package_name>
  2. 永久配置: 如果你希望永久使用 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
2
root@debian ~ # curl ip.sb
2001:db8::2

效果等同于 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
2
root@debian ~ # curl ip.sb
192.0.2.2

效果等同于 curl ip.sb -4

有时候又会需要强制 IPv6 优先 (怎么有些系统和用户那么奇怪?),因为目前 IANA 分配的公网 IPv6 还未进行到 3000:0000::/4,所以我们只要把这段之前的 IPv6 加到优先级列表即可,加入这两行 label 的优先级:

1
2
label 2002::/16    1
label 2001:0::/32 1

禁用 IPv6

有一些极端情况下,我们可能需要禁止系统的 IPv6 功能,这时候就需要修改 /etc/sysctl.conf 文件,首先找到你的网卡名称,这里以 eth0 为例,然后加入如下内容:

1
2
3
4
5
6
7
8
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

如果需要其他网卡则更改或添加 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