Linux之防火墙篇(包括firewalld、iptables)详解

一、firewalld

1、什么是firewalld?

  1. firewalld是一个动态防火墙后台程序,它提供了一个动态管理的防火墙用于支持“zones“,以分配对一个网络及其相关链接和界面的一定程度的信任。它具备对IPv4和IPv6防火墙设置的支持。支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。
  2. 系统提供了图像化的配置工具firewall-config、system-config-firewall,提供命令行客户端firewall-cmd,用于配置firewalld永久或非永久性运行时间的改变。

2、firewalld的配置与启动

为了避免防火墙之间的相互影响,我们在作firewalld的有关实验时,关闭iptables服务

systemctl stop iptables.service			##关闭iptables服务
systemctl disable iptables.service		##设置iptables开机不自启动
systemctl mask iptables.service			##锁定iptables服务
systemctl start firewalld				##启动firewalld服务
systemctl enable firewalld				##设置firewalld开机自启动

3、firewall所有域的查看、默认域的查看和设置

1、所有域的查看

firewall-cmd --get-zones		##查看火墙所有域

在这里插入图片描述
在这里插入图片描述

2、默认域的查看、设置

firewall-cmd --get-default-zone 	##查看当前默认域
firewall-cmd --set-default-zone=block	##更改默认域为block:拒绝所有网络连接

在这里插入图片描述

4、firewalld常用命令

1、查看火墙状态及当前生效的火墙域

firewall-cmd --state				##查看火墙状态
firewall-cmd --get-active-zones 	##当前生效的域

在这里插入图片描述

2、查看某个域的火墙策略和查看火墙所有能开放的服务

firewall-cmd --zone=public --list-all	##查看public域的火墙策略
firewall-cmd --get-services 			##查看所有支持能开放的服务

在这里插入图片描述

3、查看所有火墙域的策略及默认域的火墙策略

firewall-cmd --list-all				##查看默认域的火墙策略
firewall-cmd --list-all-zones 		##查看所有火墙域的策略

在这里插入图片描述
这里我们的默认域是public,所以查看的默认域的火墙策略为public的策略
在这里插入图片描述
这里会列出我们服务器的所有火墙域的策略。

4、添加某个服务为默认域的开放服务

firewall-cmd --add-service=ftp		##添加ftp服务为默认域的开放服务,临时生效
firewall-cmd --permanent --add-service=http		##永久生效,生效需要重新加载配置文件,或者重启服务

在这里插入图片描述

5、指定或移除某个IP通过某个域访问系统以及重新加载配置火墙配置文件

我们现在的默认火墙域为public,开放的服务只有ssh、dhcp。
在这里插入图片描述
这里面开放的服务并没有http,我们现在尝试在172.25.254.233的主机上能否访问http。
在这里插入图片描述
显示无法连接,这是理所当然的,我们的http并没有添加到开放的服务中!我们可以设置,233的客户端在访问我们的服务器时走trusted信任火墙域!

firewall-cmd --permanent --zone=trusted --add-source=172.25.254.233/24		##添加172.25.254.233/24的IP客户端,访问时被信任!
firewall-cmd --reload			##重新加载配置文件,对正在进行的服务不生效
firewall-cmd --complete-reload	##对所有服务立即生效
firewall-cmd --get-active-zones

在这里插入图片描述
我们用客户端再次进行访问服务器的http:
在这里插入图片描述
成功访问!
那么,怎么移除呢?

firewall-cmd --permanent --zone=trusted --remove-source=172.25.254.233/24

在这里插入图片描述

6、添加或移除网卡到指定的网络区。

我们现在的服务器上有两块网卡eth0、eth1。分别为172.25.254.网段与1.1.1.网段的。
在这里插入图片描述
我们把eth0网卡加到public域,把eth1加到trusted域。再通过,不同网段的主机访问http服务。

firewall-cmd --permanent --zone=public --add-interface=eth0
firewall-cmd --permanent --zone=trusted --add-interface=eth1
firewall-cmd --reload
firewall-cmd --get-active-zones

在这里插入图片描述
先通过172.25.254.网段的客户端访问http服务。
在这里插入图片描述
访问被拒绝了,因为eth0再public域,而public域的http没有开放!
我们再通过1.1.1.网段的客户端访问:
在这里插入图片描述
访问成功,通过我们设置不同网段的网卡在不同的网络区域,进而控制不同的网段的客户端的不同功能!

那么怎么移除区域内的网卡呢?

firewall-cmd --zone=public --remove-interface=eth0		##临时生效,重启防火墙会失效
firewall-cmd --zone=trusted --remove-interface=eth1

在这里插入图片描述

firewall-cmd --permanent --zone=public --remove-interface=eth0	##写入配置文件,永久生效
firewall-cmd --permanent --zone=trusted --remove-interface=eth1
firewall-cmd --reload
systemctl restart firewalld.service

在这里插入图片描述

7、添加某个服务或者某个端口为指定域的开放服务或端口

1、添加服务

firewall-cmd --permanent --zone=internal --add-service=http	##添加http服务为internal域的开放服务
firewall-cmd --permanent --zone=internal --remove-service=http

在这里插入图片描述
2、添加端口

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload 

在这里插入图片描述
我们默认域并没有开放http服务,但是却开放了80端口,我们的http服务默认使用的就是80端口!所以,也可以访问到!
在这里插入图片描述

firewall-cmd --zone=public --list-ports
firewall-cmd --permanent --zone=public --remove-port=80/tcp

在这里插入图片描述

8、添加特殊规则到指定表指定链

首先设置防火墙的默认域为block,并且把eth0添加到block域。
在这里插入图片描述
eth0网卡网段的客户端172.25.254.33,不能远程连接服务器:
在这里插入图片描述
添加特殊规则: 如果客户端满足特殊规则走特殊规则,如果客户端不满足则走默认域

firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.33 -j ACCEPT	##添加特殊规则到filter表的INPUT链
firewall-cmd --direct --get-all-rules		##查看所有特殊规则 

在这里插入图片描述
用IP为172.25.254.33的客户端远程连接:
在这里插入图片描述
连接成功!这里172.25.254.33的客户端访问走特殊规则,其他客户端走默认域!

移除特殊规则:

firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.33 -j ACCEPT

在这里插入图片描述
怎么才能使172.25.254.33主机不能远程登陆,但是其他172.25.254网段的主机可以登陆呢?

首先设置默认域不能远程登陆:
在这里插入图片描述
添加特殊规则:

firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 ! -s 172.25.254.33 -j ACCEPT	##添加特殊规则到filter表的INPUT链
firewall-cmd --direct --get-all-rules				##查看所有特殊规则 

在这里插入图片描述
测试:
用IP为172.25.254.33的主机远程连接:
在这里插入图片描述
用其他网段在172.25.254的主机远程登陆:
在这里插入图片描述
这里特殊规则,设置不是172.25.254.33的客户端走特殊规则,不能远程连接,其他同网段的客户端走默认域。

5、地址伪装

实验环境:

服务器需要双网卡。IP分别为:
eth0:172.25.254.133
eth1:1.1.1.133

在这里插入图片描述
两个客户端的IP分别为:
1.1.1.233
172.25.254.33
在这里插入图片描述
在这里插入图片描述
实验过程:

sysctl -a | grep forward		##如果查询到路由功能没有开启:net.ipv4.ip_forward = 0
执行:			vim /etc/sysctl.conf
				net.ipv4.ip_forward = 1
				sysctl -p

firewall-cmd --permanent --add-masquerade 	##打开内核的地址伪装功能
firewall-cmd --reload						##重新加载火墙配置文件 
firewall-cmd --list-all

在这里插入图片描述
测试:

客户端1:IP为1.1.1.233
网关设置为服务器的eth1的IP。1.1.1.133
在这里插入图片描述
远程连接:IP为172.25.254.33的客户端2。再查看哪些主机远程登陆了。

ssh root@172.25.254.33
w -i

在这里插入图片描述
有图看出:我们实际上是1.1.1.233的客户端1远程登陆了172.25.254.33的客户端2,可是在客户端2却只能查询到是172.25.254.133登陆的系统。这就是地址伪装!

6、端口转发

我们在上个实验的基础上做这个实验。

客户端2:IP为172.25.254.33看到172.25.254.133服务器远程登陆了系统,实际却是客户端1:IP为1.1.1.233的主机登陆了系统。

那么,客户端2登陆自己看到的172.25.254.133的服务器,能否登陆到IP为1.1.1.233的客户端1呢?我们试一试
在这里插入图片描述
我们可以看到,客户端2:172.25.254.33只能登陆到双网卡的服务器上,并不能直接登陆到客户端1:1.1.1.233。那么怎么作呢?

这就需要设置服务器的端口转发了!!!

firewall-cmd --permanent --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.233		##添加特殊规则:通过22/tcp端口的服务都转发到1.1.1.233的22端口。
firewall-cmd --reload 
firewall-cmd --list-all

在这里插入图片描述
测试:我们再次用客户端2:172.25.254.33去远程登陆,自己看到的服务器IP:172.25.254.133。
在这里插入图片描述
分析:服务器设定了端口转发之后,客户端2:去登陆服务器IP 172.25.254.133。实际登陆到1.1.1.233。端口转发成功。

二、iptables

PS: Linux防火墙内核的四张表,五条链!

默认的5种规则链:

INPUT: 处理入站数据包,当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。

OUTPUT: 处理出站数据包,当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

FORWARD: 处理转发数据包.当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。

PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则。
POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则。

应用场景:
其中INPUT, OUTPUT链更多的应用在“主机访火墙”中,即主要针对服务器本机进出数据的安全控制:而FORWARD, PREROUTING, POSTROUTING链更多地应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

规则表
具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的“表”中规则表是规则链的集合

默认4种规则表

4个表: filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

Filter表: 用来处理是否放行

NAT表: 实现数据包转发,修改源地址 端口 目标地址 端口,实现地址转换

mangle: 用于对特定数据包的修改

raw: 有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。

1、什么是iptables?

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

2、iptables传输数据包的过程:

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
在这里插入图片描述

3、iptables中四张表和五条链的关系

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
在这里插入图片描述
参考文章:iptables详解-永志●哥德

4、iptables命令常用的参数详解

iptable 
	-t	##指定表的名称 
	-n	##不做解析,默认作解析
	-L	##列出指定表格的策略
	-A	##增加策略
	-p	##网络协议
	--dport ##端口
	-s	##数据来源
	-j	##动作
	ACCEPT	##允许
	REJECT  ##拒绝
	DROP	##丢弃
	-N	##增加链
	-E	##修改链的名称
	-X	##删除链
	-D	##删除指定策略
	-I	##插入
	-R	##修改策略
	-P	##修改默认策略

5、iptables常用命令示例

为了避免firewalld和iptables的相互影响:
在这里插入图片描述

1、查看某个表的所有策略及清除默认表的策略

iptables -t filter -nL		##查看filter表的所有策略
iptables -F					##刷掉默认的filter表的火墙策略
service iptables save		##保存当前火墙策略到配置文件

在这里插入图片描述
在这里插入图片描述
可以看到,不保存的话,重启iptables服务,当前的火墙策略会丢失!
在这里插入图片描述

2、更改默认表的INPUT默认状态

iptables -P INPUT DROP		##更改为DROP
iptables -P INPUT ACCEP		##更改为接受

在这里插入图片描述
我们当前的filter表的INPUT链的默认为接受,我们远程连接是可以的。
在这里插入图片描述
现在我们将filter表的INPUT链改为DROP丢弃,试一试!
在这里插入图片描述
在这里插入图片描述
远程连接失败!我们的ssh服务的22端口将请求数据包发送到服务器的22端口,数据包再经过INPUT链时,被丢弃了!所以没有拒绝提示,也不能连接!

4、给某个表的某条链添加火墙策略及删除策略。

我们以filter表的INPUT链做示例:

实验环境:默认filter表的INPUT链的默认为ACCEP

iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT	##添加filter表INPUT链拒绝ssh的22端口

在这里插入图片描述
测试:
同网段的客户端远程连接服务器:
在这里插入图片描述
分析:同网段的所有IP都被禁止了。那我们如果想禁止一个IP呢?可以用-s指定IP

iptables -D INPUT 1		##删除默认filter表INPUT链的第一条策略
iptables -A INPUT -p tcp --dport 22 -s 172.25.254.33 -j ACCEPT

在这里插入图片描述
在这里插入图片描述

5、把火墙策略添加到指定表的指定链的指定第几条策略

iptables -I INPUT 1 -s 172.25.254.40 -p tcp --dport 22 -j ACCEPT

在这里插入图片描述

6、替换指定表的指定链的指定第几条策略

iptables -R INPUT 1 -s 172.25.254.60 -p tcp --dport 22 -j ACCEPT

在这里插入图片描述

7、新建一个表及更改表的名称

iptables -N redhat				##新建redhat表
iptables -E redhat westos		##将redhat表更改为westos

在这里插入图片描述

6、源地址转换

本次实验前,先打开服务器的路由功能:

sysctl -a | grep forward

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

服务器
实验代码:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.133
##在路由后对eth0,IP为172.25.254.133。做源地址转换

在这里插入图片描述
测试:用和服务器eth1:1.1.1.133网段相同的客户端,连接,和服务器eth0:172.25.254.133网段相同的客户端。
在这里插入图片描述
分析:我们的ssh连接数据包首先从服务器的eth1网卡进来,在路由后做了地址转换,来到eth0,再通过eth0,传递到172.25.254.33的客户端。

经过的链分别是:PREROUTING链、FORWARD链、POSTROUTING链。

7、目的地地址转换

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 1.1.1.233
##在路由前对eth0的tcp协议的22端口,目的地地址转换到1.1.1.233

在这里插入图片描述
测试:用和服务器eth0:172.25.254.133网段相同的客户端,连接172.25.254.133服务器。
在这里插入图片描述
分析:我们的ssh连接数据包首先从服务器的eth0进入服务器,在没有路由前把数据包的目的地地址从172.25.254.133更改为1.1.1.233。然后经过路由来到eth1:1.1.1.133。通过eth1再发送到更改后的目的地地址1.1.1.233。

经过的链分别是:PREROUTING、FORWARD、POSTROUTING链。

八、iptables对端口的控制

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT	##如果是第二次检测或者正在活跃的服务就接受
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT	##如果是第一次22端口的检测就接受
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT	##如果是第一次80端口的检测就接受
iptables -A INPUT -m state --state NEW -j REJECT					##如果是新的第一次检测都拒绝

在这里插入图片描述
这四条策略完成的火墙功能应该是只允许新的22端口和80端口的服务通过,其他新的连接都拒绝。并且正在进行的服务和第二次检测的服务都基于通过

测试:
在这里插入图片描述
分析:

我们知道当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

我们的数据包先检测第一条规则,就是是否是正在进行的或者重复检测的,我们http服务的数据包,第一次不会走第一条规则,检查第二条,不是22端口的。检测第三条,第一次,80端口,符合,所以走第三条规则,接受。http的第二个数据包,走第一条规则,也给予接受。所以http服务该策略不会拒绝!

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值