1、防火墙种类
硬件:整个企业入口
三层路由:H3C、华为、思科
防火墙:深信服、绿盟。。
软件:开源软件,网站内部,封ip
iptables:写入Linux内核,以后服务docker,工作在4层(大部分)
firewalld Centos7
ntftalbes Centos8
ufw(Ubuntu firewall)
云防火墙(公有云)
阿里云:
安全组(封ip、端口)
NAT网关(共享上网,端口映射...)
waf应用防火墙
waf防火墙(应用防火墙,处理7层的攻击) SQL注入等攻击
书写规则(描述攻击过程,关键提示、关键操作)
企业选型:
中小企业:使用公有云、安全组、waf防火墙,态势,感知
访问量大:使用硬件防火墙,waf防火墙,硬件服务器+云服务器
2、名词
容器:存放东西,如瓶子、罐子
表(table):存放链的容器,防火墙最大的概念
链(chain):存放规则的容器
规则(policy):准许或决绝规则,未来书写的防火墙条件就是各种防火墙规则
3、iptables执行过程
1)防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2)如果匹配成功规则,即表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再
向下匹配新的规则。
3)如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
4)防火墙的默认规则是所有规则都匹配完才会匹配的。
问:如果配置了一条拒绝的规则,该放在哪里?
应该写在最上面
官方详解:https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
4、表与链
4.1 简介
表(table):是对功能的分类,防火墙功能(filter表),共享上网,端口转发(nat表)
链(chains):对数据流进行处理,需要使用不同的链(如:数据流入(INPUT)、数据流出(OUTPUT)
iptables是4表5链
4表:filter表、nat表、raw表、mangle表
5链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
pre….之前
post….之后
4.2 每个表的说明
1)filter表
filter表:是iptables默认的表,filter表示过滤
实现防火墙功能:(对数据包的filter过滤)屏蔽或准许,端口,ip
| filter表 | 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据),filter表示iptables默认使用的表,这个表定义了3个链(chains),企业工作场景:主机防火墙 |
|---|---|
| INPUT | 负责过滤所有目标地址是本机地址的数据包,通俗来说:就是过滤进入主机的数据包(能否让数据包进入服务器) |
| FORWARD | 路过:负责转发流经主机的数据包。起转发作用,和NAT关系很大。LVS NAT模式,net.ipv4.ip_forward=0 |
| OUTPUT | 处理所有源地址是本机的数据包,通俗来讲:就是处理从主机发出去的数据包 |
2)nat表
实现nat功能
实现共享上网(内网服务器上外网)
端口映射和IP映射
5、 配置规则
5.1 环境准备
默认情况下已经按照了iptables,如果没有,可以yum安装
yum install -y iptables iptables-services
防火墙相关模块,加载到内核中
写入到开启启动:
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
永久:
[root@m01 ~]#cat >> /etc/rc.local <<EOF
> modprobe ip_tables
> modprobe iptable_filter
> modprobe iptable_nat
> modprobe ip_conntrack
> modprobe ip_conntrack_ftp
> modprobe ip_nat_ftp
> modprobe ipt_state
> EOF
[root@m01 ~]#chmod +x /etc/rc.local
查看加载的模块:
[root@m01 ~]#lsmod | egrep 'filter|nat|ipt'
nf_nat_ftp 12809 0
nf_conntrack_ftp 18478 1 nf_nat_ftp
....
关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld
启动iptables防火墙:
[root@m01 ~]#systemctl start iptables
#开机启动
[root@m01 ~]#systemctl enable iptables
5.2 iptables命令使用
1)查看表的规则
[root@m01 ~]#iptables -t filter -nL
iptables -t 表名 -nL,如果不指定-t,则默认是filter表
2)清空表规则
[root@m01 ~]#iptables -F
不使用-t指定表,则默认是filter表
选项:
-F:清空所有
-X:清除自定义的链
-Z:清空
3)添加规则
案例:拒绝所有人访问23端口
[root@m01 ~]#iptables -t filter -I INPUT -p tcp --dport 23 -j REJECT
选项:
-t:指定表,默认是filter表
-I:规则写到最上面,也就是第一条,-I后面是链
-p:协议,比如:tcp、udp
--dport:目标端口
-j:动作,允许(ACCEPT)、拒绝(DROP、REJECT)
删除规则:
#删除所有
iptables -F
#删除某一条
iptables -t 表 -D 链 第几条
比如:
删除filter表INPUT链的第1条规则
iptables -t filter -D INPUT 1
5.3 iptables命令参数
| 参数 | 含义 |
|---|---|
| -L | list,显示表中所有规则 |
| -n | 不要把端口或ip反向解析为名字 |
| -t | 指定表,不指定默认为filter表 |
| -A | append,追加,把规则写入到链的末尾,加入准许类规则,使用-A |
| -I | insert,把规则加在链的第1条,拒绝类规则要放在所有规则的最上面,所有拒绝类要用-I |
| -P | 设置默认规则 |
| -D | delete,删除。例如:-D INPUT 1 |
描述什么类型的数据:
| 参数 | 含义 |
|---|---|
| -p | 指定协议protocol如,tcp、udp、icmp等 |
| –dport | 目标端口,dest destination port。指定端口的时候要加上-p协议 |
| –sport | source port,源端口 |
| -s | –source,源ip。如果只屏蔽/允许ip或网段,则不用加上协议 |
| -d | –destination,目标ip。 |
| -m | 指定模块,multiport |
| -i 网卡 | input,从哪块网卡进来 |
| -o 网卡 | output,从哪块网卡出去 |
动作参数:
| 参数 | 含义 |
|---|---|
| -j | 满足条件后的动作:ACCEPT(允许)、DROP(拒绝)、REJECT(拒绝) |
| ACCEPT:允许 | |
| DROP:把数据丢掉,不会返回信息给用户 | |
| REJECT:拒绝,返回拒绝信息给用户 |
其他参数:
| 参数 | 含义 |
|---|---|
| -F | flush,清除表中所有规则。清除之前最好备份一下 |
| -X | 删除用户自定义的链 |
| Z | zero,链的计数器清零(数据包计数器与数据包字节计数器) |
| -v | 显示数据包,数据量 |
5.4 规则书写格式
| iptables命令及选项 | 指定表 | 指定链(插入、追加、删除) | ip | 具体要求(端口,ip,协议) | 端口 | 动作 |
|---|---|---|---|---|---|---|
| iptables | -t filter | -A INPUT | -s源ip | -p tcp/udp/icmp | –dport 目标端口 | -j ACCEPT |
| -I | -d目标ip | –sport 源端口 | -J DROP | |||
| -D | -j REJECT |
6、案例
案例1:禁止192.168.10.0/24网段访问8888端口
创建端口:
[root@m01 ~]#nc -kl 8888
用其他机器连接8888端口
[root@web03 ~]#telnet 192.168.10.61 8888
如图:

可以连接。
下面设置拒绝规则,具体规则:
[root@m01 ~]#iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 8888 -j DROP
案例2:禁止192.168.10.8访问
[root@m01 ~]#iptables -I INPUT -s 192.168.10.8 -j REJECT
案例3:只允许172.16.1.0网段
实现阿里云白名单功能:默认是拒绝,开放端口、网段
allow 192.168.10.0/24;
deny all;
规则:
#利用!进行排除
[root@m01 ~]#iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
#只允许192.168.10.0/24访问,言外之意,除了192.168.10.0/24都拒绝
[root@m01 ~]#iptables -I INPUT ! -s 192.168.10.0/24 -j DROP
案例4:修改默认规则
查看默认规则:
[root@m01 ~]#iptables -nL
Chain INPUT (policy ACCEPT)
括号后面的规则就是默认规则,默认是ACCEPT
修改默认规则:
iptables -P 链 规则(DROP、REJECT、ACCEPT)
一般情况下,先配置好准许规则,最后把默认规则改为拒绝
案例5:指定多端口,如,禁止8888,9999端口
[root@m01 ~]#iptables -I INPUT -m multiport -p tcp --dport 8888,9999 -j DROP
指定多端口,要使用-m multiport参数
案例6:指定端口范围,如:1000到2000
[root@m01 ~]#iptables -I INPUT -p tcp --dport 1000:2000 -j DROP
案例7:匹配icmp类型,禁止ping
方案1:防火墙规则
ICMP:Internet Control Message Protocol,Internet控制报文协议,ping
通过防火墙规则,控制是否可以ping
[root@m01 ~]#iptables -I INPUT -p icmp --icmp-type 8 -j DROP
–icmp-type 8 :可以省略
方法2:修改内核
[root@m01 ~]#vim /etc/sysctl.conf
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all=1 #1拒绝,0允许
#生效
[root@m01 ~]#sysctl -p
案例8:匹配网络状态(TCP/IP连接状态)
-m state –state 状态即可。
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
例如:
[root@m01 ~]#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@m01 ~]#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
案例9:限制并非及速率
-m limit限制模块
指定时间内的请求速率,n为速率,后面可以是秒、分、时
-m limit --limit n/(second、minute、hour)
如:
-m limit --limit 10/minute #每分钟只能有10个数据包,每6秒生产
-m limit --limit 10/minute --limit-burst 5 #10个数据包,前5个,1个1个工牌,从第6个开始,每6秒才释放一个
--limit-burst [n]:在同一时间允许通过的请求,n为数字,不指定默认为5
7、规则保存与恢复
iptables-save:备份规则,默认输出到屏幕
iptables-restore < 文件:从文件中恢复
写入到/etc/sysconfig/iptables
[root@m01 ~]#iptables-save > /etc/sysconfig/iptables
启动防火墙的时候会读取/etc/sysconfig/iptables文件,所以,一般保存在这个文件中即可。
8、生产用法
iptables配置方式:
逛公园模式:默认规则是ACCEPT,也就是说,不配置决绝,就所有都允许。
看电影模式:默认规则是DROP,然后配置白名单。不配做允许,所有都拒绝。
配置默认拒绝
1、ssh可以连接进来
iptables -F
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
2、设置允许本机lo通讯规则
#-i 数据进行的时候
iptables -A INPUT -i lo -j ACCEPT
#-o 数据流出的时候
iptables -A OUTNPUT -O lo -j ACCEPT
3、放行80 443端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
4、最后,修改INPUT默认规则为拒绝,其他为允许
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
5、保存
iptables-save
9、nat表
nat表用于实现nat功能,nat网络地址转换
共享上网(路由器功能)(内部服务器访问外网)
端口转发、端口映射、ip映射(外部的人想访问内部的某个端口)
9.1 共享上网
应用场景:
局域网的服务器没有公网ip,但是需要连接公网下载软件等
内网172.16.1.7访问百度公网ip8.8.8.8原理图:

如果公网ip不固定:
-j SNAT --to-source 192.168.10.61 可以写成:-j MASQUERADE #伪装成公网ip
9.2 案例实战
环境准备
m01:配置共享上网规则
web03:172.16.1.9(只保留这个网卡),eth0网卡关闭
1)m01配置
1、防火墙配置
配置防火墙规则,默认为准许
清空其他规则
配置防火墙共享上网规则
操作:
#设置默认为准许
[root@m01 ~]#iptables -P INPUT ACCEPT
#清空其他规则
[root@m01 ~]#iptables -F
#配置共享上网规则
[root@m01 ~]#iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.10.61
注意:
如果公网ip不固定,则改为:
[root@m01 ~]#iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
2、修改内核参数
开启防火墙内核转发功能(ip_forward)
[root@m01 ~]#echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@m01 ~]#sysctl -p
net.ipv4.ip_forward = 1
[root@m01 ~]#
2)web03配置
关闭eth0网卡(ONBOOT=no),仅开启eth1网卡,配置网关指向172.16.1.61,DNS(223.5.5.5,223.6.6.6)
#1、修改eth1网关为172.16.1.61
[root@web03 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
DNS1=223.5.5.5
DNS2=223.6.6.6
#2、把eth0改成ONBOOT=no
[root@web03 ~]#sed -i '/ONBOOT/s#yes#no#g' /etc/sysconfig/network-scripts/ifcfg-eth0
#3、重启网卡
[root@web03 ~]#systemctl restart network
重启网卡后,远程连接会断开。所以要在虚拟机上操作。
查看ip:

此时,只有eth1网卡。

可以ping通百度,因此可以连接公网。
小结:共享上网流程
1、防火墙添加规则。nat表POSTROUTING链添加SANT规则,或添加伪装规则MASQUERADE
2、防火墙服务器开启ip转发(内核转发:net.ipv4.ip_forward = 1)功能
3、后端节点,让网关指向防火墙并配置DNS
9.3 端口转发
端口映射为了解决用户进来的问题。外部的用户访问内网的某个服务器的端口
解决方案:防火墙实现或其他网络设备实现
例如:
[root@m01 ~]#iptables -t nat -A PREROUTING -d 192.168.10.61 -p tcp --dport 9999 -j DNAT --to-destination 172.16.1.9:22
用户访问防火墙(192.168.10.61)的9999端口,就转发到后面的172.16.1.9主机的22端口。
这里使用到nat表PREROUTING链的DNAT规则,同样的,防火墙服务器也要开启ip转发(内核转发:net.ipv4.ip_forward = 1)功能
9.4 ip映射
一个防火墙ip对应一台内网机器,不太常用。例如:
iptables -t nat -A PREROUTING -d 192.168.10.61 -j DNAT --to-destination 172.16.1.9