问题描述
服务器关机维护了4天,开机之后发现服务器无法连接网络,但是同个交换机上的多台服务器之间连接正常。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
xxxx:/$ ping 172.16.150.201 # ping另一台服务器 PING 172.16.150.201 (172.16.150.201) 56(84) bytes of data. 64 bytes from 172.16.150.201: icmp_seq=1 ttl=64 time=0.119 ms 64 bytes from 172.16.150.201: icmp_seq=2 ttl=64 time=0.639 ms 64 bytes from 172.16.150.201: icmp_seq=3 ttl=64 time=0.175 ms ^C --- 172.16.150.201 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2037ms rtt min/avg/max/mdev = 0.119/0.311/0.639/0.233 ms xxxx:/$ ping www.baidu.com # ping外部网络 ping: www.baidu1.com: Temporary failure in name resolution |
环境描述
服务器的网络配置采用单网卡双ip的配置方式,一个ip是DHCP动态获取用于连接外部网络,另一个ip是静态ip用于内网服务器的稳定通信。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
xxxx:~$ sudo cat /etc/netplan/01-network-manager-all.yaml network: version: 2 renderer: networkd ethernets: enp130s0f0: dhcp4: no bridges: br0: interfaces: [enp130s0f0] dhcp4: true addresses: - 172.16.150.202/24 nameservers: addresses: - 114.114.114.114 - 119.29.29.29 parameters: stp: false forward-delay: 0 |
问题分析
首先通过ip r查看当前设备的ip信息
|
1 2 3 4 5 6 |
xxxx:/$ ip r default via 192.168.1.1 dev br0 proto dhcp src 192.168.1.137 metric 100 172.16.150.0/24 dev br0 proto kernel scope link src 172.16.150.202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.16.0.1 192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.137 metric 100 192.168.1.1 dev br0 proto dhcp scope link src 192.168.1.137 metric 100 |
我们发现除了172.16.x.x的静态ip配置之外,还有不明的192.168.x.x的一系列ip,动态获取到的ip为192.168.1.137,我们正常的DHCP获取的ip应该是10.x.x.x,因此可以确定,服务器被ip为192.168.1.1的DHCP服务器劫持了,无法从正确的DHCP服务器获取到ip,也就无法访问外部网络。
解决方案
联系上级网络管理员,得知在上级网络的其他服务器也出现了被劫持的情况,但是网络管理员不想麻烦,让我们自查自行解决。(😓)
两个解决方案,1. 不使用DHCP服务,而使用静态ip;2. 从服务器层面封锁192.168.1.1这个DHCP服务器。
方案一
既然 DHCP 环境不可信,直接手动指定正确的出口 IP、网关和 DNS,彻底摆脱对 DHCP 服务端的依赖。
这个方案有两个缺陷:1、 需要知道上级网络正确的出口IP、网关和DNS的信息;2、还需要避免与上级网络中的其他设备产生ip冲突。
编辑 /etc/netplan/01-network-manager-all.yaml,将 dhcp4: true 改为 no,并手动添加你原本应该获取的 10.x.x.x 地址和网关。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
network: version: 2 renderer: networkd ethernets: enp130s0f0: dhcp4: no bridges: br0: interfaces: [enp130s0f0] dhcp4: no # 关闭 DHCP addresses: - 172.16.150.202/24 # 内网静态 IP - 10.x.x.x/24 # 替换为你原本正常的外部 IP routes: - to: default via: 10.x.x.1 # 替换为你正常的外部网关地址 nameservers: addresses: - 114.114.114.114 - 119.29.29.29 parameters: stp: false forward-delay: 0 |
应用配置:sudo netplan apply
方案二
因为底层的网络接管程序是 systemd-networkd,而你又希望能继续使用 DHCP(为了获取那个正确的10.170.x.x地址),但要精准拒收 192.168.1.1的分配包,我们可以利用 systemd的原生高级特性。
需要注意的是:Netplan 的 YAML 配置文件本身比较精简,没有直接提供“DHCP 黑名单”的语法。但是,Netplan 在后台会把你的 YAML 转换成systemd-networkd的配置文件。
因此,我们可以通过添加一个 “覆盖配置 (Drop-in override)”,直接告诉底层的networkd:“把 192.168.1.1 给我拉黑”。
以下是具体的操作步骤:
1. 确认 Netplan 生成的文件名
Netplan 通常会把配置渲染到 /run/systemd/network/ 目录下。对于你的 br0 网卡,它通常会被命名为 10-netplan-br0.network。
你可以先运行下面这个命令确认一下:
|
1 |
ls /run/systemd/network/ |
(确认里面有没有类似 10-netplan-br0.network 这样的文件。如果有,请按以下步骤操作;如果名字不同,请把下面的文件名替换成你实际看到的名称。)
2. 创建 systemd-networkd 覆盖目录
我们要在/etc目录下创建一个专门的文件夹,用来存放你要追加的高级规则:
|
1 |
sudo mkdir -p /etc/systemd/network/10-netplan-br0.network.d |
3. 编写 DHCP 黑名单规则
在这个目录下创建一个名为dhcp-deny.conf的文件:sudo nano /etc/systemd/network/10-netplan-br0.network.d/dhcp-deny.conf
把下面的内容粘贴进去:
|
1 2 3 4 5 6 7 |
[DHCPv4] # 拉黑这个流氓 DHCP 服务器的 IPDenyList=192.168.1.1 # 💡注意:如果你的 Ubuntu 版本比较老(例如 Ubuntu 20.04 或更早) # systemd 版本可能不支持 DenyList,需要换成旧版的参数名 BlackList, # 为求稳妥,你可以把旧版参数也写上: BlackList=192.168.1.1 |
保存并退出(在 Nano 中按 Ctrl+O 回车保存,Ctrl+X 退出)。
4. 重启 networkd 服务让规则生效
不需要运行 netplan apply,因为我们直接修改了底层的规则。直接重启 systemd-networkd 服务即可:
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart systemd-networkd |
5. 验证结果
重启网络服务后,你的br0会重新发起 DHCP 请求。因为底层引擎已经拉黑了192.168.1.1,它会对那个流氓服务器的响应视而不见,只接受正确的 DHCP 服务器(10.170.255.254)发来的 IP。
此时你再次运行:ip r
你应该就能看到它成功获取到了正确的10.170.x.xIP,并且默认网关也恢复正常了。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
xxxx:~$ ip r default via 10.170.255.254 dev br0 proto dhcp src 10.170.2.70 metric 100 10.170.0.0/16 dev br0 proto kernel scope link src 10.170.2.70 metric 100 10.170.255.254 dev br0 proto dhcp scope link src 10.170.2.70 metric 100 111.34.66.66 via 10.170.255.254 dev br0 proto dhcp src 10.170.2.70 metric 100 172.16.150.0/24 dev br0 proto kernel scope link src 172.16.150.202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 182.45.245.242 via 10.170.255.254 dev br0 proto dhcp src 10.170.2.70 metric 100 xxxx:~$ ping www.baidu.com PING www.a.shifen.com (36.152.44.93) 56(84) bytes of data. 64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=1 ttl=51 time=23.0 ms 64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=2 ttl=51 time=21.1 ms 64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=3 ttl=51 time=22.6 ms ^C --- www.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 21.142/22.253/22.980/0.797 ms |
马春杰杰