一、防火墙

  防火墙主要用来依据策略对穿越防火墙的流量进行过滤,iptables与firewalld是linux系统中用来定义防火墙策略的防火墙管理工具。
  iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。
  防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
  一般而言,防火墙策略规则的设置有两种:一种是"通"(即放行),一种是"堵"(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。

二、firewalld

(1)区域

  相较于传统的防火墙管理配置工具,firewalld加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略模板,用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

区域 默认规则策略
trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关

以上区域我们主要关注public、trusted和drop即可,public是默认区域。

(2)常用选项

选项                   含义
–get-default-zone 查询默认的区域名称
–get-zones 显示可用的区域
–set-default-zone=<区域名称> 设置默认的区域,使其永久生效
–get-active-zones 显示当前正在使用的区域与网卡名称
–get-services 显示预先定义的服务
–list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
–list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
–add-source= 设置默认区域允许该IP或者子网的流量
–remove-source= 设置默认区域不再允许该IP或者子网的流量
–add-service=<服务名> 设置默认区域允许该服务的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–query-service=<服务名> 查询区域规则中是否有定义该服务
–add-port=<端口号/协议> 设置默认区域允许该端口的流量
–remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
–add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将某个网卡与区域进行关联
–add-forward-port= 端口转发。用法" –add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>"
–permanent 永久生效。不加此选项临时生效,加上永久生效但是并不立即生效需要reload。
–reload 让“永久生效”的配置规则立即生效,并覆盖当前的临时配置规则
–panic-on 开启应急状况模式,会阻断一切网络连接
–panic-off 关闭应急状况模式

(3)简单示例

永久生效的规则会写入到下面这个文件中。

[root@m1 ~]# 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="ssh"/>
  <service name="dhcpv6-client"/>
</zone>

放行服务

[root@m1 ~]# firewall-cmd --permanent --add-service={http,mysql}
success
[root@m1 ~]# firewall-cmd --reload
success
[root@m1 ~]# firewall-cmd --list-services
dhcpv6-client http mysql ntp ssh

需要注意的是,如果服务的默认的端口改动了,那么放行服务是无用,添加服务本质还是作用服务的端口。
要么放行端口,要么改动firewalld预先定义服务文件,在/usr/lib/firewalld/services目录下,找到对应服务文件修改端口即可。
当然也可以在这个目录下自行定义服务。

放行端口

[root@m1 ~]# firewall-cmd --permanent --add-port={443/tcp,2049/udp}
success
[root@m1 ~]# firewall-cmd --permanent --add-port=1000-1005/tcp
success
[root@m1 ~]# firewall-cmd --reload
success
[root@m1 ~]# firewall-cmd --list-ports
2222/tcp 443/tcp 2049/udp 1000-1005/tcp

放行ip

[root@m1 ~]# firewall-cmd --permanent --add-source={10.0.0.1,10.0.0.2}
success
[root@m1 ~]# firewall-cmd --reload
success
[root@m1 ~]# firewall-cmd --list-sources
10.0.0.1 10.0.0.2

端口转发

//将访问本机2222端口的流量转发到本机的22端口上

[root@m1 ~]# firewall-cmd --permanent --add-forward-port=port=2222:proto=tcp:toport=22:toaddr=10.0.0.61

//将访问本机3333端口的流量转发到10.0.0.7主机的22端口上

[root@m1 ~]# firewall-cmd --add-forward-port=port=3333:proto=tcp:toport=22:toaddr=10.0.0.7
success
[root@m1 ~]# firewall-cmd --add-masquerade      //转发到不同计算机时,需要开启IP地址伪装,即自动化NAT
success

(4)富规则

语法格式,可以使用 man firewalld.richlanguage 查看详细语法含义。

rule
    [source]
    [destination]
    service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
    [log]
    [audit]
    [accept|reject|drop|mark]

Rule:
        rule [family="ipv4|ipv6"]

Source:
        source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset"

Destination:
        destination [not] address="address[/mask]"

Service:
        service name="service name"

Port:
        port port="port value" protocol="tcp|udp"

Protocol:
        protocol value="protocol value"

Forward-Port:
        forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"

Source-Port:
        source-port port="port value" protocol="tcp|udp"

示例:

//拒绝172.16.1.0/24网段的所有主机访问本机的ssh服务

[root@m1 ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.1.0/24" service name="ssh" reject"

//只允许来源ip为10.0.0.1的主机访问2222端口

[root@m1 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" port port="2222" protocol="tcp" accept'

//拒绝ICMP包

[root@m1 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp drop'
success

//当来源ip为10.0.0.1访问本机3333端口时,将流量转发到10.0.0.7主机的22端口上

[root@m1 ~]# firewall-cmd --add-masquerade
[root@m1 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=3333 protocol=tcp to-port=22 to-addr=10.0.0.7'


参考文章: https://www.linuxprobe.com/chapter-08.html

发表评论

验证码: 20 + = 21