【NetworkManager】NM服务监听全网IPV6地址

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值