Linux CentOS 8(iptables的配置与管理)



一、iptables 简介

iptables 其实不是真正的防火墙,它只是一个命令行工具,位于用户空间,可以把它理解成一个客户端代理。用户通过 iptables 这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,名字叫netfilter,位于内核空间,以实现网络数据包的过滤管理(查看、记录、修改、丢弃、拒绝)。普遍应用于Rhel6、CentOS6及之前。

netfilter / iptables 组成Linux平台下的包过滤防火墙。在多数Linux版本内,firewalld、iptables、ebtables是共存的,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。

二、基本命令说明

1. 设置基本的规则匹配

1.1 输入顺序
[root@localhost ~]# iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> 
-p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

//规则的次序非常关键,谁的规则越严格,应该放的越靠前

表名(如果不指定此选项,默认是 filter 表)包括(区分大小写):

  • raw:高级功能,如:网址过滤。
  • mangle:数据包修改(QOS),用于实现服务质量。
  • nat:地址转换,用于网关路由器。
  • filter:包过滤,用于防火墙规则。
  • filter一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
  • nat一般只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
  • mangle则5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

规则链包括(区分大小写):

• INPUT链:处理输入数据包。
• OUTPUT链:处理输出数据包。
• FORWARD链:处理转发数据包。
• PREROUTING链:用于目标地址转换(DNAT)。
• POSTOUTING链:用于源地址转换(SNAT)。

1.2 参数选择

1.2.1 规则管理命令,如表1-1所示:

表1-1 规则管理参数及作用
选项说明
-A在指定链的末尾插入指新规则
-I在链的指定位置插入一条或多条规则,如果指定的规则号是1,则在链的头部插入。默认是1。
-D在指定链中删除一个或多个指定规则。
-R替换/修改第几条规则

1.2.2 源地址目标地址的匹配,如表1-2所示:

表1-2 地址匹配参数及作用
选项说明
-p匹配的数据包协议类型,如tcp,udp,icmp,all。也能在协议前加上“!”。
-s匹配来源地址IP/MASK,加叹号“!”表示除这个IP外。当后面没有 mask 时,address 是一个地址。iptables仅支持ipv4。
-d地址格式同上,匹配目标地址。
-i匹配从这块网卡流入的数据,比如最常见的 eth0 。
-o匹配从这块网卡流出的数据

1.2.3 链管理命令,如表1-3所示:

表1-3 链管理参数及作用
选项说明
-P为指定的链设置默认策略
-F清空指定链上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-X清除表中使用者自定的空链中的规则
-Z把指定链,或者表中的所有链上的所有计数器清零。
-N用指定的名字创建一个新的链
-j满足某条件时该执行什么样的动作
–dport num匹配目标端口号
–sport num匹配来源端口号

默认策略一般只有两种:

[root@localhost ~]# iptables -P INPUT ( DROP | ACCEPT ) 
//默认是关的/开的
[root@localhost ~]# iptables -P INPUT DROP 
//拒绝默认规则。且并且没有定义什么动作,所以关于外界连接的所有规则,包括远程连接都被拒绝了。

动作包括:

• ACCEPT:接收数据包。
• DROP:丢弃数据包。
• REJRCT: 拒绝通过,必要时会给出提示
• SNAT:源地址转换。
• DNAT:目标地址转换。
• LOG:记录日志,然后传给下一条规则

1.2.4 查看管理命令,如表1-4所示:

表1-4 查看管理参数及作用
选项说明
-L列出链上面的所有规则。如果没有指定链,默认只列出表filter上所有链的所有规则。
-n以数字形式显示地址、端口等信息
–line-numbers查看规则时,显示规则的行号。

注:如果没有找到匹配条件,则执行防火墙默认规则

2. 设置扩展的规则匹配

2.1 多端口匹配

匹配多个源端口:

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --sport 22,23,53,80 -j ACCEPT

匹配多个目的端口:

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 22,23,53,80 -j ACCEPT

匹配多端口(无论是源端口还是目的端口):

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --port 22,23,53,80 -j ACCEPT

匹配连续端口

[root@localhost ~]# iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
2.2 指定 TCP 匹配

使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤

[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN -j ACCEPT
//表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。
2.3 速率匹配

指定单位时间内允许通过的数据包个数,单位时间可以是/second、/minute、/hour、/day

[root@localhost ~]# iptables -A INPUT -m limit --limit 300/hour -j ACCEPT

指定触发事件的阀值

[root@localhost ~]# iptables -A INPUT -m limit --limit-burst 10 -j ACCEPT
# 一次同时涌入的封包超过10个将直接丢弃
2.4 基于状态的扩展匹配
  • NEW: 该包想要开始一个新的连接(重新连接或连接重定向)。
  • RELATED: 该包是属于某个已经建立的连接所建立的新连接。
  • ESTABLISHED:该包属于某个已经建立的连接。
  • INVALID: 该包不匹配于任何连接,通常这些包被DROP。

在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。

[root@localhost ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

在INPUT链链添加一条规则,匹配所有从非eth0接口来的连接请求包。

[root@localhost ~]# iptables -A INPUT -m state --state NEW -i !eth0 -j ACCEPT

三、实验步骤

1、安装iptables服务

[root@localhost ~]# yum install -y iptables-services

2、关闭firewalld服务

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

3、启动iptables服务

[root@localhost ~]# systemctl start iptables

4、备份iptables文件

[root@localhost ~]# cp -a /etc/sysconfig/iptables /etc/sysconfig/iptables.bak

5、设置 INPUT 方向拒绝所有的请求

[root@localhost ~]# iptables -P INPUT DROP

6、开放所需端口

[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

7、保存规则

[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
#如果不保存,重启服务器还是会恢复原来没有设置的状态。

8、设置为开机自启并重启服务

[root@localhost ~]# service iptables enabled
[root@localhost ~]# service iptables restart

制作成员: 何嘉愉
排版: 裕新
初审: 杨佳佳
复审: 二月二

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐