1.firewalld概念
从centos7之后,iptables服务的启动脚本已经被忽略。使用firewalld来取代iptables服务。
在RHEL7中,默认是firewalld来管理netfilter子系统,不过底层调用的命令任然是iptables。firewalld是iptables的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面。相较于iptables而言,firewalld支持动态更新技术并加入了区域(zone)的概念。
firewalld与iptables直接区别:
1.firewalld使用区域和服务而不是链式规则;
2.它动态管理规则集,允许更新规则而不破坏现有会话和连接。
2.firewalld使用区域管理
区域就是firewalld预先准备了几套防火墙策略集合,用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
1.需要注意的是firewalld中的区域与接口
一个网卡仅能绑定一个区域,eth0-->A区域
当时一个区域可以绑定多个网卡:A区域-->eth0 eth1 eth2
1.区域
区域是针对给定位或场景可能具有的各种信任级别的预构建 规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。首次启用firewalld,默认区域是public。
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在Internet区域上允许DHCP,但在external区域仅允许HTTP和SSH。
区域选项 | 默认规则策略 |
home | 拒绝流入流量;如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 |
internal | 等同于home |
trusted | 允许所有数据包流入流出 |
work | 拒绝流入的流量,除非与流出的流量相关;如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
常用:trusted区域 ---白名单
public区域---默认
drop区域----黑名单
Trust区域:可信任区域,主要用于连接局域网内部网络。比如企业网络中,通常将员工网络设置为Trust区域。
Untrust区域:非信任区域,主要用于连接互联网。大部分情况下,非信任区域无法主动访问可信任区域。
DMZ区域:非军事化区域,作为非信任区域与信任区域之间的缓冲区。一般用于放置企业内部服务器,如;OA服务器、邮件服务器等。
Local区域:指防火墙自身,凡是防火墙主动发出的报文,均可以认为从Local区域发出。
2.firewalld基本指令参数
zone区域相关指令 | |
参数 | 作用 |
--get-default-zone | 获取默认 的区域名称 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
--get-zones | 显示总共可用的区域 |
services服务相关命令 | |
参数 | 作用 |
--get-services | 列出服务列表中所有可管理的服务 |
--add-service= | 设置默认区域允许该添加服务的流量 |
--remove-service= | 设置默认区域不允许该删除服务的流量 |
Port端口相关指令 | |
参数 | 作用 |
--add-port=<端口号、协议> | 设置默认区域允许该填加端口的流量 |
--remove-port=<端口号、协议> | 设置默认区域不允许该删除端口的流量 |
interface网卡相关指令 | |
参数 | 作用 |
--add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
--change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
--remove-interface | 移除网卡 |
其他相关指令 | |
--list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--reload | 让“永久生效”的配置规则立即生效,并覆盖当前的规则 |
IP相关指令 | |
--add-source=<IP/位数> | 设置默认区域允许该IP的流量 |
--remove-source=<IP/位数> | 设置默认区域移除允许该IP的流量 |
3.基本应用
启动并查看状态
# systemctl start firewalld
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2023-06-08 19:23:08 CST; 9s ago
Docs: man:firewalld(1)
Main PID: 1758 (firewalld)
CGroup: /system.slice/firewalld.service
└─1758 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
查看预设服务
# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
查看所有区域的设置
# firewall-cmd --list-all-zones
查看指定网卡所在的区域
# firewall-cmd --get-zone-of-interface=ens32
把firewalld的当前默认区域设置为drop,此为永久设置
# firewall-cmd --set-defaut-zone=drop
4.firewalld区域配置策略
为正常使用firewalld服务和相关工具去管理防火墙,必须启动firewalld服务,关闭以前旧的防火墙相关的服务。firewalld规则分为两种状态:
runtime运行时:修改马上生效,但如果重启服务则马上失效,测试建议;
permanent持久配置:修改规则后需要reload重载服务才会生效,生产建议。
禁用iptables
# systemctl stop iptables
# systemctl disabled iptables
或
# systemctl mask iptables
启动已给出
常用命令
# firewall-cmd --list-all --zone=trusted
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted:区域名称;
target:状态,默认为ACCEPT;
icmp-block-inversion:icmp模块;
interfaces:绑定的网卡;
soureces:允许通过的IP地址、网段;
services:允许通过的服务;
ports:允许访问的端口;
protocols:允许通过的协议;
masquerade:IP伪装;
forward-ports:转发的端口;
source-ports:源端口;
icmp-blocks:icmp块;
rich rules:富规则
5.firewalld配置放行策略
1.放行服务
[root@localhost ~]# firewall-cmd --add-service=http
success #放行多个服务
[root@localhost ~]# firewall-cmd --add-service={https,mysql,redis}
success #可自行修改的服务目录
[root@localhost ~]# cd /usr/lib/firewalld/services/
[root@localhost services]# pwd
/usr/lib/firewalld/services #自定义配置服务
[root@localhost services]# firewall-cmd --add-service=nginx
Error: INVALID_SERVICE: nginx
[root@localhost services]# cp http.xml nginx.xml
[root@localhost services]# firewall-cmd --reload
success
[root@localhost services]# firewall-cmd --add-service=nginx
success
2.firewalld放行端口
[root@localhost ~]# firewall-cmd --add-port=80/tcp
success #开放端口必须加上协议
[root@localhost ~]# firewall-cmd --add-port={443/tcp,80/udp}
success #添加多个端口
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client nginx ssh
ports: 80/tcp 443/tcp 80/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
3. 放行IP(允许一个IP所有的操作)
[root@localhost ~]# firewall-cmd --add-source=192.168.42.147 --zone=trusted
success
6.firewalld实例
1.启用或者禁用Http实例
# firewall-cmd --zone=public --add-service=http --permanent
success
# firewall-cmd --zone=public --remove-service=http --permanent
2.允许或者拒绝任意端口/协议
# firewall-cmd --zone=public --add-port=22/tcp --permanent
# firewall-cmd --zone=public --remove-port=22/tcp --permanent
3.禁用一个ip地址所有访问
[root@localhost ~]# firewall-cmd --add-source=192.168.42.144 --zone=drop
success
[root@localhost ~]# firewall-cmd --get-active-zone
drop
sources: 192.168.42.144
public
interfaces: ens33
4.禁用一个网段
[root@localhost ~]# firewall-cmd --add-source=192.168.19.0/24 --zone=drop
success
[root@localhost ~]# firewall-cmd --get-active-zone
drop
sources: 192.168.42.144 192.168.19.0/24
public
interfaces: ens33
5.允许一个ip地址访问所有
[root@localhost ~]# firewall-cmd --add-source=192.168.42.143/32 --zone=trusted
success
[root@localhost ~]# firewall-cmd --get-active-zone
drop
sources: 192.168.42.144 192.168.19.0/24
public
interfaces: ens33
trusted
sources: 192.168.42.143/32
6.移除IP地址
# firewall-cmd --remove-source=192.168.42.143/32 --zone=trusted
7.添加一个端口
firewall-cmd --add-port=80/tcp
8.显示所有允许的端口及协议
# firewall-cmd --list-ports
9.移除一个端口
# firewall-cmd --list-ports
80/tcp 443/tcp 80/udp
# firewall-cmd --remove-port=443/tcp
10.移除多个端口
# firewall-cmd --remove-port={80/tcp,22/tcp}
7.firewalld端口转发策略
1.端口转发是传统的目标地址映射,实现外网访问内网资源;
2.流量转发命令格式:
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
例:将本地的6666端口映射到后端的19.168.42.137的22端口
firewall-cmd --permanent --zone=public --add-forward -port=port=6666:proto=tcp:toport=22:toaddr=192.168.42.137
移除端口映射
firewall-cmd --permanent --zone=public --remove-forward -port=port=6666:proto=tcp:toport=22:toaddr=192.168.42.137
禁用一切网络
firewall-cmd --panic-on
关闭禁用的网络
firewall-cmd --panic-off
3.firewalld富规则集
1.富规则语法
查看具体语法:man firewalld.richlanguage
--add-rich-rule='<rule>' #在指定区域添加一条富规则
--remove-rich-rule='<rule>' #在指定的区域删除一条富规则
--query-rich-rule='<rule>' #找到规则返回0,找不到返回1
--list-rich-rules #列出指定区域里的所有富规则
2.富规则实例
1.允许192.168.42.137主机能够访问http服务,允许172.16.2.0/24能够访问111端口
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.42.137 service name=http accept'
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.0/24 port port=111 protocol=tcp accept'
2.默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.2.0/24网段通过ssh连接服务器
方式一:
# firewall-cmd --add-service=ssh
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.0/24 service name=ssh reject'
# ssh 172.16.2.8 22
ssh: connect to host 172.16.2.8 port 22: Connection refused
方式二:
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.0/24 service name=ssh drop'
3.当用户来源IP地址是192.168.42.137主机,则将用户请求的555端口转发至后端192.168.42.147的22端口
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.42.137 forward-port port=5555 protocol=tcp to-port=22 to-addr=192.168.42.147'
3.查看富规则
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client nginx ssh
ports: 80/tcp 80/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="172.16.2.0/24" service name="ssh" drop
rule family="ipv4" source address="192.168.42.137" forward-port port="5555" protocol="tcp" to-port="22" to-addr="192.168.42.147"
4.防火墙配置网站禁ping
# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp drop'