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)

iptables4表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命令参数

参数含义
-Llist,显示表中所有规则
-n不要把端口或ip反向解析为名字
-t指定表,不指定默认为filter表
-Aappend,追加,把规则写入到链的末尾,加入准许类规则,使用-A
-Iinsert,把规则加在链的第1条,拒绝类规则要放在所有规则的最上面,所有拒绝类要用-I
-P设置默认规则
-Ddelete,删除。例如:-D INPUT 1

描述什么类型的数据:

参数含义
-p指定协议protocol如,tcp、udp、icmp等
–dport目标端口,dest destination port。指定端口的时候要加上-p协议
–sportsource port,源端口
-s–source,源ip。如果只屏蔽/允许ip或网段,则不用加上协议
-d–destination,目标ip。
-m指定模块,multiport
-i 网卡input,从哪块网卡进来
-o 网卡output,从哪块网卡出去

动作参数:

参数含义
-j满足条件后的动作:ACCEPT(允许)、DROP(拒绝)、REJECT(拒绝)
ACCEPT:允许
DROP:把数据丢掉,不会返回信息给用户
REJECT:拒绝,返回拒绝信息给用户

其他参数:

参数含义
-Fflush,清除表中所有规则。清除之前最好备份一下
-X删除用户自定义的链
Zzero,链的计数器清零(数据包计数器与数据包字节计数器)
-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