一、防火墙
防火墙主要用来依据策略对穿越防火墙的流量进行过滤,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