关于机器访问自己内网IP的问题讨论
对于一台机器来说,他在访问自己的内网地址的时候究竟是怎么样一个原理呢?我们通过几个小实验来探究一下。
这个实验里面有3台机器,机器A,地址是172.31.100.107,机器B用于辅助测试,地址是172.31.100.170,还有一台Linux机器C用于做scapy的测试,IP为172.31.100.222。
实验1
在机器A上面psping它自己的内网地址和端口,进行抓包:
查看A的IP地址为172.31.100.107:
在机器A上面psping自己的3389端口:
在A上面抓包发现没有数据包:
用B机器psping机器A的3389端口,仍然是在A上面抓包发现可以抓到报文:
实验2
我们在机器A上添加一条防火墙规则,block掉所有的3389入站:
然后我们依然在A上面psping自己的3389端口,仍然可以连通:
但在B机器上测试psping机器A的3389就不通了:
实验3
这个实验我们需要借助机器C上面安装的scapy工具,机器C的IP:
我们目标机器这回是用机器B。我们在机器B上开始进行抓包,过滤条件为"ipv4.Address==172.31.100.170and tcp.Port==3389",在机器C上面也进行抓包(tcpdump -i eth0 -w server.cap),然后再机器C上面用scapy模拟两种不同的报文:
然后我们发送两种报文各4次:
停止抓包,我们查看一下在机器C上面的抓包的情况(这里面HANXU3-D-1这个是172.31.100.170的主机名):
可以看到在C机器上面8个报文都发出了。
但是我们在B上面查看一下抓包情况:
可以看到,在B上面没有收到我们伪造的源地址和目的地址都是172.31.100.170的包。
综合以上三个实验,我们不难得出下面两个结论:
- 当机器的网卡收到一个报文,报文中源地址和目的地址都是自己的时候,网卡会丢弃这个报文。
- 当机器在自己本地进行本机端口测试或者网络连通性测试的时候,不会产生报文(与测试127.0.0.1环回地址原理相同)。