本地流量出站链路
问题:目前需要ping google.com,从命令下发到icmp 请求完成出站的过程中,dns,防火墙和本地路由表分别起到了什么作用,它们在链路中的顺序是怎样的
DNS解析:首先,您的系统需要将域名google.com解析为一个IP地址。为此,系统会查询配置的DNS服务器。DNS服务器会查找与google.com关联的IP地址并将其返回给您的系统。如果DNS缓存中已经存在google.com的IP地址,这个过程会更快。
防火墙:在确定了目标IP地址后,系统将检查防火墙规则,以确定是否允许向该IP地址发送ICMP Echo请求(ping请求)。如果防火墙规则允许此类请求,流程将继续。如果防火墙阻止了该请求,您将无法ping目标地址,可能会收到类似“请求超时”或“目标主机不可达”的错误消息。
本地路由表:一旦防火墙允许ping请求,系统将根据本地路由表确定如何将请求路由到目标IP地址。路由表包含了关于如何将数据包从源IP地址路由到目标IP地址的信息。这包括网关、子网掩码和接口等信息。系统将根据路由表中的信息将ICMP Echo请求发送到适当的网关或直接到目标地址(如果在同一局域网上)。
请求出站:在完成上述步骤后,ICMP Echo请求将从您的系统出站,沿着网络路径传输到google.com的服务器。然后,服务器将响应ICMP Echo应答,您的系统将接收到该应答,并显示ping请求的往返时间(RTT)
出站链路顺序是:DNS解析 -> 防火墙检查 -> 本地路由表查找 -> 请求出站
数据包在经过 iptables 的各个链(如 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING)的处理后,只有通过了相应的规则(没有被丢弃或拒绝),才会进入路由表进行路由选择。
在这个过程中,iptables 可以根据配置的规则对数据包进行过滤、修改或其他操作。只有满足规则的数据包才能继续向下传递,最终进入路由表进行路由选择。如果在 iptables 的某个链中,数据包被丢弃或拒绝,那么它将不会进入路由表,也不会到达目标地址。
本机网络不通,一般和【iptables或路由】的设置有关
本机网络不通排查实战
本机ping不通30.160.241.214,请排查
[root@VM-100-149-centos ~]# ping 30.160.241.214
PING 30.160.241.214 (30.160.241.214) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
^C
--- 30.160.241.214 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4086ms
查看iptables:
[root@VM-100-149-centos ~]# #【iptables DROP了目的地是30.160.241.214的icmp请求】
[root@VM-100-149-centos ~]# iptables -t filter -L OUTPUT --line-numbers -v -n | grep 30.160.241.214
4 5 420 DROP icmp -- * * 0.0.0.0/0 30.160.241.214 icmptype 8
[root@VM-100-149-centos ~]# iptables -t filter -D OUTPUT 4
[root@VM-100-149-centos ~]#
查看路由表:
[root@VM-100-149-centos ~]# # 【路由表将 30.160.241.0/24的目标网络,应通过本地环回接口(loopback interface)进行路由,下一跳网关为127.0.0.1,ICMP请求实际上将在本地计算机上进行处理,而不是发送到外部网络】
[root@VM-100-149-centos ~]# route -en | grep 30.160.
30.160.241.0 127.0.0.1 255.255.255.0 UG 0 0 0 lo
[root@VM-100-149-centos ~]# ip route list table main | grep 30.160.241 # or ip route show | grep 30.160.241.214
30.160.241.0/24 via 127.0.0.1 dev lo scope link
[root@VM-100-149-centos ~]# ip route del 30.160.241.0/24 via 127.0.0.1 dev lo scope link
[root@VM-100-149-centos ~]#
ping通:
[root@VM-100-149-centos ~]# ping 30.160.241.214
PING 30.160.241.214 (30.160.241.214) 56(84) bytes of data.
64 bytes from 30.160.241.214: icmp_seq=1 ttl=64 time=1.65 ms
64 bytes from 30.160.241.214: icmp_seq=2 ttl=64 time=1.59 ms
64 bytes from 30.160.241.214: icmp_seq=3 ttl=64 time=1.62 ms
^C
--- 30.160.241.214 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.591/1.626/1.658/0.027 ms
[root@VM-100-149-centos ~]#
解析:
用户执行
ping 30.160.241.214
命令,系统生成一个 ICMP 类型 8(echo request)的数据包。数据包进入 iptables 的 OUTPUT 链。在这里,数据包会遇到规则
DROP icmp -- * * 0.0.0.0/0 30.160.241.214 icmptype 8
,因为它是发往30.160.241.214
的 ICMP 类型 8 数据包。根据这个规则,数据包会被丢弃。由于数据包在 iptables 的 OUTPUT 链被丢弃,它不会进入路由表进行路由选择。因此,即使路由表中有针对目标 IP 地址 30.160.241.214 的路由规则(30.160.241.0/24 via 127.0.0.1 dev lo scope link),数据包也不会被发送到本地回环接口(lo)。
由于数据包在 iptables 的 OUTPUT 链被丢弃,它不会离开服务器,也不会到达目标 IP 地址 30.160.241.214。
注:发往 localhost(即 127.0.0.1)的数据包会经过防火墙,但是它们不会通过物理网络接口,而是经过本地回环接口(lo
,一个虚拟的网络接口)。
packets to 127.0.0.1 aren't allowed "outside" the computer. But they still go out of the firewall and are sent to lo