我正在尝试在我的 NFS 服务器(Ubuntu 12.04 LTS 精确版)上完全禁用 IPv6,但似乎仍然有一些 IPv6 端口在监听,如我运行 netstat -lp 时显示的那样:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:60377 *:* LISTEN -
tcp 0 0 *:49115 *:* LISTEN 1744/rpc.mountd
tcp 0 0 *:nfs *:* LISTEN -
tcp 0 0 *:54658 *:* LISTEN 1744/rpc.mountd
tcp 0 0 *:sunrpc *:* LISTEN 450/rpcbind
tcp 0 0 *:55730 *:* LISTEN 709/rpc.statd
tcp 0 0 *:48181 *:* LISTEN 1744/rpc.mountd
tcp6 0 0 [::]:37004 [::]:* LISTEN -
udp 0 0 *:55738 *:* 1744/rpc.mountd
udp 0 0 *:43533 *:* -
udp 0 0 *:43687 *:* 709/rpc.statd
udp 0 0 *:sunrpc *:* 450/rpcbind
udp 0 0 *:615 *:* 450/rpcbind
udp 0 0 localhost:885 *:* 709/rpc.statd
udp 0 0 *:50206 *:* 1744/rpc.mountd
udp 0 0 *:54380 *:* 1744/rpc.mountd
udp 0 0 *:nfs *:* -
udp6 0 0 [::]:46857 [::]:* -
我已在 /etc/sysctl.d/ipvf-disable.conf 中在内核级别禁用 IPv6:
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
/etc/netconfig 中也有:
udp tpi_clts v inet udp - -
tcp tpi_cots_ord v inet tcp - -
#udp6 tpi_clts v inet6 udp - -
#tcp6 tpi_cots_ord v inet6 tcp - -
rawip tpi_raw - inet - - -
local tpi_cots_ord - loopback - - -
unix tpi_cots_ord - loopback - - -
完成这些更改后,我重新启动,上面的 netstat 输出没有变化。打开的 UDP6 和 TCP6 端口似乎是内核端口(因此缺少 PID),当我运行 /etc/init.d/nfs-kernel-server stop 时它们消失了。
我发现了以下错误报告:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=648635符合我的问题,但似乎没有任何回复。我是不是漏掉了什么,还是这是一个错误?
编辑 - 澄清一下,有些代码无法很好地与任何 IPv6 配合使用(是的,这是糟糕的代码,而且无法轻易更改),因为它会读取 netstat 并中断。任何有关如何从 netstat 中删除 IPv6 引用的想法都将不胜感激。
答案1
为了完整起见,我设法找到了针对这种特定情况的解决方案,即创建一个“netstat”shell 脚本,该脚本从现有的 netstat 中解析 IPv6,并向应用程序提供包含该脚本的替代 PATH。
注意 - 这显然不是一个好主意,但对我来说没有更好的选择,它似乎有效。
答案2
在你的启动配置中设置 ipv6.disable=1
通常,编辑 /etc/default/grub 并将其添加到 GRUB_CMDLINE_LINUX 中的选项列表中,然后运行 grub_mkconfig -o /boot/grub2/grub.cfg