linux服务篇-Firewalld服务

37 篇文章 0 订阅

所谓“防火墙”是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种建立在现代通信网络技术和信息安全技术基础上的应用性安全技术,隔离技术。越来越多地应用于专用网络与公用网络的互联环境之中。

防火墙主要是借助硬件和软件的作用于内部和外部网络的环境间产生一种保护的屏障,从而实现对计算机不安全网络因素的阻断。只有在防火墙同意情况下,用户才能够进入计算机内,如果不同意就会被阻挡于外。

防火墙是在两个网络通讯时执行的一种访问控制尺度,能最大限度阻止网络中的黑客访问自己的网络。是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。它是不同网络或网络安全域之间信息的唯一出入口,能根据企业的安全政策控制(允许、拒绝、监测)出入网络的信息流,且本身具有较强的抗攻击能力。它是提供信息安全服务,实现网络和信息安全的基础设施。在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全。

在V10-sp1-server里有几种防火墙共存:firewalld、iptables、ebtables。

防火墙是通过内核netfilter模块实现的功能,而以上三个服务只是保存防火墙策略的一个工具,默认使用firewalld服务,不过底层调用的命令仍然是iptables。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。

firewalld是在rhel7以后出现的新的防火墙管理工具。在rhel7中也可以使用iptables,当在rhel7中使用firewalld的时候,需要隔离iptables。

# sytemctl stop iptables

# systemctl disable iptables

# systemctl mask iptables

取消隔离

# systemctl umask iptables

1. 所谓防火墙,只是一个工具,用来编写过滤规则

2. 通过工具firewall去编写防火墙规则,然后由netfilter去进行包的过滤

3. netfilter:过滤子系统,包含了很多的包过滤的功能模块,是内嵌在内核中

4. 对于管理员来说,只需要会编写规则,剩下的就有netfilter完成。

Firewalld的工作原理

原理图:

Firewalld:

1、系统中已经存在zone

2、如果使用firewalld,那么就是将特定的流量关联到某个ZONE

    a.通过源网段关联ZONE

    b.通过网卡关联ZONE

    c. 如果以后两者都没有关联的数据报文,那么就会关联Default ZONE

3、进入到zone以后,开始匹配zone内的规则

    Zone1设置规则:192.168.31.1/24 ALLOW 80 HTTPD服务

       如果在这个zone内的所有服务都没有匹配到,那么这个数据报文会接着去Default zone匹配规则。dmz、home、external、work、internal,当以上5个zone内的规则,没有匹配到,就会到default zone匹配规则。

Firewalld与Iptables的区别

netfilter

         ●位于Linux内核中的包过滤功能。

●称为Linux防火墙的“内核态”。

Firewalld/iptables

         CentOS7默认的管理防火墙规则的工具(Firewalld)

●称为Linux防火墙的“用户态”。

1. 底层基于架构

iptables 主要是基于接口,来设置规则,从而判断网络的安全性。

firewalld 是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全,与硬件防火墙的设置相类似。

2、配置文件

iptables /etc/sysconfig/iptables 中储存配置。

firewalld 将配置储存在 /etc/firewalld/(优先加载) /usr/lib/firewalld/(默认的配置文件)中的各种 XML 文件(一种java格式的文件)里。如果想自定义防火墙规则(如修改端口),可以将/usr/lib/firewalld中的xml文件复制到/etc/firewalld/中修改。

文件:
/etc/firewalld/ #用户自己定义的
/usr/lib/firewalld #系统配置文件,预定义配置文件

3、规则的修改

使用 iptables 每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则;即全部刷新策略,可能丢失连接。

使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处;即不需要全部刷新策略,不丢失现有连接。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。

4、防火墙类型

iptables 防火墙类型为静态防火墙。

firewalld 防火墙类型为动态防火墙。

什么是动态防火墙?

我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

这里有必要说明一下 firewalld iptables 之间的关系, firewalld 提供了一个 daemon service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

firewalld的优点

firewalldiptables比起来至少有两大好处:

1firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;

2firewalld在使用上要比iptables人性化很多,即使不明白四张表五条链而且对TCP/IP协议也不理解也可以实现大部分功能。

 firewalldiptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。

 firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalldiptables的结构以及使用方法不一样罢了。

 相较于iptables防火墙而言,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

firewalld的区域

通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:

阻塞区域(block):任何传入的网络数据包都将被阻止,但允许数据包流出。

工作区域(work):任何流入的数据包都将拒绝,但允许数据包流出和预定义服务(sshipp-clientdhcpv6-client)的数据包可以流入。

家庭区域(home):任何流入的数据包都将拒绝,但允许数据包流出和预定义服务(sshmdnsipp-clientsbmclientdhcpv6-client)的数据包可以流入。

公共区域(public[默认zone]}):任何流入的数据包都将拒绝,但允许数据包流出和预定义服务(sshdhcpv6-client)的数据包可以流入.新添加的网卡默认绑定到该区,只有选择接受传入的网络连接。

隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接,但允许数据包流出和预定义服务(ssh)的数据包可以流入。

信任区域(trusted):所有的网络连接(流入、流出)都可以接受。一般是内网当中

丢弃区域(drop):任何传入的网络连接都被拒绝,不作出任何回应.只允许数据包出去(不产生包含 ICMP 的错误响应)。

内部区域(internal):任何流入的数据包都将拒绝,但允许数据包流出和预定义服务(sshmdnsipp-clientsbmclientdhcpv6-client)的数据包可以流入。只有选择接受传入的网络连接。默认值时与 home 区域相同

外部区域(external):任何流入的数据包都将拒绝,但允许数据包流出和预定义服务(ssh)的数据包可以流入。只有选择接受传入的网络连接。默认将通过此区域转发的 IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。

Note

1. firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone)

2. 然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。

3. 每个区域都定义了自己打开或者关闭的端口和服务列表。

4. 最终一个区域的安全程度是取决于管理员在此区域中设置的规则。

5. 区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。

6. 可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。

7. 默认情况下,public区域是默认区域,包含所有接口(网卡)

firewalld默认提供了九个zone配置文件:block.xmldmz.xmldrop.xmlexternal.xml home.xmlinternal.xmlpublic.xmltrusted.xmlwork.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。

firewalld中的过滤规则

target:目标区域

icmp-block-inversionICMP协议类型黑白名单开关(yes/no

Interfaces:关联的网卡接口

sources:来源,可以是IP地址,也可以是mac地址

services:允许的服务

ports:允许的目标端口,即本地开放的端口

protocols:允许通过的协议

masquerade:是否允许伪装(yes/no),可改写来源IP地址及mac地址

forward-ports:允许转发的端口

source-ports:允许的来源端口

icmp-blocks:可添加ICMP类型,当icmp-block-inversionno时,这些ICMP类型被拒绝;当icmp-block-inversionyes时,这些ICMP类型被允许。

rich rules:富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。

对于一个接受到的请求具体使用哪个zonefirewalld是通过三种方法来判断的:
         1source,也就是源地址 优先级最高
         2interface,接收请求的网卡 优先级第二
         3firewalld.conf中配置的默认zone 优先级最低

firewalld 数据处理流程

1. firewalld 对于进入系统的数据包,会根据数据包的源IP地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。

2. 对于进入系统的数据包,首先检查的就是其源地址。

3. 若源地址关联到特定的区域,则执行该区域所指定的规则。

4. 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则。

5. 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所指定的规则。

firewalld 检查数据包的源地址的规则

1. 若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则。

2. 若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突),则使用传入网络接口的区域并执行该区域所制定的规则。

3. 若网络接口也未关联到特定的区域( 即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则。

使用firewalld的思路

1. 确定默认zone是谁?

设置default zonefirewall-cmd --set-default-zone=xxx

查看default zone firewall-cmd --get-default-zone

2. 将源网段或者网卡关联zone

数据包才知道去那个zone匹配规则

3. zone内设置规则

firewalld配置方法

firewalld的配置方法主要有三种:firewall-configfirewall-cmd和编写 /etc/firewalld/ 中的配置文件(xml文件),其中 firewall-config是图形化工具,firewall-cmd是命令行工具。

  • 运行时配置
    • 实时生效,并持续至Firewalld重新启动或重新加载配置
    • 不中断现有连接
    • 不能修改服务配置
  • 永久配置
    • 不立即生效,除非Firewalld重新启动或重新加载配置
    • 中断现有连接
    • 可以修改服务配置

常用的 firewalld-cmd 命令选项

#显示当前默认区域

--get-default-zone

#设置默认区域

--set-default-zone=<zone>

#显示当前正在使用的区域及其对应的网卡接口

--get-active-zones

#显示所有可用的区域

--get-zones

#显示指定接口绑定的区域

--get-zone-of-interface=<interface>

#为指定接口绑定区域

--zone=<zone> --add-interface=<interface>

#为指定的区域更改绑定的网络接口

--zone=<zone> --change-interface=<interface>

#为指定的区域删除绑定的网络接口

--zone=<zone> --remove-interface=<interface>

#显示指定源地址绑定的区域

--get-zone-of-source=<source>[/<mask>]

#为指定源地址绑定区域

--zone=<zone> -add-source=<source>[/<mask>]

#为指定的区域更改绑定的源地址

-- zone=<zone> -change-source=<source>[/<mask>]

#为指定的区域删除绑定的源地址

--zone=<zone> -remove-source=<source>[/<mask>]

#显示所有区域及其规则

--list-all-zones

#显示所有指定区域的所有规则,省略--zone=<zone>时表示仅对默认区域操作

[--zone=<zone>] --list-all

#显示指定区域内允许访问的所有服务

[--zone=<zone>] --list-services

#为指定区域设置允许访问的某项服务

[--zone=<zone>] --add-service=<service>

#删除指定区域已设置的允许访问的某项服务

[--zone=<zone>] --remove-service=<service>

安装配置:

1、安装firewalld

root执行 # yum install firewalld firewall-config

2、运行、停止、禁用、隔离firewalld

启动:# systemctl start  firewalld

查看状态:# systemctl status firewalld 或者 firewall-cmd --state

禁用:# systemctl disable firewalld

停止:# systemctl stop firewalld

隔离:# systemctl mask firewalld

取消隔离:# systemctl unmask firewalld

3、配置firewalld

查看版本:$ firewall-cmd --version

查看帮助:$ firewall-cmd --help

查看设置:$ firewall-cmd --list-all

显示状态:$ firewall-cmd --state

查看区域信息: $ firewall-cmd --get-active-zones

查看指定接口所属区域:$ firewall-cmd --get-zone-of-interface=eth0

拒绝所有包:# firewall-cmd --panic-on

取消拒绝状态:# firewall-cmd --panic-off

查看是否拒绝:$ firewall-cmd --query-panic

4、更新防火墙规则:

# firewall-cmd --reload   重新载入防火墙配置,当前连接不中断

# firewall-cmd --complete-reload   重新载入防火墙配置,当前连接中断

两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务

 

5、区域管理

# 显示当前系统中的默认区域

firewall-cmd --get-default-zone

# 显示指定区域的所有规则,不加--zone显示默认区域

firewall-cmd --zone=work --list-all

# 显示当前正在使用的区域及其对应的网卡接口,并附带一个目前分配给它们的接口列表

firewall-cmd --get-active-zones

# 设置默认区域,立即生效无需重启

firewall-cmd --set-default-zone=home

firewall-cmd --get-default-zone

将接口添加到区域,默认接口都在public

# firewall-cmd --zone=public --add-interface=eth0

永久生效再加上 --permanent 然后reload防火墙

 

# firewall-cmd --get-zones 查看所有可用区域

# firewall-cmd --list-all-zones 列出所有区域的所有配置

6、服务管理

# 查看默认区域内允许访问的所有服务

firewall-cmd --list-service

# 列出所有预设服务

firewall-cmd --get-services

# 添加httpd服务到public区域

firewall-cmd --add-service=http --zone=public

# 查看public区域已配置规则

firewall-cmd --list-all --zone=public

# 删除public区域的httpd服务

firewall-cmd --remove-service=http --zone=public

# 同时添加httpdhttps服务到默认区域,设置成永久生效

firewall-cmd --add-service=http --add-service=https --permanent

firewall-cmd --reload

firewall-cmd --list-all

#添加使用 --permanent选项表示设置成永久生效,需要重新启动firewalld服务或执行"firewall-cmd --reload"命令重新加载防火墙规则时才会生效

若不带有此选项,表示用于设置运行时规则,但是这些规则在系统或firewalld服务重启、停止时配置将失效

--runtime-to-permanent

#将当前的运行时配置写入规则配置文件中,使之成为永久性配置

7、端口管理

# 允许 TCP 443端口到 internal 区域

firewall-cmd --zone=internal --add-port=443/tcp

firewall-cmd --list-all --zone=internal

# internal 区域将 TCP 443端口移除

firewall-cmd --zone=internal --remove-port=443/tcp

# 允许 UDP 2048~2050端口到默认区域

firewall-cmd --add-port=2048-2050/udp

firewall-cmd --list-all

8、运行时配置和永久配置

# 运行时配置,重启后失效

firewall-cmd --zone=public --add-service=smtp

# 永久配置,不影响当前连接,重启后生效

firewall-cmd --permanent --zone=public --add-service=smtp    

将运行时配置保存为永久配置

firewall-cmd --runtime-to-permanent

9、将网络地址关联到zone

IP段关联到某个zone,以后只要该源IP段的数据包,就会关联到这个zone中匹配规则。

# 设置网络地址到指定的区域

firewall-cmd --permanent --zone=internal --add-source=192.168.122.0/24

# 删除指定区域中的网路地址

firewall-cmd --permanent --zone=internal --remove-source=192.168.122.0/24

# 查看网络地址是否关联到指定zone

firewall-cmd --query-source=192.168.122.0/24 --zone=internal

# 切换网络地址到指定zone

firewalld-cmd --change-source=192.168.122.0/24 --zone=internal

# 查看指定zone的所有网络地址

firewalld-cmd --list-sources --zone=internal

10、网络设备管理

NetworkManager服务会把所有的网卡放在默认ZONE内。改变网络设备关联的zone时,建议使用--change-interface

# 查看网络设备属于那个zone

firewall-cmd --get-zone-of-interface=ens33

# 查看所有的网络接口

firewall-cmd --list-interfaces

# 将网络设备关联到指定的zone

firewall-cmd --add-interface=ens33 --zone=internal

# 切换网络设备到指定的zone

firewall-cmd --change-interface=ens33 --zone=internal

# 查看网络设备是否关联到指定的zone

firewall-cmd --query-interface=ens33 --zone=internal

#将网络设备从指定的zone删除

firewall-cmd --remove-interface=ens33 --zone=public --permanent

11、Rich Rules

基本规则:最大的特点是,当数据报文进入到一个zone以后,只能定义serviceport,不能设置动作:rejectaccept。也不能指定某个源,只能访问这个zone里的某个服务,比如:两个网段只需访问两个不同的服务,而这两个服务都在同一个zone里。当然,可以把两个服务分部设置到不同的zone,但是这样比较麻烦。

为了更加健全防火墙的规则,于是有了富规则。通过富规则(rich rule),可以指定源地址、目的地址、目的端口、协议等。

当富规则内包含了源、目的IP地址的时候,就需要指定family=ipv4

# 列出所有规则

firewall-cmd --list-rich-rules

# 检查一项规则是否存在

firewall-cmd [--zone=zone] --query-rich-rule=’rule’

# 移除一项规则

firewall-cmd [--zone=zone] --remove-rich-rule=’rule’

# 新增一项规则

    firewall-cmd [--zone=zone] --add -rich-rule=’rule’

# 允许来自主机 192.168.0.14 的所有 IPv4 流量

firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'

# 拒绝来自主机 192.168.1.10 22 端口的 IPv4 TCP 流量

firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'

# 允许来自主机 10.1.0.3 80 端口的 IPv4 TCP 流量,并将流量转发到 6532 端口上

firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'

# 将主机 172.31.4.2 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade

firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'

# 允许192.168.122.0/24主机所有连接

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0" accept'

# 每分钟允许2个新连接访问ftp服务

firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'

# 同意新的IPv4IPv6连接FTP ,并使用审核每分钟登录一次

firewall-cmd --add-rich-rule='rule service name=ftp log limit value="1/m" audit accept'

# 允许来自1192.168.122.0/24地址的新IPv4连接连接TFTP服务,并且每分钟记录一次

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0/24" service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept'

# 丢弃所有icmp

firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'

# 当使用sourcedestination指定地址时,必须有family参数指定ipv4ipv6。如果指定超时,规则将在指定的秒数内被激活,并在之后被自动移除

firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 reject' --timeout=10

# 拒绝所有来自2001:db8::/64子网的主机访问dns服务,并且每小时只审核记录1次日志

firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

# 允许192.168.122.0/24网段中的主机访问ftp服务

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 service name=ftp accept'

# 转发来自ipv6地址1:2:3:4:6::TCP端口4011,1:2:3:4:7TCP端口4012

firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" forward-portto-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'

# 拒绝ICMP协议,如果协议不是tcp/udp的话,写法是有区别的

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 protocol value=icmp reject'

注意:如果协议是tcp/udp,富规则中protocol=tcp 或者protocol=udp

          如果协议非tcp/udp,富规则中protocol value=icmp

富规则能指定更丰富的匹配条件,可以指定动作,首先将流量关联到zone中(源/网卡)

12、Direct Rules

# 添加规则

firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -p tcp --dport 80 -j ACCEPT

# 删除规则

firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 10 -p tcp --dport 80 -j ACCEPT

# 列出规则

firewall-cmd --direct --get-all-rules

应用实例:

HTTPDvsftpd两个服务为例:

要求:

1 192.168.31.0/24网段只能访问HTTPD服务

2 192.168.43.0/24网段只能访问vsftpd服务

# firewall-cmd --permanent --add-rich-rule=’rule family=ipv4 source address=192.168.31.0/24 service name=http accept’

# firewall-cmd --permanent --add-rich-rule=’rule family=ipv4 source address=192.168.31.0/24 service name=ftp reject’

# firewall-cmd --permanent --add-rich-rule=’rule family=ipv4 source address=192.168.43.0/24 service name=ftp accept’

# firewall-cmd --permanent -add-rich-rule=’rule family=ipv4 source address=192.168.43.0/24 service name=http reject’

配置NAT

NAT包含DNAT和SNAT。NAT的作用:将私网ip转换成公网ip,以缓解ip地址不足的问题

SNAT

SNAT:源地址转换(Source Network Address Translation)也是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。

原理:修改数据包中的源IP地址。nat设备将经过的包的源地址修改为自己接口的地址,再将返回数据包的目的地址转换为原始主机地址并路由。

作用:可以实现局域网共享上网。

配置的表及链:nat表中的POSTROUTING。

概述:SNAT:   A--->B--->C  (比如我们想要访问百度,淘宝等网站)

企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B,B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C;

C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B,B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。

在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。

不能在防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。

用途

SNAT:源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。

1.保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。

2.Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。

3.省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。

SNAT应用场景

内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,

将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

生产环境中,不仅要设置DNAT转换地址过去,还要设置SNAT转换地址回来。

设置地址转换,要开启路由转发功能。

[root@firewall network-scripts]# vim /etc/sysctl.conf

..省略内容,末行添加下段内容

net.ipv4.ip_forward=1   '//开启路由转发功能'

[root@firewall network-scripts]# sysctl -p    '//刷新sysctl.conf配置'

net.ipv4.ip_forward = 1

~]# firewall-cmd --query-masquerade # 检查是否允许伪装IP

~]# firewall-cmd --add-masquerade   # 允许防火墙伪装IP

~]# firewall-cmd --remove-masquerade# 禁止防火墙伪装IP

firewalld的ip伪装配置方法

1)使用firewall-cmd命令

为指定区域开启ip伪装功能,使其区域能访问外网

~]# firewall-cmd --zone=public   --add-masquerade

为指定区域中的指定源地址开启ip伪装功能

~]# firewall-cmd --zone=public  --add-rich-rule=’rule family=ipv4  source address=192.168.0.0/24   masquerade’

2)使用firewall-config图形化工具

DNAT

DNAT:目标地址转换(Destination Network Address Translation)是Linux防火墙的一种地址转换操作,是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP和目标端口。

原理:修改数据包中的目标IP地址。将指定ip或端口的流量转发到不同计算机的端口上或相同计算机的不同端口上。

作用:将位于企业局域网中的服务器进行发布。

配置的表及链:nat表中的PREROUTING链上。

概述:DNAT:   C--->B--->A   (比如对外发布web网站)

互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。

A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。

利用这种机制可以将企业内部的服务发布到互联网。

在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。

必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。

用途

DNAT:目的地地址转换,其作用是将一组本地内部的地址映射到一组全球地址。

在内网中有服务器,如果想让公网用户访问有两种方法。

1.配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。

2.内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。

DNAT应用场景

当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,

此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。

firewalld的端口转发配置方法

1)使用firewall-cmd命令

~]# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=ipaddr

~]# firewall-cmd --zone=public --add-rich-rule=’rule family=ipv4  destination address=ipaddr   forward-port port=80  protocol=tcp  to-port=8080 to-addr=地址’

2)使用firewall-config图形化工具

操作示例1:SNAT(伪装)

出站(内-外):OUTPUT--POSTROUTING(解决上网问题)

SNAT 192.168.20.0/24--->192.168.10.11

实现:内网服务器能访问互联网web服务器

目的:在firewalld防火墙配置策略,使内网外网互通。

1、client需要安装httpd服务,并关闭iptables和firewalld,只有一个网卡。

2、firewalld需要两个网卡,分别针对client、web两个服务器,该服务器除firewalld启动外,不需要启动任何服务。将iptables关闭。

3、web服务器的网关配置成为ens36的地址。

4、firewalld服务器是做NAT转发,必须开启ipv4的转发

[root@desktop 桌面]# sysctl -a |grep ipv4 |grep forward

net.ipv4.conf.all.bc_forwarding = 0

net.ipv4.conf.all.forwarding = 0 #将该参数修改为1

net.ipv4.conf.all.mc_forwarding = 0

net.ipv4.conf.default.bc_forwarding = 0

net.ipv4.conf.default.forwarding = 0

net.ipv4.conf.default.mc_forwarding = 0

net.ipv4.conf.ens37.bc_forwarding = 0

net.ipv4.conf.ens37.forwarding = 0

net.ipv4.conf.ens37.mc_forwarding = 0

net.ipv4.conf.ens38.bc_forwarding = 0

net.ipv4.conf.ens38.forwarding = 0

net.ipv4.conf.ens38.mc_forwarding = 0

net.ipv4.conf.lo.bc_forwarding = 0

net.ipv4.conf.lo.forwarding = 0

net.ipv4.conf.lo.mc_forwarding = 0

net.ipv4.ip_forward = 0

net.ipv4.ip_forward_update_priority = 1

net.ipv4.ip_forward_use_pmtu = 0

[root@desktop ~]# vim /etc/sysctl.conf

net.ipv4.conf.all.forwarding = 1

[root@desktop ~]# sysctl -p

5、设置防火墙:

[root@desktop ~]# firewall-cmd --permanent --add-source=192.168.20.0/24 --zone=work

success

[root@desktop ~]# firewall-cmd --permanent --add-source=192.168.10.0/24 --zone=work

success

[root@desktop ~]# firewall-cmd --permanent --add-service=http --zone=work

success

[root@desktop ~]# firewall-cmd --reload

success

[root@desktop ~]# firewall-cmd --permanent --add-masquerade --zone=work

success

[root@desktop ~]# firewall-cmd --reload

success

[root@desktop ~]# firewall-cmd --list-all --zone=work

work (active)

  target: default

  icmp-block-inversion: no

  interfaces:

  sources: 192.168.20.0/24 192.168.10.0/24

  services: ssh mdns dhcpv6-client cockpit

  ports:

  protocols:

  masquerade: yes

  forward-ports:

  source-ports:

  icmp-blocks:

  rich rules:

或者设置NAT规则也可实现(设置POSTROUTING)

sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s <internal_ip|internal_net/mask> -j SNAT --to-source <external_ip>

sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat POSTROUTING -o ens0 -j MASQUERADE -s <internal_ip|internal_net/mask>

6、验证:在内网web上:

[root@localhost ~]# ping 192.168.10.11

[root@localhost ~]# curl http://192.168.10.11

操作示例2:DNAT(端口转发)

入站(外-内):PREROUTING--INPUT--FORWARD(服务映射)

DNAT 192.168.10.11--->192.168.20.13

实现:

1、client不需要安装服务,并关闭iptables和firewalld,只有一个网卡。

2、firewalld需要两个网卡,分别针对client、web两个服务器,该服务器除firewalld启动外,不需要启动任何服务。将iptables关闭。

3、client服务器的网关配置成为ens33的地址。

4、firewalld服务器是做NAT转发,必须开启ipv4的转发

[root@desktop 桌面]# sysctl -a |grep ipv4 |grep forward

net.ipv4.conf.all.bc_forwarding = 0

net.ipv4.conf.all.forwarding = 0 #将该参数修改为1

net.ipv4.conf.all.mc_forwarding = 0

net.ipv4.conf.default.bc_forwarding = 0

net.ipv4.conf.default.forwarding = 0

net.ipv4.conf.default.mc_forwarding = 0

net.ipv4.conf.ens37.bc_forwarding = 0

net.ipv4.conf.ens37.forwarding = 0

net.ipv4.conf.ens37.mc_forwarding = 0

net.ipv4.conf.ens38.bc_forwarding = 0

net.ipv4.conf.ens38.forwarding = 0

net.ipv4.conf.ens38.mc_forwarding = 0

net.ipv4.conf.lo.bc_forwarding = 0

net.ipv4.conf.lo.forwarding = 0

net.ipv4.conf.lo.mc_forwarding = 0

net.ipv4.ip_forward = 0

net.ipv4.ip_forward_update_priority = 1

net.ipv4.ip_forward_use_pmtu = 0

[root@desktop ~]# vim /etc/sysctl.conf

net.ipv4.conf.all.forwarding = 1

[root@desktop ~]# sysctl -p

5、网关服务器防火墙配置:

~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.20.13 --permanent

6、验证:在互联网client上:

[root@localhost ~]# ping 192.168.20.13

[root@localhost ~]# curl http://192.168.20.13

外部访问内部,将访问本机’external_port’端口流量转发到’internal_ip’

firewall-cmd --zone=external --permanent --add-forward-port=port=<external_port>:proto=tcp:toaddr=<internal_ip>

或者设置NAT规则也可实现(设置PRERROUTING)

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A PREROUTING -d <external_ip> -j DNAT --to-destination <internal_ip>

外部访问内部,将访问本机’external_port’端口流量转发到’internal_ip’的’internal_port’

firewall-cmd --zone=external --permanent --add-forward-port=port=<external_port>:proto=tcp:toport=<internal_port>:toaddr=<internal_ip>

通过配置文件来使用Firewalld的方法

系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/

注意!请勿编辑/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑。

[root@work111 ~]# ls /usr/lib/firewalld/services/
amanda-client.xml        ipp-client.xml    pmwebapis.xml       squid.xml
amanda-k5-client.xml     ipp.xml           pmwebapi.xml        ssh.xml
bacula-client.xml        ipsec.xml         pop3s.xml           synergy.xml
bacula.xml               iscsi-target.xml  pop3.xml            syslog-tls.xml
ceph-mon.xml             kadmin.xml        postgresql.xml      syslog.xml
ceph.xml                 kerberos.xml      privoxy.xml         telnet.xml
dhcpv6-client.xml        kpasswd.xml       proxy-dhcp.xml      tftp-client.xml
dhcpv6.xml               ldaps.xml         ptp.xml             tftp.xml
dhcp.xml                 ldap.xml          pulseaudio.xml      tinc.xml
dns.xml                  libvirt-tls.xml   puppetmaster.xml    tor-socks.xml
docker-registry.xml      libvirt.xml       radius.xml          transmission-client.xml
dropbox-lansync.xml      mdns.xml          RH-Satellite-6.xml  vdsm.xml
freeipa-ldaps.xml        mosh.xml          rpc-bind.xml        vnc-server.xml
freeipa-ldap.xml         mountd.xml        rsyncd.xml          wbem-https.xml
freeipa-replication.xml  ms-wbt.xml        samba-client.xml    xmpp-bosh.xml
ftp.xml                  mysql.xml         samba.xml           xmpp-client.xml
high-availability.xml    nfs.xml           sane.xml            xmpp-local.xml
https.xml                ntp.xml           smtps.xml           xmpp-server.xml
http.xml                 openvpn.xml       smtp.xml
imaps.xml                pmcd.xml          snmptrap.xml
imap.xml                 pmproxy.xml       snmp.xml

以下例子均以系统自带的public zone 为例子.

1. 如果想开放80端口供外网访问http服务,例子如下

1.1 将 http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙,

# 这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld

[root@work111 /]# ls /etc/firewalld/services/http.xml 
/etc/firewalld/services/http.xml
[root@work111 /]# ls /etc/firewalld/zones
home.xml  home.xml.old  public.xml  public.xml.old

1.2 修改public.xml,加入http服务

[root@work111 /]# vim /etc/firewalld/zones/public.xml
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not#
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="nginx"/>   # 这行是后加的,要匹配 /etc/firewalld/services/文件夹下的文件名
  <port protocol="tcp" port="443"/>
  <port protocol="tcp" port="80"/>
  <port protocol="tcp" port="5630"/>
  <port protocol="tcp" port="22"/>
</zone>

1.3 重新载入 两条命令都可以的

root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@work111 /]# firewall-cmd --reload
success

root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

<span class="br0">[</span>root<span class="sy0">@</span><span class="kw3">work111</span> ~<span class="br0">]</span><span class="co0"># firewall-cmd --complete-reload</span>
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

2. 修改防火墙ssh的端口方法

2.1 复制ssh.xml文件到/etc/firewalld/services/

[root@work111 ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

2.2 修改ssh.xml文件 5630为ssh端口

[root@work111 /]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
[root@work111 /]# cat /etc/firewalld/services/ssh.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="5630"/>
</service>

2.3 重新载入 两条命令都可以的

root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@work111 ~]# firewall-cmd --reload
success

root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@work111 ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

3. 指定ip访问ssh端口

3.1 修改/etc/firewalld/zones/

# rule字段内为要限制的ip和使用的服务

[root@work111 /]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
         <span style="color: #ff0000;"><span class="sy0">  <</span>rule <span class="re2">family</span>=<span class="st0">"ipv4"</span><span class="sy0">></span></span>
  <service name="ssh"/><span style="color: #ff0000;"><span class="sy0">  <</span><span class="kw3">source</span> <span class="re2">address</span>=<span class="st0">"192.168.99.112"</span><span class="sy0">/></span></span>
</zone>

 3.3 重新载入 两条命令都可以的

root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@work111 ~]# firewall-cmd --reload
success

root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@work111 ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

4. 添加自定义服务 举例,添加8080端口为新的Service

4.1 添加新文件 8080.xml

[root@work111 /]# cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/9100.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

<short>ELK</short>

<description>ELK By fooher.com</description>

<port protocol="tcp" port="9100"/>

</zone>

4.2 编辑public.xml 文件,加入相应的Server

[root@work111 /]# cat /etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

<short>Public</short>

<description>For use in public.</description>

<service name="dhcpv6-client"/>

<service name="ssh"/>

<port protocol="tcp" port="5630"/>

<port protocol="tcp" port="22"/>

<port protocol="tcp" port="9100"/> 这行是后加的,要匹配/etc/firewalld/services/8080.xml 文件名

</zone>

4.3 重新载入 两条命令都可以的

root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@work111 ~]# firewall-cmd --reload
success

root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@work111 ~]# firewall-cmd --complete-reload
success

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

图形管理工具

RHEL7之前的发行版本默认的防火墙中,几乎没有图形化的防火墙管理工具,但是firewalld却有,firewall-configfirewalld防火墙配置管理工具的GUI(图开用户界面)版本,几乎可以实现所有命令行执行的操作。即使没有扎实的Linux命令基础,也完合可以通过它来妥善配置firewalld防火墙策略。Firewall-config的界面如下图所示,功能具体如下:

1、选择运行时(Runtime)模式或永久(Permanent)模式。

2、可选的策略集合区域列表。

3、常用的系统服务列表。

4、当前正在使用的区域。

5、管理当前被选中区域中的服务。

6、管理当前被选中区域中的端口。

7   管理当前被选中区域中的协议

8、管理当前被选中区域中的端口和协议

9、开启或关闭SNAT(源地址转换协议)技术。

10、设置端口转发策略。

11、控制请求icmp服务的流量。

12、管理防火墙的富规则。

13、管理网卡设备。

14、管理的数据来源IP地址

15、被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关的流量。

16Firewall-config工具的运行状态。

对外开放http服务,如下图

添加一条防火墙规则,使其放行访问8080-8088端口(TCP协议)的流量,并且永久生效

单击Options菜单中的Reload Firewalld选项,让上面配置的永久规则立即生效,这与在命令行中执行--reload参数的效果一样。

SNAT技术相信很多人都知道,那现在我们来开启SNAT技术,其实就是命令行下的masquerade

下面我们来配置一个端口转发规则,将888端口的流量转发到其他主机的22端口上。

注:转发本机端口不需要开启masquerade,转发到别的主机才需要开启masquerade

配置富规则,允许192.168.10.12主机访问本机的1234端口号

最后来看一下区域和网卡的关联,增加网卡的话只需要输入网卡名称即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太极淘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值