目录

前言

一、iptables防火墙基础

1.1 netfilter和iptables关系

1.2 iptables的四表五链

1.2.1 四表

1.2.2 五链 

1.3 数据包控制的匹配流程

1.3.1 入站

1.3.2 转发

1.3.3 出站     

二、iptables的配置及相关规则

 2.1 命令格式

2.2 常用控制类型

2.3 常用的管理选项

2.4 匹配条件

2.5 iptables语法总结

 2.6 案例

三、规则的匹配

 3.1 通用匹配

 3.2 隐含匹配

3.2.1 端口匹配

 3.2.2 TCP标记匹配

 3.2.3 ICMP类型匹配

3.3 显示匹配

总结


前言

保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。

iptablescentos 5/6  系统默认防火墙
firewalldcentos 7/8  系统默认防火墙
iptables用的较多,在7和8上也是有的,现在流行的k8s就是基于iptables

一、iptables防火墙基础

  • 硬件防火墙:性能好,用图形化 管理,一般公司用硬件(华为E9000)
  • 软件防火墙:做辅助,做在服务器上,用命令管理

Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成

主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口、协议等信息的处理上

1.1 netfilter和iptables关系

Linux中称为包过滤防火墙,iptables和firewalld都有两个组件netfilter和iptables,这两种称呼都可以表示Linux防火墙。

注意:与netfilter相提并论的iptables是iptables防火墙的组件,可以认为是iptables防火墙的分支,但是名字一样

  • netfilter
  1. 位于Linux内核中的包过滤功能体系
  2. 称为Linux防火墙的“内核态”(又称内核空间)
  • iptables
  1. 位于/sbin/iptables,用来管理防火墙规则的工具
  2. 称为Linux防火墙的“用户态”(又称用户空间)

netfilter/iptables后期简称为iptables, iptables是基于内核的防火墙,其中内置了raw、mangle、nat和filter四个规则表。

表中所有规则配置后,立即生效,不需要重启服务。

1.2 iptables的四表五链

规则表的作用容纳各种规则链
规则链的作用容纳各种防火墙规则
总结表中有链,链中有规则

1.2.1 四表

含义包含的规则链
raw表确定是否对该数据包进行状态跟踪OUTPUT、PREROUTING
mangle表修改数据包内容,用来做流量整形的,给数据包设置标记INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUING
nat表负责网络地址转换,用来修改数据包中的源、目标IP地址或端口OUTPUT、PREROUTING、POSTROUING
filter表负责过滤数据包,确定是否放行该数据包(过滤)INPUT、FORWARD、OUTPUT

在iptables的四个规则表中, mangle表和raw表的应用相对较少

filter表是防火墙的默认表

1.2.2 五链 

作用
INPUT链

处理入站数据包,匹配目标IP为本机的数据包

OUTPUT链

处理出站数据包,一般不在此链上做配置

FORWARD链

处理转发数据包,匹配流经本机的数据包

PREROUTING链

在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上

POSTROUING链

在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网

规则链之间的匹配顺序:

主机型防火墙:

入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING --> INPUT -->本机的应用程序

出站数据(从防火墙本机向外部地址发送的数据包) :本机的应用程序--> OUTPUT --> POSTROUTING

网络型防火墙:

转发数据(需要经过防火墙转发的数据包) : PREROUTING --> FORWARD --> POSTROUTING


规则链内的匹配顺序:

自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)

若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)

1.3 数据包控制的匹配流程

标红的代表该链的规则通常在这个表上配置 

1.3.1 入站

入站数据包从A网络发到B网络,首先发到防火墙,先后顺序经过有PREROUTING链的三个表(raw、mangle、nat),如果都是放通状态的会经过路由选择,然后根据目的地址一层一层往上送,经过有INPUT的两个表(mangle、filter),一直送到应用程序

1.3.2 转发

目的地不是本机,数据包先从A网络过滤,经过PREROUTING链,看是否是自己的目的地址,如果是外网到内网需要用nat转换成内网IP,找到内网用户,经过FORWARD链进行过滤,允许放通的到达POSTROUING链,再把内网地址转换成公网,这样数据包才能回去;如果是内网往外网发顺序就是反过来

1.3.3 出站     

从本机的应用程序发出来, 经过路由选择,让路由知道从哪里发,先后顺序经过有OUTPUT链的四个表(raw、mangle、nat、filter),都放通后到达POSTROUING链的两个表(mangle、nat),如果没有什么转换地址,就出站

二、iptables的配置及相关规则

#centos7中是可以敲iptables的命令的,但是无法进行管理,因为默认是用firewalld进行管理的
[root@localhost ~]# which iptables
/usr/sbin/iptables
[root@localhost ~]# 

#若想使用iptables防火墙,必须先关闭 firewalld防火墙,再安装iptables
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@localhost ~]# yum install -y iptables iptables-services
已加载插件:fastestmirror, langpacks
local                                                 | 3.6 kB     00:00     
Loading mirror speeds from cached hostfile
软件包 iptables-1.4.21-18.0.1.el7.centos.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 iptables-services.x86_64.0.1.4.21-18.0.1.el7.centos 将被 安装
--> 解决依赖关系完成

依赖关系解决

=============================================================================
 Package              架构      版本                          源        大小
=============================================================================
正在安装:
 iptables-services    x86_64    1.4.21-18.0.1.el7.centos      local     51 k

事务概要
=============================================================================
安装  1 软件包

总下载量:51 k
安装大小:25 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : iptables-services-1.4.21-18.0.1.el7.centos.x86_64        1/1 
  验证中      : iptables-services-1.4.21-18.0.1.el7.centos.x86_64        1/1 

已安装:
  iptables-services.x86_64 0:1.4.21-18.0.1.el7.centos                        

完毕!

#可以看到iptables默认是已安装的
[root@localhost ~]# systemctl start iptables.service 
#安装完后启动服务

在centos6中可以通过图形化界面(如下图)来管理,但是在centos7中没有反应,只能通过命令行来管理 

 2.1 命令格式

iptables [-t 表名] 管理选项  [链名]  [匹配条件]  [-j   控制类型]

注意事项:

  • 不指定表名时,默认指filter表
  • 不指定链名时,默认指表内的所有链
  • 除非设置链的默认策略,否则必须指定匹配条件
  • 控制类型使用大写字母,其余均为小写

2.2 常用控制类型

ACCEPT

允许数据包通过

DROP

直接丢弃数据包,不给出任何回应信息

REJECT

拒绝数据包通过,会给数据发送端一个响应信息

SNAT

修改数据包的源地址

DNAT

修改数据包的目的地址

MASQUERADE

伪装成一个非固定公网IP地址

LOG

在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包

2.3 常用的管理选项

-A

在指定链的末尾追加(--append)一条新的规则

-I

在指定链的开头插入(--insert)一条新的规则,未指定序号时默认作为第一条规则

-R

修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容

-P

设置指定链的默认策略(--policy)

-D

删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容

-F

清空(--flush)指定链中的所有规则,若未指定链名,则清空表中的所有链

-L

列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链

-n

使用数字形式(--numeric)显示输出结果,如显示IP地址而不是主机名

-v

显示详细信息,包括每条规则的匹配包数量和匹配字节数

--line-numbers

查看规则时,显示规则的序号

2.4 匹配条件

匹配条件说明
-p指定要匹配的数据包的协议类型
-s指定要匹配的数据包的源IP地址
-d指定要匹配的数据包的目的IP地址
-i指定数据包进入本机的网络接口
-o指定数据包离开本机做使用的网络接口
–sport指定源端口号
–dport指定目的端口号

2.5 iptables语法总结

 2.6 案例

  • 案例1:默认查看filter表

-nL可以合起来写,但是n必须放在前面,放在后面会报错,如上图所示的报错 

  • 案例2 :查看其他表

  • 案例3:一键清空规则

  • 案例4:设置ping不可达

 

0.0.0.0/0  代表所有主机都生效 

 

 案例5:添加

 案例6:插入

不指定默认是在第一行插入添加 

案例7:删除

 如果有多条一样的规则,是先删序号小的那条

案例8:设置默认规则

 

三、规则的匹配

 3.1 通用匹配

可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件

协议匹配

-p  协议名

地址匹配

-s  源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址)

接口匹配

-i 入站网卡、-o  出站网卡

iptables -A FORWARD ! -p icmp -j ACCEPT
#没有-t指定表,就是指默认表filter表
#!代表条件取反,不是ICMP的都放通

iptables -A INPUT -s 192.168.109.132 -j DROP
#拒绝从哪个主机发数据包过来


iptables -I INPUT -i ens33 -s 192.168.109.0/24 -j DROP
#在行首插入  禁止该网段从ens33网卡进来
  • 案例1 

  •  案例2

 3.2 隐含匹配

要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件

3.2.1 端口匹配

--sport 源端口    --dport  目的端口

可以是个别端口、端口范围
--sport 1000匹配源端口是1000的数据包
--sport 1000:3000匹配源端口是1000-3000的数据包
--sport  :3000匹配源端口是3000及以下的数据包
--sport  1000:匹配源端口是1000及以上的数据包
注意:--sport和--dport必须配合-p  <协议类型>  使用

 3.2.2 TCP标记匹配

--tcp-flags  TCP标记

#丢弃SYN请求包,放行其他包
# SYN,RST,ACK SYN  前面三个包逗号,然后空格跟一个,表明前面的三个里面除了这空格后面的SYN,其他都放行
[root@localhost ~]# iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp flags:0x16/0x02
DROP       all  --  192.168.109.132      0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:20:21

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
 

 3.2.3 ICMP类型匹配

--icmp-type  ICMP类型

可以是字符串、数字代码

Echo-Request(代码为8)请求
Echo-Reply (代码为0)回显
Destination-Unreachable(代码为3)目标不可达
其他可用的icmp协议类型,可以执行iptables -p icmp -h  查看帮助信息

Request--(ping)

Reply --(pong)

有点类似乒乓,一个请求一个回显

iptables -A INPUT -p icmp -j DROP
#增加了此条规则不仅别人ping不通自己,自己也ping不通别人,这是因为回复回不来,数据有ping和pong一来一回,ping出去了,pong不回来,被防火墙拦截了
#如果我们想要双标,别人ping不通自己,但是自己也能ing通别人,怎么操作呢

3.3 显示匹配

要求以"-m扩展模块"的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件

  • 多端口匹配:

-m multiport --sport   源端口列表

-m multiport --dport   目的端口列表

#m扩展模块可以一次指定多个端口,不必一条条写了
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT 
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,22,21,20,53

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

  •  IP范围匹配:

-m iprange --src-range  源IP范围

-m iprange --dst-range  目的IP范围

#禁止转发源地址位于192.168.109.100-192.168.109.200的udp数据包
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 192.168.109.100-192.168.109.200 -j DROP 
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,22,21,20,53

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DROP       udp  --  0.0.0.0/0            0.0.0.0/0            source IP range 192.168.109.100-192.168.109.200

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

  •  MAC地址匹配: (用的不多)

-m mac --mac-source   源MAC地址

iptables -A FORWARD -m mac --mac-source xx:xx:xx:Xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
  • 状态匹配:

-m state --state连接状态

常见的连接状态:

NEW主机连接目标主机,在目标主机上看到的第一个想要连接的包
ESTABLISHED主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态
RELATED主机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED配合使用
INVALID无效的封包,例如数据破损的封包状态
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#第一个包我只看22端口的包
#-p tcp是隐含匹配,可以省略-m tcp

iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
#允许放通tcp的这些端口号
#-m multiport加载多个端口模块

iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT
#表示与上述连接相关的数据我都放通

iptables -P INPUT DROP
#默认关闭,将以上的设置设为白名单

总结

Linux防火墙系统

组成 内核态 netilter(保存包过滤处理的规则集);用户态 iptables(防火墙规则管理工具)


四表

raw         对数据包进行状态跟踪

mangle   修改数据包内容,给数据包设置标记

nat          地址转换,转换源/目的IP或者端口

fileter       过滤数据包 放行 丢弃


五链

INPUT                入站

OUTPUT            出站

FORWARD         转发

PREROUTING    路由前修改目的地址

POSTROUTING  路由后修改源IP


链中的规则集:从上往下一次匹配,匹配到规则即停止,若都没有匹配到则按默认策略处理


iptables  -t  表  -A 在末尾添加  -j  控制类型

                         -I  在前面插入

                         -D 删除

                          -F 清空

                          -R 改

                          -nL  查

                           -P 设置默认规则


匹配条件

-p tcp|udp|icmp

-s 源IP

-d 目的IP

-i 入站网卡

-o 出站网卡


数据包通信要素 

四要素五要素
源IP        目的IP+协议  UDP/TCP
源端口        目的端口

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐