一、 默认iptables策略
Linux内核集成的IP信息包过滤系统,linux的包过滤功能,即linux防火墙,它由netfilter和iptables两个组件组成。
防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。
netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
netfilter组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
CentOS7没有iptables,默认使用firewalld 。
iptables默认无法被systemctl控制,需要安装iptables-services、iptables-devel这两个依赖包。
# yum -y install iptables iptables-services
# yum info iptables-services
# systemctl status iptables
# cat /usr/lib/systemd/system/iptables.service
# rpm -qf /usr/lib/systemd/system/iptables.service
# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptables 默认策略解读
:INPUT ACCEPT [0:0]
# 该规则表示INPUT表默认策略是ACCEPT
:FORWARD ACCEPT [0:0]
# 该规则表示FORWARD表默认策略是ACCEPT
:OUTPUT ACCEPT [0:0]
# 该规则表示OUTPUT表默认策略是ACCEPT
-A INPUT -p icmp -j ACCEPT
# 该规则表示 OUTPUT表对 icmp协议的默认测试是 ACCEPT
-A INPUT -i lo -j ACCEPT
# -i 参数是指定接口,这里的接口是lo ,lo就是loopback(本地环回接口),意思就允许本地环回接口在INPUT表的所有数据通信。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许进入的数据包只能是刚刚我发出去的数据包的回应
# ESTABLISHED:已建立的链接状态
# RELATED:该数据包与本机发出的数据包有关
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 根据 iptables 策略匹配即停止原则
# 这两条表示在INPUT表和FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包,并且发送一条host prohibited的消息给被拒绝的主机
配置文件 /etc/sysconfig/iptables 中的iptables的默认策略,你也可以删除这些,另外建立符合自己需求的策略。
二、 ICMP 协议
协议背景
ICMP,全称是 Internet Control Message Protocol,即互联网控制报文协议,所谓控制,就是通过下发指令来感知和控制网络环境,所以它一定是配合一个无法感知网络环境的协议来工作的,这个协议就是 IP(包括 IPv4 和 IPv6)。
ICMP 通常被认为是 IP 协议的一部分,它封装在 IP 层中,使用 IP 协议进行传输。因此,严格来说,ICMP 既不是一个网络层协议,也不是一个传输层协议,而是介于两者之间的一个协议。
它的主要功能是传输网络诊断信息,信息主要包括两类:
一类是 查询类报文 :主要用于信息的查询和采集,比如采集传输路径上的每个路由器都是谁,本次传输的报文是否达到目的地等等。
另一类是 差错诊断类报文 :主要用于诊断网络故障,比如传输报文被丢弃的原因是什么等等。
我们都知道,IP 协议是一个不可靠协议,如果 IP 包在传输过程中出现错误,比如 checksum 对不上,拥塞,超时等等,那么 IP 包是会直接被丢弃的,之后也不会有进一步的努力来修正。
这是 IP 协议的一个设计准则决定的,也就是 best effort,尽力而为,这样的好处是让 IP 协议尽量保持简单的形态,只负责有效率的数据传输,而更多的质量控制交给高层的协议去处理(比如 TCP)。
但高层能提供质量控制的协议毕竟在少数,所以就需要在下层有协议来辅助 IP 完成必要的网络质量管理,ICMP 协议自然就被提出来了。
通过 ICMP 协议,当 IP 包发生错误的时候,上层发送 IP 包的主机或路由器并不知道下层发生了错误,这个时候,下层的主机或路由器就可以通过发送 ICMP 包,将错误信息汇报给上层,从而让上层的主机或路由器进行调整。
不过需要注意的是,ICMP 仅仅只能提供某些特定类型的错误信息汇报,并不能帮助 IP 协议成为可靠的协议,它能做的事还是有限,但用于基本的网络质量管理是足够了。
ICMP 报文格式格式
如下图所示,ICMP 报文是被封装在 IP 数据报中传输的。
IP 报头中的 Protocol 字段为 1 即表示该报文携带的是 ICMP 报文。
(此处只是为了说明问题,因此 IP 报头是简化了的)
进一步看,ICMP 报头为 4 个字节:
类型 type:占 1 个字节,表示较大范围类型分类的 ICMP 报文
代码 code:占 1 个字节,表示较小范围类型分类的 ICMP 报文(type的细分)
校验和 checksum:占 2 个字节,ICMP checksum 的计算方法类似于 IP checksum,但是不同的是 IP 只校验头部,ICMP 校验头部+数据部分
后面紧接的 ICMP 数据部分,根据前面的类型和代码字段的不同,具有不同的内容。
ICMP报文类型
ICMP 支持的报文类型非常多,详细看下表:
类型字段(type)指代了一大类,代码字段(code)又细分了几大小类。
上面可能不够明确,我们通过下面这两张表来列举一下,由于类型太多了,而且有些平时非常少见,因此,这里我们只列举常见的一些类型。
第一张表:类型表
注:R表示查询报文,E表示差错报文
进一步,对于每种类型,又可以根据代码字段细分多种子类型。
第二张表:类型细分表
通过这两张表,每一种类型的 ICMP 包的意思应该都比较清楚了。
ICMP 相关内核参数
ICMP 相关内核参数,常用的是 net.ipv4.icmp_echo_ignore_all,这是禁 ping 的一个参数,禁 ping 有几种方法。
其他的参数大家有兴趣也可以看看,遇到不懂的直接查这个图即可。
三、参考
对于 ICMP 协议,你想知道的都在这里了
https://mp.weixin.qq.com/s/Su2M5aQ2GXsbrgpVcX3kpQ
ping容易忽略的10点用法和排查问题技巧
https://mp.weixin.qq.com/s/ajE0yJfZo02Mkjmpy27SgA
Linux禁止ping以及开启ping的方法
https://mp.weixin.qq.com/s/5nPbvQeAxfOl-li_oMMdDw