Linux防火墙管理
1、防火墙介绍
防火墙—>firewall
(防火墙);
后面,防火墙涉及的都是安全的概念:防火墙的目的就是为了能够阻止外部计算机的攻击;如果我们的防火墙只是为了保护我们单个主机的话就将其称为是主机防火墙;如果我们的防火墙是为了保护整个局域网的话,那么就把它称为是网络防火墙;
防火墙是为了保护机器,不管是为了保护单个主机,还是保护整个局域网,他的主要的目的都是为了保护;那我们通过什么手段来保护呢?在计算机中,我们可以通过两种过手段:
- 从硬件上来搭建防火墙
- 从软件上来搭建防火墙
在windows系统上,我们可以使用win + R打开运行窗口,然后在运行窗口里面输入services.msc可以看到我们windows系统上的所有的服务;之后,我们就会看到Windows defender Firewall的组件,这个就是我们的防火墙组件,在他的上面还有一个Windows defender Advanced组件,这个组件是用来连接微软的一个记录病毒的数据库;如果,并且扫描Windows上的文件,来对比,是否中毒;
就像如下图这样的操作:
2、Linux中的防火墙介绍
Linux本身不具备防火墙的功能,但是linux的内核管理着所有的流量;
这里的内容不是非常的复杂,就是在讲述所有的硬件的资源都是由内核(kernel
)中的driver
来进行管理的:
Linux本身不具备防火墙的功能,但是Linux的内核管理着所有的流量;然而,防火墙就是检验+管理流量
Linux的内核中集成了一个模块,net filter
这个模块可以用来管理流量;只要内核中存在着net filter
模块Linux就具备着防火墙的功能;
3、iptables
介绍和基础操作
iptables
就是一个可以和net filter
直接进行交互的客户端;他可以帮助给内核解释,什么样的流量需要放行,什么样的流量需要阻塞;
1、iptables
的原理介绍:
iptables
可以通过使用Input
和Output
这两种方法,来对进和出的流量进行管控;通过使用Forward
来对流量进行转发;可以通过prerouting
和Postrouting
进行NAT地址转换的操作;
iptables
和net filter
进行交互的五张表:
Prerouting
Forward
Postrouting
Input
Output
下面的是实验环境下的拓扑图:
这里的ssh通过一个端口共享多块网卡的时候:
2、通过实验环境来进一步的说明iptables
的基本操作:-L
下面,我们通过指令来查看一下对应的操作:
# iptables语法:
iptables (选项) (参数)
iptables
的查看指令-L和-t
指令详解:
-t
, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。
-L
, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
# 查看管理命令
# -L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
[root@Jiafeng ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# -t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。
[root@Jiafeng ~]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
死亡指令:
# -F的使用方法:
iptables -F
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
# -X的使用方法:
iptables -X
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
# -Z的使用方法:
iptables -Z
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
实例操作指令:
iptables -A INPUT -S 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 这里的-A 的意思是添加一个规则
# 这里的-S 的意思是源IP地址的网段
# 这里的-p 的意思是协议
# 这里的--dport 的意思是:选择端口号
# 这里的-j 的意思是选择动作;这里的动作可以是ACCEPT或者是别的;
现在,我们对照这个实验来进行代码的解析:
实验拓扑如下:
iptables -A INPUT -s 1.1.1.0/24 -p TCP --dport 22 -j REJECT
# 当输完这个指令之后,我们使用的1.1.1.2进行ssh的操作就会断开;并且会报connect refuse的错误;
当我们使用iptables -L的时候,回显的内容会把--dport的端口号解释为协议的名称;
当我们使用iptables -L -n的时候,回显的内容会直接的显示端口号,而不会把它解释称为协议名称;
看下面的案例:
# ------------------------------------------------------------------------------
iptables -A INPUT -s 0.0.0.0/24 -p TCP --dport 22 -j ACCEPT
iptables -L
iptables -L -n
我们可以观察到对应的dpt后面对应的值:
这里使用iptables做实验的时候要把firewalld的服务关掉;因为iptables是直接和net filter
直接进行交互的;
现在我们是可以使用212.129.243.50来直接的进行端口的访问的;应为上面的默认的规则是ACCEPT;下面,我们将用指令来时浏览器访问不了我们的80端口;现在就是让我的电脑访问不了,但是手机可以访问;
下面的就是我禁止所有的ip的访问的操作:
最终,展现出来的效果就是:
删除最后的那条规则:
iptables -D INPUT -s 0.0.0.0/0 -p TCP --dport 80 -j REJECT;
下面就可以重新的返回80端口该有的页面;
这些操作是都不需要进行systemctl restart firewalld的,应为,我们本来就是不是应用程序;我们iptables
只是一个可以和内核中的net filter
模块进行交互的指令;
3、默认规则&黑名单与白名单的使用
默认规则:
我们所说的默认的规则针对的是对INPUT、OUTPUT和FORWARD这三张表而言的:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
我们这里做的iptables的操作都是临时的,重启之后就会护肤默认的操作
黑名单和白名单的概念:
白名单的操作的安全性是高于黑名单的
黑名单:默认允许通过所有,把不想放行的用户放进黑名单中;
白名单:默认不放行所有,把所有想放行的用户加入到白名单中;
一般来说:iptables不对output和forward的流量进行控制,一般服务器不开启流量转发,FORWARD,OUTPUT对安全其实没什么影响;
4、配置白名单的过程:
1)设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去
2) 配置白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
5、保存iptables的指令的操作:
我们可以发现:
在这里使用iptables-回车会列出所有的工具:
iptables-save 用来保存的操作;
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
下面的操作就是在云服务器上的操作:
这里,我现在的短板是在于对计算机网络部分的知识的理解;这部分的知识理解的越深,这里对于NAT的操作就可以玩的越溜;
4、firewalld
介绍和原理&操作
1、firewalld
的介绍:
firewalld
是一个服务,但是这个服务提供了两个工具来帮助我们来进行防火墙的配置: 只要计算机开启了
firewalld
那么就可以通过firewalld
服务提供的工具来配置防火墙;
firewalld
通过工具来和net filter
模块之间进行交互
rhel7
以上的版本支持firewalld
服务,并且默认是开启的;
firewalld
服务提供了更加简单的方法来配置防火墙;firewalld
把防火墙配置命令转换成了iptables
规则;firewalld的操作可以完全的转换成iptables操作;
2、firewalld
的原理:
这里提到了一个非常重要的理念,叫做:Zone;
那么什么叫做Zone呢?Zone就是一个里面定义着流量进出规则的区域,在这片区域中的所有的网卡都要遵守着这片区域里面的规则;
看下图,对Zone的解释:
然而,一个Zone里面可以有多块网卡,但是一块网卡,他只能是属于一个Zone的;不同的Zone里面存在着不同的网卡;
所以,我们现在可以很明确的知道了firewalld的三个关键的要素了:
- 网卡
- Zone
- 规则
3、firewalld的操作:
firewalld
的操作支持补全,这个就比iptables
舒服巨多;且firewalld是动态更新的,不需要去重启服务;(虽然iptables 上好像就不需要打开服务)
firewalld
的两种控制方法:
firewall-cmd
:命令行的管理工具firewall-config
:图形化的管理工具
1、对zone进行的操作:
当然,我主要是喜欢命令行的管理方式,感觉非常的舒服;所以,主要还是去讲解命令行的管理:
首先来看一下,firewall-cmd
支持哪些指令:
[root@Jiafeng ~]# firewall-cmd --
Display all 100 possibilities? (y or n)
--add-forward --info-icmptype= --query-masquerade
--add-forward-port= --info-ipset= --query-panic
--add-icmp-block= --info-service= --query-port=
--add-icmp-block-inversion --info-zone= --query-protocol=
--add-interface= --list-all --query-rich-rule=
--add-lockdown-whitelist-command= --list-all-zones --query-service=
--add-lockdown-whitelist-context= --list-forward-ports --query-source=
--add-lockdown-whitelist-uid= --list-icmp-blocks --query-source-port=
--add-lockdown-whitelist-user= --list-interfaces --reload
--add-masquerade --list-lockdown-whitelist-commands --remove-forward
--add-port= --list-lockdown-whitelist-contexts --remove-forward-port=
--add-protocol= --list-lockdown-whitelist-uids --remove-icmp-block=
--add-rich-rule= --list-lockdown-whitelist-users --remove-icmp-block-inversion
--add-service= --list-ports --remove-interface=
--add-source= --list-protocols --remove-lockdown-whitelist-command=
--add-source-port= --list-rich-rules --remove-lockdown-whitelist-context=
--change-interface= --list-services --remove-lockdown-whitelist-uid=
--change-source= --list-source-ports --remove-lockdown-whitelist-user=
--change-zone= --list-sources --remove-masquerade
--complete-reload --lockdown-off --remove-port=
--direct --lockdown-on --remove-protocol=
--get-active-zones --panic-off --remove-rich-rule=
--get-default-zone --panic-on --remove-service=
--get-description --permanent --remove-source=
--get-helpers --query-forward --remove-source-port=
--get-icmptypes --query-forward-port= --set-default-zone=
--get-ipset-types --query-icmp-block= --set-description=
--get-log-denied --query-icmp-block-inversion --set-log-denied=
--get-services --query-interface= --set-short=
--get-short --query-lockdown --state
--get-zone-of-interface= --query-lockdown-whitelist-command= --version
--get-zones --query-lockdown-whitelist-context= --zone=
--help --query-lockdown-whitelist-uid=
--info-helper= --query-lockdown-whitelist-user=
好吧,这样看的话,说实话是真的不够直观;那么我们就再换一种方式,直接上图:
ok,我们来看一下,firewall-cmd的指令主要是分为如下的几个大类:
# 这几个都是动词,用来很直观的告诉我们要干啥:
add change get info list query remove set
下面的这几个都是用来修饰的:其中--permanent是把当前的指令设置为写入配置文件中的;
--reload --permanent --version --state --direct --help --state
ok,下面来看看firewalld都给我们准备了些什么:
一个缺省的Zone,当我们的规则没用指定是放在那一个Zone中时,我们的规则将会统一的放入这个Zone里:
我们使用指令来查看:
[root@Jiafeng ~]# firewall-cmd --get-default-zone
public
[root@Jiafeng ~]#
# 这个用来完成操作;
对应的代码所展示的结果为:
我们也可以通过指令来手动的设置那一个Zone为我们的默认Zone,敲如下指令的代码:
firewall-cmd --set-default-zone=ZoneName
但是,在那之前,我们需要先知道,我们的firewalld给我们提供了哪些的Zone:
[root@Jiafeng ~]# firewall-cmd --list-all-zone
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
forward: no
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
nm-shared
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services: dhcp dns ssh
ports:
protocols: icmp ipv6-icmp
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule priority="32767" reject
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
当然,这个拷贝太长了,我们还有简答的输出,如下图:
[root@Jiafeng ~]# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
# 这样的最终的输出结果就是我们所有的Zone;
好的,下面我们可以来进行对默认的Zone的值进行修改:
[root@Jiafeng ~]# firewall-cmd --set-default-zone=block
success
[root@Jiafeng ~]# firewall-cmd --get-default-zone
block
[root@Jiafeng ~]#
我们看下面的图也许会更加的直观一点:
ok,但是,这样的设置完之后我们使用firewall-cmd --list-all查看信息的时候会发现,public和block之间的输出会有些区别:
我们先看block(已经设置默认的Zone了)的输出:
[root@Jiafeng ~]# firewall-cmd --list-all
block (active)
target: %%REJECT%%
icmp-block-inversion: no
interfaces: eth0
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@Jiafeng ~]#
对应的图片内容为:
下面,接着来看对应的Zone为public的时候的情况:
[root@Jiafeng ~]# firewall-cmd --set-default-zone=public
success
[root@Jiafeng ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@Jiafeng ~]#
对应的图如下所示:
为什么会出现这样的情况呢?那是应为对应的Zone中不存在着网卡(他们的target
后面对应的值是不一样的)
以上的便是对所有的Zone的操作,下面,来开始对所有的interface网卡来进行操作;
2、对interface
网卡进行的操作:
firewall-cmd --list-interface
firewall-cmd --list-interface --zone=public # 返回在public的Zone中的网卡的个数
firewall-cmd --remove-interface=网卡名称
firewall-cmd --add-interface=网卡名称
创建的操作还是很简单的,由于Mac电脑上现在没有安装虚拟机的缘故 ,所以,添加和删除网卡的操作将不会去执行;
[root@Jiafeng ~]# firewall-cmd --list-interfaces
eth0
[root@Jiafeng ~]#
[root@Jiafeng ~]#
[root@Jiafeng ~]# firewall-cmd --list-interfaces --zone=public
eth0
[root@Jiafeng ~]#
😮💨,唉,我也没有办法呀,太穷了,只能买一个只有一个网卡的服务器;那要看图的话,那就看看吧,图如下所示:
3、对规则rule的操作:
service
规则的操作port
规则的操作rich rule
的操作
- service规则的操作:
好吧,当时在看到这种操作的时候,我当时直呼firewalld yyds;
首先对service规则进行介绍:
1、service规则:
firewall-cmd --list-services
:
这个指令是用来查看所有firewalld可以支持打开的服务的名称;
firewall-cmd --add-services=ServiceName
:
这个指令,可以打开所指定的ServiceName的服务的端口号;
firewall-cmd --remove-services=ServiceName
:
这个指令是,关闭所指定的ServicesName的服务的端口号
好的,下面我们来谈这个service的操作的本质:
我们会不禁的疑问,为什么我们的firewalld可以通过我们要启动的服务来打开对应的端口号?假设我们设置的对应的服务的端口号改变了,不是默认的端口号了,那该怎么办?
没错,这个就是一个非常好玩额情况了,firewalld在/usr/lib/firewalld的目录中存放着一个services的目录,这个目录里面存在着各种服务的xml文件;对应的服务的文件中存在着指定某种端口号的操作; 所以,如果,我们把httpd服务的端口设置为8080的话,那么我们通过这种方法就无法打开对应的端口;我们除非把httpd.xml文件中的port选项的值改为8080才可以正常的运行;当然,知道了这一点,我们现在也可以在这个文件夹里自己创建一个serviceX.xml;然后通过这种方式打开serviceX所需要的端口;
2、port规则的操作
万能的port规则的操作,我们之前使用的service操作,知识快捷或者说可以快速的满足某种服务;
firewall-cmd --add-port=3333/tcp
firewall-cmd --add-port=333/tcp
# 这个指令的语法规则为:
firewalld-cmd --add-port=需要打开的端口号/端口开放的协议类型
firewall-cmd --list-ports # 查看开放了哪些端口
3、rich rule的操作
( 富规则的使用使用规则类似于iptables的使用方法 )
看第十七行的rich rules那个地方对应的值的内容;
[root@Jiafeng ~]# firewall-cmd --set-default-zone=public
success
[root@Jiafeng ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@Jiafeng ~]#
使用的指令,相当的复杂:
firewalld-cmd --add-rich-rule="rule family=ipv4 source address=2.2.2.0/24 port port=8089 protocol=tcp reject"
就是说必要的元素有rule family ; source address ; port port ; protocol; 动作行为:reject/accept
现在使用的操作,都只是临时的,一旦重启,,所有的操作都不会保存:
可以通过两种方法来对配置进行保存:
- 在每一个规则之后都加上–permanent即可;但是每一条指令都需要加,就会很烦;
- 方firewall-cmd --runtime-to-permanent使所有创建的规则变成永久的;
4、firewalld的端口转发:
当有人,通过外网访问到1.1.1.1:80
端口时,路由器会做一步就是将流量转到10.1.1.1:8080
端口的操作中,这种技术在Liunx上叫做端口转发技术;