我在 dmesg 日志¹中看到大量以下两行内容:
[602956.308844] [iptables] (10): IN=eno1 OUT=eno2 MAC=xx:yy:..:zz SRC=10.174.26.245 DST=192.168.22.59 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=53 DPT=47150 WINDOW=28960 RES=0x00 ACK SYN URGP=0
[602956.652575] [iptables] (10): IN=eno1 OUT=eno2 MAC=xx:yy:..:zz SRC=10.172.0.22 DST=192.168.22.59 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=53 DPT=44204 WINDOW=28960 RES=0x00 ACK SYN URGP=0
我的防火墙阻止了这些,因为它无法识别 10.172.0.22 和 10.174.26.245 IP 地址。
实际上,查看 eno1 和 eno2 的 IP 地址列表,这两个 IP 地址并不包含在内。我使用两个 10.xxx 的 IP 地址,但不包括上面列出的两个(因此防火墙屏蔽了这两个 IP 地址)。
我的网络看起来是这样的:
+----------+ +--------+ +--------+ +--------+
| Internet |<--->| Router |<--->| Server |<--->| Laptop |
+----------+ +--------+ +--------+ +--------+
服务器和笔记本电脑都安装了防火墙。笔记本电脑的IP地址是192.168.22.59。它没有收到任何UDP TCP数据包。
eno1 和 eno2 位于服务器上。eno1 连接到路由器,路由器再连接到互联网。路由器连接使用本地网络地址(IPv4 和 IPv6)。eno2 是我的本地网络(LAN)。服务器设置为转发笔记本电脑和互联网之间的流量。
笔记本电脑使用了VPN,我怀疑它可能来自VPN,但笔记本电脑本身也装有防火墙,因此也会忽略此类流量。我想知道这些数据包来自哪里?是本地系统,还是来自黑客?或者VPN可能是罪魁祸首?无论如何,我不明白UDP TCP数据包怎么会使用网络接口上不存在的IP地址;如果是本地的,我也不明白它怎么会从外部传入。假设是本地进程发送了这些数据包,有什么办法可以找出它吗?
附注:我安装了 libvirt,但我尝试停止正在运行的一个 VPN,结果没有任何效果。而且,它创建的两个网桥不使用 10.17[24].xx 这两个 IP 地址。另外,我实在想不出 VPN 会把UDP TCP 数据包发送到错误的机器的原因。
更新
于是,我打开笔记本电脑,重新连接了 VPN。之后,上面两行代码就不再出现了。
这让我看到了另一行:
[608974.298853] [iptables] (192): IN=eno1np0 OUT=eno2np1 MAC=xx:yy:...:zz SRC=192.168.19.2 DST=192.168.22.189 LEN=151 TOS=0x00 PREC=0x00 TTL=63 ID=8281 DF PROTO=UDP SPT=53 DPT=47512 LEN=131
这个是UDP协议,但关键在于,就像笔记本电脑一样,它需要来自路由器(也就是互联网)的本地IP地址的数据。设备189是我的惠普打印机,所以它可能也有一个类似VPN的系统,并且偶尔会以这种方式导致DNS请求失败。
解决
我实际上可以在路由表中看到这两个 IP,您可以这样做:
$ ip route
这意味着我的图表会更像这样:
+----------+ +-----+ +--------+ +--------+ +--------+
| Internet |<--->| VPN |<--->| Router |<--->| Server |<--->| Laptop |
+----------+ +-----+ +--------+ +--------+ +--------+
当然,正如telcoM所说,路由器和VPN之间也存在ISP,但这不是罪魁祸首。我现在直接丢弃了这些数据包,而没有先记录它们:
-A bad_tcp_packets -i eno1 -s 10.172.0.0/16 -j DROP
-A bad_tcp_packets -i eno1 -s 10.174.0.0/16 -j DROP
需要注意的是:这意味着使用 VPN 可能会打开另一端的一组本地IP 地址。因此,您必须注意这一点,因为这可能会影响您的 LAN 设置。
¹我设置了防火墙来记录此类访问,以确保能够发现此类问题。目前,我并非试图回避日志,而是试图理解它。