我的设置如下:
- 我有一台双启动计算机。
- 我有一个直接连接到 PC 的网络设备(IP 地址 192.168.1.251)。
- 当 PC 启动 Windows 10 时,我可以 ping 该设备。
- 当 PC 使用 Debian 10 启动时,我无法 ping 通该设备。
$ ping 192.168.1.251 PING 192.168.1.251 (192.168.1.251) 56(84) bytes of data. From 192.168.1.22 icmp_seq=1 Destination Host Unreachable From 192.168.1.22 icmp_seq=2 Destination Host Unreachable From 192.168.1.22 icmp_seq=3 Destination Host Unreachable ^C --- 192.168.1.251 ping statistics --- 5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 80ms pipe 4
在 Windows 10 和 Debian 10 下,接口的配置方式相同,即它们都具有相同的静态 IP 地址(192.168.1.22)和相同的子网掩码(255.255.255.0)。
ARP 可以看到该设备(IP 地址为 192.168.1.251)也在那里。
$ sudo arp-scan 192.168.1.251 Interface: enp0s25, datalink type: EN10MB (Ethernet) Starting arp-scan 1.9.5 with 1 hosts (https://github.com/royhills/arp-scan) 0 packets received by filter, 0 packets dropped by kernel Ending arp-scan 1.9.5: 1 hosts scanned in 2.538 seconds (0.39 hosts/sec). 0 responded
如果我连接和断开电缆,我可以看到,在我尝试 ping 设备的这个接口上,“链接已连接”确实变成了“是”和“否”。
$ sudo ethtool enp0s25 Settings for enp0s25: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on MDI-X: on (auto) Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000007 (7) drv probe link Link detected: yes
问题:那么,为什么我无法从 Debian 10 ping 设备,但从 Windows 10 却可以轻松做到呢?我已经与此斗争了 3 到 4 个小时,测试了我能想到的所有可能的排列和组合。
ps 我甚至可以从运行在 Windows 10 主机上的 Linux VM 成功 ping 设备(只是说,以防万一添加任何信息)但不能从直接安装在裸机上的 Linux 成功 ping 设备。
更新/编辑:
根据评论的反馈,我做了以下测试:
- 首先,我从 Debian 10 运行 traceroute,同时仅连接到目标网络设备。(PC 和设备都与任何其他网络/PC 完全隔离。)
$ traceroute -UL 192.168.1.251
traceroute to 192.168.1.251 (192.168.1.251), 30 hops max, 60 byte packets
1 192.168.1.252 (192.168.1.252) 3070.385 ms !H 3070.330 ms !H 3070.314 ms !H
最终成功了...。耗时约 3 秒(嗯!为什么?)。
- 然后我从 Debian 10 运行了路由命令,
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s25
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- 抱歉重复了一遍,但在 ping 设备时,出现了同样的错误:
$ ping -r 192.168.1.251
PING 192.168.1.251 (192.168.1.251) 56(84) bytes of data.
From 192.168.1.252 icmp_seq=1 Destination Host Unreachable
From 192.168.1.252 icmp_seq=2 Destination Host Unreachable
From 192.168.1.252 icmp_seq=3 Destination Host Unreachable
From 192.168.1.252 icmp_seq=4 Destination Host Unreachable
From 192.168.1.252 icmp_seq=5 Destination Host Unreachable
From 192.168.1.252 icmp_seq=6 Destination Host Unreachable
^C
--- 192.168.1.251 ping statistics ---
7 packets transmitted, 0 received, +6 errors, 100% packet loss, time 147ms
pipe 4
然后我继续将笔记本电脑重新启动到 Windows 10 并启动 Ubuntu 18.04 LTS 虚拟机。
- 首先,从 Windows 10 开始就可以 ping 设备。
# ping 192.168.1.251
Pinging 192.168.1.251 with 32 bytes of data:
Reply from 192.168.1.251: bytes=32 time<1ms TTL=255
Reply from 192.168.1.251: bytes=32 time<1ms TTL=255
Reply from 192.168.1.251: bytes=32 time<1ms TTL=255
Reply from 192.168.1.251: bytes=32 time<1ms TTL=255
Ping statistics for 192.168.1.251:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
- 接下来从 Windows 10 主机上运行的 Ubuntu 虚拟机进行 ping 操作:
$ ping 192.168.1.251
PING 192.168.1.251 (192.168.1.251) 56(84) bytes of data.
64 bytes from 192.168.1.251: icmp_seq=1 ttl=255 time=0.459 ms
64 bytes from 192.168.1.251: icmp_seq=2 ttl=255 time=0.561 ms
64 bytes from 192.168.1.251: icmp_seq=3 ttl=255 time=0.385 ms
64 bytes from 192.168.1.251: icmp_seq=4 ttl=255 time=0.428 ms
^C
--- 192.168.1.251 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3066ms
rtt min/avg/max/mdev = 0.385/0.458/0.561/0.066 ms
- Traceroute 也成功了(并且响应很快):
$ traceroute -UL 192.168.1.251
traceroute to 192.168.1.251 (192.168.1.251), 30 hops max, 60 byte packets
1 192.168.1.251 (192.168.1.251) 0.594 ms !P 0.527 ms !P 0.497 ms !P
- 最后是网关(虽然我认为这里设置什么网关没有区别,因为我直接连接到设备,没有其他中介)。
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.3.0 0.0.0.0 255.255.255.0 U 0 0 0 lxcbr0
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 virbr0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s9
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
最后一句话:我没有在笔记本电脑上安装的 Debian 10 上设置任何特殊的防火墙或 iptable 规则。这是标准/默认安装,当然还根据需要安装了其他用户包(但没有进行特殊的网络配置)。
编辑2: 因此,在最近的评论之后,我关注了这和这禁用任何可能阻止 ping 的“防火墙”或 iptable 规则(实际上 ping 只是症状之一。PC 端有一个服务器也无法与网络设备通信,这是我最初的问题。)
这是我尝试过的,结果如下:
- 显然
ufw
或nftables
或未firewalld
安装。我也没有host.deny
文件。
$ sudo ufw status
sudo: ufw: command not found
$ sudo nftables
sudo: nftables: command not found
$ cat /etc/host.deny
cat: /etc/host.deny: No such file or directory
$ sudo systemctl disable firewalld
Failed to disable unit: Unit file firewalld.service does not exist.
$ sudo firewall-cmd --state
sudo: firewall-cmd: command not found
- 到目前为止一切顺利。然后
iptables
我们开始查看。有趣的是,找到了 iptable 的所有条目:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:67
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
Chain DOCKER (1 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
我们看到了一些规则,一些是针对 Docker 的,一些是一般规则。我不知道这些规则和设置的作用是什么,但让我们删除它们并禁用所有控件(仅用于测试目的 - 看看是否有用)。为了实现这一点,我采取了以下步骤(直接复制自上面提到的一个链接):
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
这产生了一些美观的iptable
配置,如下所示。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
- 不幸的是,兔子洞越来越深。即使所有规则都消失了。而且我没有配置其他规则/防火墙等(至少我知道没有),不幸的是,什么都没有改变。
ping
仍然失败,traceroute
仍然需要大约 3000 多毫秒。
我开始怀疑network-manager
debian 10 上的服务在某种程度上是负责任的,因为这是笔记本电脑上 debian 10 的裸机安装与在 windows 10 上运行的 ubuntu 18.04 虚拟机之间唯一的区别,我从中 ping 设备没有任何问题。)
附加信息:我有另一台在 Windows 10 上运行 Debian 6 的虚拟机,甚至可以 ping 网络设备。
编辑3:
nmap 可以找到主机。
nmap -Pns 192.168.1.200/32
Starting Nmap 7.70 ( https://nmap.org ) at 2021-01-21 14:42 CET
Nmap scan report for 192.168.1.200
Host is up (0.062s latency).
All 1000 scanned ports on 192.168.1.200 are filtered
Nmap done: 1 IP address (1 host up) scanned in 5.90 seconds
答案1
因此,在近一年没有跟进此事之后,我今天尝试了十几种不同的方法,并搜索了不同的 Linux 发行版论坛,终于找到了金矿这里。
完成以下操作后,我可以成功 ping 通(我希望它能保持这种状态,但目前一切看起来不错)。
从这里,我试过这个。
sudo lshw -C network
它向我展示了该以太网端口的硬件。
*-network
description: Ethernet interface
product: Ethernet Connection I217-LM
vendor: Intel Corporation
physical id: 19
bus info: pci@0000:00:19.0
logical name: enp0s25
version: 04
serial: 70:5a:df:b9:a7:47
size: 100Mbit/s
capacity: 1Gbit/s
width: 32 bits
clock: 33MHz
capabilities: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=3.2.6-k duplex=full firmware=0.13-4 ip=192.168.1.34 latency=0 link=yes multicast=yes port=twisted pair speed=100Mbit/s
resources: irq:31 memory:d2100000-d211ffff memory:d213a000-d213afff ioport:6040(size=32)
我从英特尔。
cp e1000e-3.0.4.tar.gz /usr/local/src/
cd /usr/local/src/
tar xzvf e1000e-3.0.4.tar.gz
rmmod e1000e
apt-get install linux-headers-amd64
cd e1000e-3.0.4/src/
make install
重启后,砰!ping 声响起,一切正常!有时,为了让事情正常运转,你必须自己动手。
让我走上这条路的想法是,我可以通过另一个以太网端口 (实际上这不是一个真正的以太网端口。它是一个 USB 加密狗,但这不是重点。) 执行 ping 操作并执行几乎所有操作,但在以太网端口本身上,什么都行不通 (除了 traceroute 和 nmap 以某种方式通过了,我不知道是怎么回事)。
可能是 3~4 年前,当我在这台笔记本电脑上安装 Debian 时(Windows 10 旁边),BIOS 中可能启用了“快速启动”,也许以太网驱动程序没有安装或类似问题。也许吧!
几周后的反馈/更新:
经过几周的观察,我发现这个功能不知为何只能间歇性地工作。它能用,但后来就停止工作了。然后今天它又开始工作了。真正的问题可能出在别的地方。今天我做了一件不同的事情,就是从网络管理器关闭了“自动连接”。也许这有区别?