通过IPv6建立GRE隧道时出现“No buffer space available”等错误的问题咨询
通过IPv6建立GRE隧道时出现“No buffer space available”等错误的问题咨询
看起来你在尝试通过IPv6在两台VPS之间搭建GRE隧道时遇到了两个棘手的报错,我来帮你拆解问题并给出可行的解决思路:
你的配置与报错信息
首先先明确你的操作和遇到的问题:
你在/etc/rc.local中配置的命令:
sudo ip -6 tunnel add gre1 mode ip6gre local *LOCALIPV6* remote *REMOTEIPV6* ttl 255 sudo ip addr add 10.0.0.2/30 dev gre1 sudo ip link set gre1 up iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source *LOCALIPV4* exit 0
执行bash /etc/rc.local时出现的报错:
add tunnel "ip6gre0" failed: No buffer space available RTNETLINK answers: File exists
错误原因分析与解决步骤
1. 「RTNETLINK answers: File exists」—— 资源已存在的问题
这个报错很直观:你要创建的gre1隧道或者要绑定的10.0.0.2/30IP地址已经存在于系统中了。大概率是你之前已经执行过一次rc.local脚本,隧道资源没有被清理,再次执行就会冲突。
解决办法:
先手动清理现有资源,再重新执行脚本:
# 先关闭gre1隧道 sudo ip link set gre1 down # 删除gre1隧道 sudo ip -6 tunnel del gre1 # 删除绑定的IP地址 sudo ip addr del 10.0.0.2/30 dev gre1
清理完成后再运行bash /etc/rc.local,这个报错应该就会消失。
2. 「No buffer space available」—— 网络缓冲区不足的问题
这个报错通常和系统的网络缓冲区配置有关,也可能是内核模块未正确加载导致的。
解决办法:
先确认内核模块是否加载:
ip6gre隧道依赖ip6_gre内核模块,先检查是否已加载:lsmod | grep ip6_gre如果没有输出,说明模块未加载,手动加载试试:
sudo modprobe ip6_gre想要开机自动加载的话,可以创建
/etc/modules-load.d/ip6_gre.conf文件,内容只写ip6_gre即可。临时调整网络缓冲区参数:
执行以下命令临时扩大网络缓冲区:sudo sysctl -w net.core.wmem_max=16777216 sudo sysctl -w net.core.rmem_max=16777216 sudo sysctl -w net.ipv6.route.max_size=4096如果临时生效,想要永久生效,把这些参数添加到
/etc/sysctl.conf或者/etc/sysctl.d/99-custom.conf文件中,然后执行sudo sysctl -p让配置生效。
3. 优化rc.local脚本,避免重复执行报错
为了防止以后再次遇到类似问题,你可以给脚本加上判断逻辑,只有当资源不存在时才执行创建/添加操作:
# 检查gre1隧道是否存在,不存在则创建 if ! ip link show gre1 > /dev/null 2>&1; then sudo ip -6 tunnel add gre1 mode ip6gre local *LOCALIPV6* remote *REMOTEIPV6* ttl 255 sudo ip addr add 10.0.0.2/30 dev gre1 sudo ip link set gre1 up fi # 检查SNAT规则是否存在,不存在则添加 if ! iptables -t nat -C POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source *LOCALIPV4* > /dev/null 2>&1; then iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source *LOCALIPV4* fi exit 0
备注:内容来源于stack exchange,提问作者Hypothesis
相关产品推荐
相关产品推荐

