1 问题现象
当系统启用IPV6时,NetworkManager服务默认会存在全0地址监听,此处58不是端口,是协议号,表示icmpv6,现象如下:
# netstat -anp | grep Network
raw6 0 0 :::58 :::* 7 2581242/NetworkMana
2 原因分析
2.1 raw6是什么?
raw6是IPV6的原始套接字(RAW SOCKET),
可以通过查看/proc/net/sockstat6文件进行确认:
[root@localhost:~ ]# cat /proc/net/sockstat6
TCP6: inuse 1
UDP6: inuse 0
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse 0 memory 0
[root@localhost:~ ]#
2.2 :::地址是什么?
在ipv6中,:::
表示0地址,在这里表示所有ip的意思
https://qastack.cn/superuser/661188/what-is-in-the-local-address-of-netstat-output
2.3 58是什么服务的端口?
58不是端口,是协议号,对应的是icmp6协议,即IPV6上的ICMP协议,可以使用以下命令查询端口对应协议类型:
[root@localhost:~ ]# ss -l -6 -p -e -n
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
icmp6 UNCONN 0 0 *:58 *:* users:(("NetworkManager",pid=229210,fd=21)) ino:685747 sk:1 v6only:0 <->
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=2780,fd=4)) ino:45366 sk:2 v6only:1 <->
NetworkManager服务在启动时调用libndp进行设置,默认监听全0网段,且无法通过命令行参数指定或者通过配置文件进行修改。
2.4 监听所有地址的58号协议目的是什么?
用于DAD检测
在IPv6环境下,当一个主机企图配置一个IPv6地址时,会先进行地址重复性检测,以确认在链路上该地址的唯一性。这一过程称为DAD(Duplicate Address Detection)。
比如在启动一个开启了IPv6的网卡时,网卡上会先自动配置一个link-local地址——以fe80开头的地址,在这个地址生效前会进行DAD检测。
DAD检测的关键就是NS报文,注意到该报文的源地址为全0,目的地址为一个多播地址,Target指向自己欲配置的IPv6地址。一段时间内,若链路上没有谁回复NA,或者在链路上收到同样结构的NS报文,则认为该地址在链路上具有唯一性,配置生效
整个过程中用到的NS 与 NA 报文都是icmpv6 协议的
3 解决方法
在不使用IPV6的场景下,可以通过禁用IPV6来关闭此全零监听,否则产品应根据实际业务组网情况和使用场景,决定使用防火墙等手段进行网络隔离。
方法一:关闭网卡的ipv6功能
在不使用IPV6的场景下,可以通过禁用IPV6来关闭此全零监听,否则应根据实际业务组网情况和使用场景,决定使用防火墙等手段进行网络隔离。
关闭ipv6功能既可以通过网卡配置文件实现,也可以通过sysctl实现
1 修改网卡配置关闭ipv6功能
/etc/sysconfig/network-scripts/ifcfg-ethX 配置IPV6_AUTOCONF=“yes” 会开启此端口监听,配置为IPV6_AUTOCONF="no"会关闭58 端口监听
修改配置文件并重启网卡生效:
root localhost:~ $ cat /etc/sysconfig/network-scripts/ifcfg-eth6
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPADDR=10.137.55.254
IPV6INIT="yes"
IPV6_AUTOCONF="no"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth6"
DEVICE="eth6"
ONBOOT="yes"
root localhost:~ $ ifdown eth6 && ifup eth6</span>
2 通过sysctl借用ipv6
永久禁用所有接口的IPv6方法:
通过 /etc/sysctl.conf 文件对 /proc 进行永久修改,
复制代码代码如下:
# 禁用整个系统所有接口的IPv6
net.ipv6.conf.all.disable_ipv6 = 1
让配置文件立即生效
sysctl -p
禁用某一个指定接口的IPv6(例如:eth0, lo)
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
最终效果:
方法二:防火墙
NetworkManager.service有使用场景时,添加firewalld规则,限制对具体网络的访问。例如,使用如下配置,将删掉端口为58的地址请求(涉及ipv6):
firewall-cmd --permanent --add-rich-rule="rule family=ipv6 port protocol=tcp port=58 drop"
方法三:关闭NetworkManager服务
关闭服务:
systemctl stop NetworkManager
禁止开机启动:
systemctl disable NetworkManager