# 什么是防火墙?
```
就是一堵墙, 阻挡所有一切不符合规矩的墙。
校门,你在进入学校之前门口保安要求你,佩戴好校卡,穿好校服,带好口罩你才能进入学校。
为什么需要带校卡?
校卡是唯一一个能识别你是否是本校学生的身份标志。
校服是唯一一个能识别你是学生的身份标志。
口罩是防疫要求。
假如未佩戴校卡,你将无法进入校门。
校卡、校服、口罩 这些都是规矩,如果你没有安装规矩执行那么你将呗拒之门外。 所以这就是我们生活当中的防火墙。
我们回到Linux之中来看,什么是防火墙?
中国防火墙规定,阻止所有中国区域内的互联网访问国际网络。
比如说,所有普通公民都无法上国际网络,这是违法行为。
假设,政府单位,国家公务员如有特殊工作性质,允许访问国际网络。
访问国际网络是中国防火墙不允许的!也是中国法律不允许的。
简单来说就是防止一切,不符合规则内的操作入侵。它将拒绝一切不符合规矩的入侵,并可能记录下来,需要你手动设置日志。
```
##### 防火墙的分类
```
1:硬件防火墙和软件防火墙
2:过滤型防火墙和应用代理防火墙
```
##### Linux系统下的Netfilter/iptables
```
内核模块
用户管理工具
数据包处理OSI234
升级添加模块(应用)
```
![1][1]
##### 补充修改
```
nat表中,有INPUT链
```
```
防火墙是由规则中,有四个表,第四个表raw, 规则由表组成,而表由链组成
```
##### 表
```
filter:默认表。数据包过滤
nat:数据包转发
mangle:数据包修改。
raw:数据包NOTRACK。
```
##### 表的优先级
```
由高到低的顺序为:raw->mangle->nat->filter
```
##### 链
```
INPUT:处理目的地址是本地的数据包
OUTPUT:处理离开本地进程的数据包
FORWARD:处理经过本地路由转发的数据包
PREROUTING:处理刚刚到达的数据包
POSTROUTING:处理即将离开系统的数据包
自定义链:产生分类子链
```
![链][2]
##### Netfilter包处理规则
```
1.按顺序排列规则 #从上到下 1、2、3、4、5
2.按从上到下的顺序匹配
3.匹配后立即退出 #假设你提供校卡就是本校学生 假设你穿拖鞋就不是本校学生
4.规则可以指定多个匹配条件 #一条规则,可以匹配多个规则 比如说:明确端口、 明确数据包类型、明确访问次数。
5.必须满足规则说明中的每个条件才算是匹配 #必须符合 80端口、TCP协议、5次
6.如果无匹配规则则应用链的默认策略 #默认所有数据包允许通过
7.如果在定制链中找不到匹配,那么就会返回到调用这个定制链的链 #lo 链 把所有匹配动作都放在lo链内,而INPUT链则使用默认策略。 所有动作都匹配不上则
```
```
当需要写的防火墙规则过多时, 此时用定制链来区分,相同规则的 放在一个链内 ,不想同规则的放在另一个链内
```
```
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# ipatbles -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -P INPUT DROP
```
##### 规则处理目标
```
1.内置TARGET
ACCEPT ,DROP,QUEUE,RETURN
ACCEPT:接受
DROP:拒绝
QUEUE:序列
RETURN:返回
2.扩展TARGET(常用)
DNAT,SNAT,LOG,MASQUERADE,REDIRECT,REJECT,CUSTOM CHAIN
DNAT:目标地址
SNAT:源地址
LOG:日志
MASQUERADE:动态地址伪装
REDIRECT:重定向
REJECT:拒绝
CUSTOM:定制
CHAIN:链
3.匹配LOG目标后不会退出规则检查
4.每条规则最多只能一个目标,可以没有目标。
DROP:拒绝 (对服务端友好) 不会明确的告诉男生我今晚去不去,等同于不回信息
男生向女生发信息:
男:今晚我们一起去吃饭吧,你有时间吗?
女:无回复
REJECT:拒绝 (对客户端友好) 会明确告诉对方,自己拒绝对方的信息。
男生向女生发信息:
男:今晚我们一起去吃饭吧,你有时间吗?
女:不好意思,我今晚没时间。
```
# iptables操作语法
```
Iptables [-t 要操作的表] < 操作命令> [要操作的链][规则号码][匹配规则][-j匹配到以后的动作]
操作命令(-A –I –D –R –P –F –N -X)
-A:添加 #在末行添加
-I:插入 #在首行添加
-D:删除
-R:替换
-P:默认策略
-F:清空
-N:建立新的链
-X:清除所有自定义链
查看命令(-[vnx]L)
匹配规则(-s –d –i –o -p --dport --sport --icmp-type)
-s:源地址
-d:目标地址
-i:进来接口
-o:出去接口
-p:协议 #TCP、UDP
--dport:目标端口
--sport:源端口
--icmp-type:ping包类型
目标动作(ACCEPT,DROP,DNAT,SNAT,LOG,MASQUERADE,REDIRECT,REJECT,CUSTOMCHAIN)
输写规则
所有表名必须小写;
所有链名必须大写;
所有目标动作必须大写;
所有匹配必须小写;
注意选项大小写的区别。
```
##### 实例1 filter 表INPUT
##### 实验环境
![实验环境][3]
```
client: 192.168.10.1
server: 192.168.10.2
server: apache2 iptables
```
##### server配置
```
第一步:apt install apache2
第二步:iptables -t filter -A INPUT -s 192.168.10.1 -p tcp --dport 80 -j ACCEPT #放行192.168.10.1 允许访问80端口、
第三步:iptables -nvL #查看流量
第四步:iptables -t filter -P INPUT DROP #修改filter表中的INPUT链的默认规则,修改为默认拒绝
#拒绝所有后,ssh会无法连接、ping 也无法ping 通192.168.10.2
第五步:iptables -t filter -A INPUT -d 192.168.10.2 -p tcp --dport 22 -j ACCEPT #所有地址只要访问192.168.10.2 的22端口都允许
第六步:iptables -t filter -A INPUT -j REJECT --reject-with icmp-host-unreachable #直接告诉对方不能访问。
```
![测试图][4]
##### Client配置
```
第一步:apt install curl
第二步:curl 192.168.10.2
```
##### 实例2 filter中OUTPUT
##### 实验环境
![实验环境][5]
```
client: 192.168.10.1
server: 192.168.10.2
server: apache2 iptables
```
##### server配置
```
拒绝出去的数据包
第一步:iptables -t filter -A OUTPUT -j REJECT --reject-with icmp-host-unreachable #此时ssh也断掉了 #拒绝掉所有数据出去
第二步:iptables -I OUTPUT -s 192.168.10.2 -p tcp --sport 22 -j ACCEPT
第三步:iptables -I OUTPUT -s 192.168.10.2 -p tcp --sport 80 -j ACCEPT
第四步:iptables -nvL #查看流量 此时发现很多端口策略 如何让它看起来更简洁
第五步:iptables -I OUTPUT -s 192.168.10.2 -p tcp -m multiport --sports 22,80 -j ACCEPT #同时放行多个端口
```
##### 显示序列号
```
iptables -L -n --line-number #显示序列号
```
##### 删除链规则
```
iptables -D OUTPUT 2 #删除OUTPUT链中第2条规则
```
##### 保存防火墙
```
apt install iptables-persistent -y #安装软件
netfilter-persistent save #保存防火墙规则写进配置文件内
```
##### 清空防火墙配置
```
iptables -F #清空防火墙
将INPUT修改成ACCEPT
iptables -P INPUT ACCEPT #修改为允许
```
##### 还原备份
```
netfilter-persistent reload #将配置文件内的规则还原
```
##### 更完整的写法
```
-A INPUT -m state --state INVALID -j DROP #INVALID 无效的数据包进行丢弃
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #关联性和保持连接的数据包放行
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT #访问TCP 80端口的允许访问, NEW 只允许新连接的才允许访问,旧连接不允许。
-A INPUT -i lo -j ACCEPT #允许环回接口访问
-A INPUT 4 -p tcp --syn --dport 22 -m recent --name sshd --update --seconds 600 --hitcount 5 -j DROP #第一个包时,会进行计时600秒内,如果你连续访问5次的话将会被拒绝。
-A INPUT 5 -p tcp --syn --dport 22 -m recent --name sshd –set #定义成一个名字
-A INPUT 4 -m state --state NEW -p tcp --dport 22 -j ACCEPT #如果你没有在600秒之内连续访问5次,那么我将允许访问 #此3条有什么作用? 用于防暴力攻击 防止黑客撞库测试
-A INPUT -j REJECT --reject-with icmp-host-prohibited #拒绝ping包
-A FORWARD -j REJECT --reject-with icmp-host-prohibited #拒绝转发链 防止ssh进行翻墙
```
##### 实例3 内网转外网
##### 实验环境
![实验环境][6]
```
gateway 192.168.10.3/24 #NAT模式 能访问外网
10.1.1.254/24 #vlan 1
client 10.1.1.1/24 #vlan 1
gateway 10.1.1.254
```
##### gateway配置
```
第一步:vim /etc/sysctl.conf #打开路由转发功能
第二步:iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to-source 192.168.10.3 #将此10.1.1.0网段的所有数据转换成 192.168.10.3 地址
或者 iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
第三步:iptables -A FORWARD -j DROP
第四步:iptables -nL FORWARD
第五步:iptables -I FORWARD -s 10.1.1.0/24 -j ACCEPT #放行后还是不能访问www.baidu.com 因为没有放行回来的数据包
第六步:iptables -I FORWARD -d 10.1.1.0/24 -j ACCEPT #这样写很麻烦
第七步:iptables -D FORWARD 1
应该写关联性
第八步:iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT #放行关联性的数据包
第九步:apt install iptables-persistent -y
第十步:netfilter-persistent save #保存防火墙规则写进配置文件内
```
##### 实例4 外网转内网
![环境][7]
[1]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151515.jpeg
[2]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151548.jpeg
[3]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151622.jpeg
[4]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151657.jpeg
[5]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151728.jpeg
[6]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151840.jpeg
[7]: https://panfeng-biji.oss-cn-beijing.aliyuncs.com/oss/20211007151909.jpeg
```
防火墙 192.168.10.3/24 #NAT模式
10.1.1.254/24 #vlan 1
apache2 10.1.1.1/24 #vlan 1
Client 192.168.10.222 #本机电脑
```
##### apache2配置
```
第一步:apt install apache2 #打开配置文件
第二步:vim /etc/sysctl.conf
#打开路由转发功能
第三步:sysctl -p #激活配置文件
```
##### 防火墙
```
第一步:vim /etc/sysctl.conf #打开配置文件
#打开路由转发功能
第二步:sysctl -p #激活配置文件
第三步:iptables -t nat -A PREROUTING -d 192.168.10.3 -p tcp --dport 80 -j DNAT --to 10.1.1.1
```
##### Client
```
打开网页进行测试192.168.10.3
```
# 课堂练习时间 5点
##### 知识点练习
```
配置WEB服务器的防火墙(FTP部分可先不做)。
要求:在主机上安装httpd ,vsftpd软件,并启动相应的服务,配置以下防
火墙策略,使服务能被客户端正常访问。
1. 拒绝所有的无效包的连接请求。(filter INPUT)
2. 对于80,21的端口的请求放行。(filter INPUT)
3. 对于22端口的请求只允许eth0上的IP联接,假设还有eth1.(filter INPUT)
4. 对于22端口的非法连接请求记录日志。(filter INPUT)
5. 禁止服务器被ping。(filter INPUT)
6. 禁止服务器主动向外发送联网请求,但可以进行ping外网测试。(filter
OUTPUT)
7. 拒绝其他的所有链接。(filter policy)
```
```
配置DNAT/SNAT的转发防火墙。
环境:
准备两个虚拟机,vhost01 vhost02. 注意要停掉真机本身的防火墙(清空)。
vhost01 有两张网卡,eth0 桥接到br0,IP: 192.168.1.x eth1 采用默认的NAT
连接 IP:192.168.122.x 。vhost02 有一张网卡,eth0 采用默认的NAT连接 IP:
192.168.122.y。在vhost02上安装httpd服务器,实现访问。
要求:
1. 找一个网段在192.168.1.0/24的机器(非虚拟机所在的机器)做测试客户端。
2. 使用vhost01做DNAT防火墙,将请求到vhost01的80端口的请求转发到vhost02
上去。(nat PREROUTING) (filter FORWARD)
3. 将请求vhost01 4567端口的请求转发到vhost02 22号端口上去。(nat PREROUTING)(filter FORWARD)
4. vhost02能够主动ping外网(前提vhost01可以上外网)。(nat POSTROUTING)(filter FORWARD)
```
##### 提高研究
```
对于一些特殊的应用防火墙要做特别的设置,比如NFS,FTP,他们特殊在什么地方,防火墙如何处理?
arp防火墙的使用场景。
真实案例:
公司要求通过实名登记上网,并对客户端进行流量限制,发现长时间下行流量过大的用户则进行一定时间的断网警告。如果公司不打算采用第三方软件,
仅使用iptables和自动化脚本,思路如何?
```
最后修改:2021 年 10 月 08 日
© 允许规范转载