Linux中的iptables以及firewalld的使用

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可以通过使用InputOutput这两种方法,来对进和出的流量进行管控;通过使用Forward来对流量进行转发;可以通过preroutingPostrouting进行NAT地址转换的操作;

iptablesnet 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上叫做端口转发技术;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值