原因
在使用L2TP协议连接公司内网时,某些网络环境或硬件(如M1芯片的Mac、特定USB扩展坞)可能与硬件校验和(Hardware Checksum)功能存在兼容性问题,导致以下现象:
- 连接后能ping通内网地址,但无法访问具体服务(如HTTP)
- 使用USB扩展坞时可能出现拨号失败或无法上网的问题
解决方案
禁用硬件校验和后,系统会改用软件计算校验和,从而规避兼容性问题
方案一、 在命令行输入以下命令即可1
sudo sysctl net.link.generic.system.hwcksum_tx=0
sudo sysctl net.link.generic.system.hwcksum_rx=0
方案二、利用脚本来完成开关工作
- 用vim或者任意文本编辑器写一个vpn_set.sh的脚本
vim vpn_set.sh
- 复制以下代码并保存
#!/bin/bash
# 交互式校验和切换脚本
# 需使用sudo运行
function show_menu() {
clear
echo "============================="
echo " 硬件校验和切换工具"
echo "============================="
echo "当前状态:"
sysctl -n net.link.generic.system.hwcksum_tx | awk '{print "发送方向(TX): " ($1 == 1 ? "已启用" : "已禁用")}'
sysctl -n net.link.generic.system.hwcksum_rx | awk '{print "接收方向(RX): " ($1 == 1 ? "已启用" : "已禁用")}'
echo "-----------------------------"
echo "1. 启用硬件校验和(默认安全)"
echo "2. 禁用硬件校验和(用于VPN)"
echo "3. 退出"
echo "============================="
}
function apply_setting() {
# 执行设置
for setting in "net.link.generic.system.hwcksum_tx" "net.link.generic.system.hwcksum_rx"; do
sysctl -w "${setting}=$1" > /dev/null
done
# 结果提示
clear
[ "$1" -eq 0 ] && action="禁用" || action="启用"
echo "操作完成:${action}硬件校验和"
sysctl -a | grep -E 'net.link.generic.system.hwcksum_(tx|rx)'
echo "-----------------------------"
read -n 1 -s -r -p "按任意键返回菜单..."
}
# 权限检查
if [ "$EUID" -ne 0 ]; then
echo "错误:请使用 sudo 运行此脚本"
exit 1
fi
# 主循环
while true; do
show_menu
read -p "请输入选择 [1-3]: " choice
case $choice in
1) apply_setting 1 ;;
2) apply_setting 0 ;;
3)
echo "退出脚本"
exit 0
;;
*)
echo "无效输入,请重新选择!"
sleep 1.5
;;
esac
done
- 授予运行权限并运行即可
sudo chmod +x vpn_set.sh
sudo ./vpn_set.sh
此方式只能临时生效重启后失效, 禁用硬件校验和可能降低网络性能(因软件计算开销增大),并可能增加数据包错误风险。因此,建议在不需要时应该恢复默认值 ↩︎