firewalld 网络端口安全详细介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了firewalld 网络端口安全详细介绍相关的知识,希望对你有一定的参考价值。

redhat7 network port security 网络端口安全

目录:

* 1.firewald ---firewalld 服务

* 2.configuring a firewall---配置防火墙

* 3,managing rich rules---管理富规则

* 4,masquerade and port forwarding---伪装和端口转发

* 5,forwarding a port --端口映射

* 6,adding custom firewalld zone and services--添加自定义zone和服务

* 7,managing SElinux port labeling---管理selinux 端口标签

1.firewalld

firealld 和iptables 都是规则生成工具,真正的是生效的是基于内核上netfilter.
firewalld 的规则最终要转化成iptables规则。至于iptables工作原理不做介绍。
firewalld 具有特点:动态防火墙守护进程,具有主流防火墙zone的定义,支持ipv4和ipv6防火墙设置。
解释:动态防火墙:支持运行时配置,能立即生效。(iptables必须重启服务),还支持状态跟踪。
虽然iptables也支持状态跟踪,iptables 是基于模板的定义的状态跟踪。
解释:zone:规则的集合

firewalld 配置文件(自定义zone会详讲)
firewalld配置文件以xml格式为主(除了fireealld.conf)文件目录位置
1,/etc/firewalld/ 
2,/usr/lib/firewalld/

重点:当我们定义了多个zone.如果流量进来,是如何处理的?处理流程
1,如果进来的流量的源地址,被一个zone定义的源地址规则匹配,
那么这个流量被这个zone所处理。(源地址优先级最高)
2,如果进来的流量通过一个接口,那么流量将会被接口所定义的zone处理。 (接口次之)
3,如果流量没有被源地址和接口匹配,将会被默认zone处理(优先级最低,系统默认zone=public)

注解:首先查找数据流量的源地址,如果源地址被drop或者block这两个zone的源地址规则匹配。则不会再去找数据流入接口。
如果数据的流量的源地址,没有被定义被drop和block 两个zone的源地址规则匹配,而是被其它zone的源地址匹配,
那么数据的流量将会进入该zone,
如果数据流量的接口,被drop或者block这两个zone的接口匹配,
则不会交给默认zone处理
如果没有找到对应的服务。数据流量会去找接口所在的zone中的服务,
如果找到相应的服务,即能完成访问,如果接口没有找到对应的服务,
那么会交给默认zone来处理。及时有对应的服务也是拒绝访问。


实验环境:
物理主机,两台vm虚拟机,系统为redhat7.
物理主机的ip地址为192.168.0.111
(下面就称:防火墙)一台虚拟主机模拟防火墙设置两块网卡:一块设置为桥接类型,
模拟外网地址:192.168.0.200/24 gw:192.168.0.1 dns 8.8.8.8
第二块为hostonly,模拟内网地址:192.168.10.11/24 网关可以不用配置
第二台虚拟主机模拟内网设置一块网卡:网卡类型为hostonly:
地址为192.168.10.13/24 gw:192.168.10.11 必须和firewall内网在同一个vmnet中。

     在防火墙配置一个ftp服务。

     先打开防火墙的转发功能。
     echo 1 > /proc/sys/net/ipv4/ip_forward  ---零时生效。

     编辑:/usr/lib/sysctl.d/00-system.conf
     添加 net.ipv4.ip_forward = 1
     sysctl -p  /usr/lib/sysctl.d/00-system.conf 重新加载配置文件,可以永久有效

firewalld默认有9个zone(zone是firewalld的单位)

默认zone为public

drop(丢弃):任何接受的网络数据包都被丢弃,没有任何回复,
仅能有发送出去的网络连接(数据包不能进来,但是可以出去)

block(限制):任何接受的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。(和drop相比,比较宽松一些,主要是为了针对icmp)

piblic(公共):在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接受经过选取的连接。

external(外部):特别是为路由器启用了伪装功能的外部网,你不能信任来自网络的其他计算,不能相信他们不会对你造成伤害,只能接受经过选择的连接。

dmz(非军事区):用于你的非军事区内的电脑,此区域可公开访问,可以有限的进入你的内部网络,仅仅接受经过选择的连接。

work(工作):用于工作区,你可以基本信任网络内的其他电脑不会对你造成危害,仅仅接收经过选择的连接。

home(家庭):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。

internal(内部):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。

trusted(信任):可接受所有的网络连接。

firewalld 和iptables,ip6tables,ebtables 不能同时使用,我们写个脚本禁用它们

  #!/bin/bash
     for i in iptable ip6tables ebtables ;do
          systemctl stop $i
          systemctl  disable $i
          systemctl  mask $i
     done

2.configuring a firewall---配置防火墙

    systemctl start firewalld  启动防火墙
    systemctl enable firewalld  开机自启动
    systemctl disable firewalld 关闭开机自启动
    systemctl status firewalld 查看状态
    systemctl stop firewalld  停止防火墙
    systemctl  mask firewalld 屏蔽防火墙
    systemctl  unmask firewalld 关闭屏蔽防火墙
    firewall-cmd 命令的使用 (下面的xx表示上面九个zone中的一个)
    firewall-cmd --version 查看版本号
    firewall-cmd --help  查看帮助
    firewall-cmd 查看状态
    firewall-cmd --get-active-zones 查看活动的zone
   什么是active-zone 即:有source(源地址)或interface(有接口)的zone
 # firewall-cmd --get-active-zones 
    home
        interfaces: eno33554992
    work
        sources: 192.168.0.0/24
    public
        interfaces: eno16777736
    firewall-cmd --reload 不停止服务,重新加载配置文件。
    firewall-cmd --get-default-zone 查看默认zone
    firewall-cmd --set-default-zone= 修改默认zone
    firewall-cmd --get-zone-of-interface=eno16777736 查看指定接口属于哪个zone
    firewall-cmd --list-all 查看默认zone信息
    firewall-cmd --list-all --zone=xx 查看指定zone信息
    firewall-cmd --list-all-zones 查看所有zone的信息
    firewall-cmd --list-interfaces 查看默认zone的接口 可以指定--zone=xxx
    firewall-cmd --list-ports 查看默认zone的端口 可以指定--zone=xx
    firewall-cmd --list-services 查看默认zone的服务 可以指定--zone=xx
    firewall-cmd --zone=xx --change-interface=eno16777736 将指定接口转移到xxzone 
    ------------------------------------------------------
    firewall-cmd --add-source=xxx.xxx.xxx.xxx 在默认zone中添加源地址 如果换zone可以加--zone=xx
    firewall-cmd --add-interface=eno16777736 在默认zone中添加一个接口,如果换zone可以加--zone=xx
    firewall-cdm --add-port=portnumber/[tcp|udp]在默认zone中添加一个端口,如果换zone可以加--zone=xx
    firewall-cdm  --add-service=servername  在默认zone中添加一个服务。如果还zone可以加--zone
    firewall-cmd  --remove-source=xxx.xxx.xxxx.xxx 移除默认zone 中的源地址。可以指定--zone=xx
    firewall-cmd  --remove-interface=eno16777736 移除默认zone中的接口,可以指定--zone=xx
    firewall-cmd  --remove-port=portnumber/[tcp|udp] 移除默认zone中的端口 可以指定--zone=xx
    firewall-cmd  --remove-service=servername 移除默认zone 中的服务,可以指定--zone=xx   
    firewall-cmd  --add-rich-rule ‘‘ 添加富规则 可以指定--zone=xx
    firewall-cmd  --remove-rich-rule ‘‘ 删除富规则 可以指定--zone=xx
    firewall-cmd  --add-forward-port 添加端口映射 可以指定--zone=xx
    以上的命令都可以接--permanent 表示永久生效。但必须要firewall-cmd --reload 

3,managing rich rules---管理富规则

富规则;提供了log,地址伪装,端口转发,速率限制。是规则更加精细化
富规则的处理顺序:
端口转发和伪装 优先
log 日志 次之
允许 再次之
拒绝 最低

添加富规则的语法:firewall-cmd [--zone=xx] [--permanent] --add-rich-rule 
    ‘rule [family="rule family"]
    [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
    [ destination [NOT] address="address" ]
    [ element ]
    [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
    [ audit ]
    [ action ]‘ 
    解释:‘‘规则是用单引号包裹的
          rule 关键字
          [family="ipv4"后者"ipv6"]
          [source 关键字 address=xxx.xxx.xxx.xxx [mac="mac-address"]]
          [ destination 关键字 address="address" ]
    Elements:元素

        The element can be only one of the following element types: service, port, protocol, masquerade, icmp-block, forward-port, and source-port.
         元素类型只可能是这其中的一种:service, port, protocol, masquerade, icmp-block, forward-port, source-port.
        service name=service_name
        服务的表示法
        port port=number_or_range protocol=protocol
        端口的表示法,必须要跟协议
        protocol value=protocol_name_or_ID
         端口的值表示法
        icmp-block name=icmptype_name
        icmp 类型
        forward-port port=number_or_range protocol=protocol /
            to-port=number_or_range to-addr=address
         本机端口转发的表示法
        source-port port=number_or_range protocol=protocol
        源端口的表示法
        log [prefix=prefix text] [level=log level] limit value=rate/duration
         日志记录的表示发
         ferfix=text 表示;标识符
         level:日志记录的级别
         limit:限制(关键字)
         value=值(速率)
    action:

        accept | reject [type=reject type] | drop | mark set="mark[/mask]"
        accept:通过
        reject:拒绝
        drop:丢弃
        mask set= 打标记(集群服务会用到)
例子,以下的例子都是在默认zone为public。接口interface 也是在public zone中,其它zone没有定义源地址。

1,添加一条富规则,禁止源地址为192.168.0.111的主机访问
#firewall-cmd --add-rich-rule ‘rule family="ipv4" source address="192.168.0.111/32" drop‘

2,删除已有的富规则,先用firewall-cmd --list-all 查看规则。在用firewall-cmd  --remove-rich-rule‘规则‘

` # firewall-cmd --remove-rich-rule ‘rule family="ipv4" source address="192.168.0.111/32" drop‘``

3,添加一条富规则,禁止源地址为192.168.0.0/24网段的地址,访问22端口
    # firewall-cmd --add-rich-rule 
    ‘rule family=ipv4 source address=192.168.0.0/24 port port=22 protocol=tcp  reject‘
4,添加一条富规则。禁止所有的tcp连接
`firewall-cmd --add-rich-rule ‘rule family=ipv4 protocol value=tcp  reject‘`

5,添加一条富规则,禁止源地址为192.168.0.0/24网段的地址,访问ssh服务
`#firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=192.168.0.0/24 service name=ssh reject‘`

6,添加一条富规则,显示ftp每分钟只接受两个新连接。
`#firewall-cmd  --add-rich-rule ‘rule family=ipv4 service name=ftp limit value=2/m accept‘ `

4,masquerade and port forwarding---伪装和端口转发

什么时候要用masquerade:当我们只有一个公网地址,内网主机需要上网的时候。
1,添加端口伪装,是后端(192.168.10.13)的主机能够访问互联网。

firewall-cmd --add-masquerade --permanent  -----必须先添加伪装
     firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=192.168.10.13/32 masquerade‘ --permanent
     firewall-cmd --reload 

什么时候,需要用用到端口转发,比如说,httpd我们定义了一个非标准的端口(8009),可以把80端口访问都转发到那个非标准端口
2,本机的端口转发。来至192.168.0.0/24的主机访问端口443,都把流量转发到端口22上去。
```firewall-cmd --zone=public --permanent --add-rich-rule
‘rule family="ipv4" source address="192.168.0.0/24" forward-port port="443" protocol="tcp" to-port="22"‘
firewall-cmd --reload


## 5,forwarding a port --端口映射
  端口映射语法:
 ` firewall-cmd --add-forward-port=port=xx:proto=[tcp|dup]:toport=xx:toaddr`
  什么时候能用带端口映射,外网用户想访问内网的主机。
  1,把防火墙的80端口,映射到后端192.168.10.13的80端口上(注意,要关闭防火墙上的httpd服务,后端主机防火墙要开放http)

```#firewall-cmd --add-masquerade --permanent  
##firewall-cmd --add-forward-   port=port=80:proto=tcp:toport=80:toaddr=192.168.10.13 --permanent
  #firewall-cmd --reload

6,adding custom firewalld zone and services--添加自定义zone和服务

firewalld配置文件以xml格式为主(除了fireealld.conf)文件目录位置
1,/etc/firewalld/
2,/usr/lib/firewalld/
如果修改配置文件的话,/usr/lib/firewalld/下的文件不能修改,可以复制到/etc/firewalld/对应目录下进行修改。
运行时用到的配置文件为/etc/firewalld/目录下文件

6.1,自定义zone

我们来看一下/etc/firewalld/zone/public.xml的语法格式
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?> ---定义xml使用的版本和字符集类型
<zone>           ---用<zone>xxx</zone>封装一个zone
<short>Public</short>---用<short></short>封装zone的名字
<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> --用<description></description>封装表述信息
<interface name="eno33554992"/>----用<interface></interface> 封装接口的名字
<service name="dhcpv6-client"/>用一个<service name=""> 表示一个服务
<service name="ssh"/>
<rule family="ipv4"> ---用<rule></rule>封装规则
<source address="192.168.10.13/32"/>---里面规则语句
<masquerade/>
</rule>
</zone>
  ------------------------------------------------------------------------
添加自定义zone方法:
创建一个zone模板3种方法:
  1,` firewall-cmd --permanent --new-zone=xx`  用命令创建模板
  2 ,` cp /usr/lib/firewalld/zone/public.xml /etc/firewalld/zone/xx.xml `
   复制创建模板,需要修改里面的<short>xx</short>. 
  3,图形界面添加一个zone
  至于配置规则和系统自带的9个zone没有区别,可以用命令或者图形界面配置规则
  也可以手动修改xx.xml文件添加规则

6.2 自定义服务

  复制`/usr/lib/firewalld/service/http.mxl  /etc/firewalld/service/xxx.mxl `我们看一下语法格式
     <?xml version="1.0" encoding="utf-8"?>
     <service>
     <short>WWW (HTTP)</short>
     <description>HTTP is the protocol used to serve Web pages. 
     If you plan to make your Web server publicly available, 
     enable this option. This option is not required for viewing 
     pages locally or developing Web pages.</description>
     <port protocol="tcp" port="80"/> --用一个<port protocol=xx port=xxx/> 定义一 个协议和端口
     </service>
创建-个service模板的3种方法
1,`firewall-cmd --permanent --new-service=xx`
2,` /usr/lib/firewalld/service/http.mxl  /etc/firewalld/service/xxx.mxl`
   需要修改<short></short>添加需要的名字,修改<port protocol=xx port=xxx/>修改为自己所需要的协议和端口
3,图形界面添加一个service

7,managing SElinux port labeling---管理selinux 端口标签

selinux定义了一些安全的端口。通过selinux的定义的端口通信,selinux是放行的。

查看所有selinux开放的安全端口。
# semanage port -l
如果你定义的端口没有在selinux定义安全端口中,则服务无法启动,需要加进安全端口里
#semanage port -t -a PORT-TYPE -p [tcp|dup] portnumber
例如:semanage port -a -t http_port_t -p tcp 81
详细请man semanage-port查看

花了一天多的时间,终于敲完了,纯手动敲打,如果有问题请见谅。这是我看文档,查资料总结的,如果有不对的地方希望大佬指点。

以上是关于firewalld 网络端口安全详细介绍的主要内容,如果未能解决你的问题,请参考以下文章

3-unit10 firewalld

《网络安全入门到精通》-1.2 - Linux系统 - firewalld防火墙&iptables防火墙

Iptables及Firewalld加固服务器安全

firewalld介绍

保证Linux系统安全之firewalld防火墙配置地址伪装和端口转发详解

CentOS7 firewalld