# 什么是防火墙? ``` 就是一堵墙, 阻挡所有一切不符合规矩的墙。 校门,你在进入学校之前门口保安要求你,佩戴好校卡,穿好校服,带好口罩你才能进入学校。 为什么需要带校卡? 校卡是唯一一个能识别你是否是本校学生的身份标志。 校服是唯一一个能识别你是学生的身份标志。 口罩是防疫要求。 假如未佩戴校卡,你将无法进入校门。 校卡、校服、口罩 这些都是规矩,如果你没有安装规矩执行那么你将呗拒之门外。 所以这就是我们生活当中的防火墙。 我们回到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 日
如果觉得我的文章对你有用,欢迎打赏