linux防火墙基础
从传统意义上来说,防火墙技术分为三类:包过滤(Packet Filtering)、应用代理(Application Proxy)、状态检测(Stateful lnspection)。无论一个防火墙的实现过程有多复杂,归根结底都是在这三种技术的基础上进行扩展的。Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实时过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。在CentOS7系统中几种防火墙共存:firewalld、iptables、ebtables,默认使用firewalld来管理netfilter子系统,重点讲firewalld。
netfilter:指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。
firewalld:指用于管理linux防火墙的命令程序,属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。
firewalld概述
firewalld简介
firewalld的作用是为包过滤机制提供匹配规则,通过各种不同的规则,告诉netfilter对来自指定源、前往指定目的或具由某些协议特征的数据包采取何种处理方式。为了更加方便地组织管理防火墙,firewalld提供了支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥,并且拥有两种配置模式:运行时配置与永久配置。它还支持服务或应用程序直接添加防火墙规则接口。
firewalld网络区域
firewalld将所有的网络数据流量划分为多个区域,从而简化防火墙管理。根据数据包的源IP地址或传入网络接口等条件,将数据流量传入相应的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。
若源地址关联到特定的区域,则执行该区域所定制的规则。
若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则。
若网络接口未关联到特定的区域,则使用默认区域并执行该区域所指定的规则。
默认区域不是单独的区域,而是指向系统上定义的某个其他区域。默认情况下,默认区域是public,但是系统管理员可以更改默认区域。以上匹配规则,按照先后顺序,第一个匹配的规则胜出。
区域 | 说明 |
trusted(信任区域) | 可以接收所有的网络连接。 |
public(公共区域) | 除非与传出流量相关,或与ssh或dhcpv6-client预定义服务匹配,否则拒绝流量传入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收经过选择的连接。并且,该区域是新添加网络接口的默认区域。 |
internal(内部区域) | 除非与传出的流量相关,或与ssh、ipp-client、mdns、samba-client、dhcpv6-client预定义服务匹配,否则拒绝流量传入,用于内部网络。信任网络内的其他计算机不会危害计算机,仅接收经过选择的连接。 |
external(外部区域) | 除非与传出流量相关,或与ssh预定义服务匹配,否则拒绝流量传入。通过此区域转发的ipv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。 |
dmz(隔离区域也称为非军事区域) | 除非与传出的流量相关,或与ssh预定义服务匹配,否则拒绝流量传入。 |
firealld的配置方法
在Centos7系统中,可以使用三种方式配置firewalld防火墙
firewall-config图形工具
firewall-cmd命令行工具
/etc/firewalld/中的配置文件(不建议直接编辑配置文件)
firewall-config图形工具
firewall-config图形化工具配置工具支持防火墙的所有特性,系统管理员可以通过它来改变系统或用户策略。通过firewall-config图形化配置工具,可以实现配置防火墙允许通过的服务、端口、伪装、端口转发、ICMP过滤器等功能。在CentOS7系统中单击“应用程序”→“杂项”→“防火墙”即可打开下图所示的firewall-config工作界面,或者直接在终端输入"firewall-config"命令也可以打开此界面。
图形界面简单了解即可,在现实工作中多用Xshell等工具,不会显示出图形界面,多数用firewall-cmd命令。
firewall-cmd命令
- 启动、停止、查看firewalld服务
1. [root@localhost ~]# systemctl start firewalld 2. [root@localhost ~]# systemctl enable firewalld 3. Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. 4. Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service. 5. [root@localhost ~]# firewall-cmd --state 6. running 7. [root@localhost ~]# systemctl stop firewalld 8. [root@localhost ~]# systemctl disable firewalld 9. Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. 10. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
- 获取预定义信息
firewall-cmd预定义信息主要包括三种:可用的区域、可用的服务以及可用的ICMP阻塞类型。
1. [root@localhost ~]# firewall-cmd --get-zones //显示预定义的区域 2. work drop internal external trusted home dmz public block 3. [root@localhost ~]# firewall-cmd --get-service //显示预定义的服务 4. RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server 5. [root@localhost ~]# firewall-cmd --get-icmptypes //显示预定义的ICMP类型 6. destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded timestamp-reply timestamp-request
firewall-cmd --get-icmptypes命令的执行结果中各种阻塞类型的含义如下:
destination-unreachable :目的地址不可达
echo-reply :应答回应
parameter-problem :参数问题
redirect :重新定向
router-advertisement :路由器通告
router-solicitation :路由器征寻
source-quench :源端抑制
time-exceeded :超时
timestamp-reply :时间戳应答回应
timestamp-request :时间戳请求
- 区域管理
使用firewall-cmd命令可以实现获取和管理区域,为指定区域绑定网络接口等功能。下面列出来firewall-cmd命令的区域管理选项说明。
选项 | 说明 |
--get-default-zone | 显示网络连接或接口的默认区域 |
--set-default-zone=<zone> | 设置网络连接或接口的默认区域 |
--gte-active-zones | 显示已激活的所有区域 |
--get-zone-of-interface=<interface> | 显示指定接口绑定的区域 |
--zone=<zone> --add-interface=<interface> | 为指定接口绑定区域 |
--zone=<zone> --change-interface=<interface> | 为指定的区域更改绑定的网络接口 |
--zone=<zone> --remove-interface=<interface> | 为指定的区域删除绑定的网络接口 |
--list-all-zones | 显示所有区域及其规则 |
[--zone=<zone>] --list-all | 显示所有指定区域的所有规则,省略--zone=<zone>时表示仅对默认区域操作 |
zone:区域 interface:接口
具体操作如下:
显示当前系统中的默认区域
1. [root@localhost ~]# firewall-cmd --get-default-zone 2. public
显示默认区域的所有规则
1. [root@localhost ~]# firewall-cmd --list-all 2. public 3. target: default 4. icmp-block-inversion: no 5. interfaces: 6. sources: 7. services: dhcpv6-client ssh 8. ports: 9. protocols: 10. masquerade: no 11. forward-ports: 12. sourceports: 13. icmp-blocks: 14. rich rules:
显示网络接口ens33对应区域
1. [root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33 2. public
将网络接口ens33对应区域更改为internal区域
1. [root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens33 2. The interface is under control of NetworkManager, setting zone to 'internal'. 3. success 4. [root@localhost ~]# firewall-cmd --zone=internal --list-interfaces 5. ens33 6. [root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33 7. internal
显示所有激活区域
1. [root@localhost ~]# firewall-cmd --get-active-zones 2. internal 3. interfaces: ens33
- 服务管理
firewall-cmd命令区域中服务管理的常用选项如下:
选项 | 说明 |
[--zone=<zone>] --list-services | 显示指定区域内允许访问的所有服务 |
[--zone=<zone>] --add-service=<service> | 为指定区域设置允许访问的某项服务 |
[--zone=<zone>] --remove-service=<service> | 删除指定区域已设置的允许访问的某项服务 |
[--zone=<zone>] --list-ports | 显示指定区域允许访问的所有端口 |
[--zone=<zone>] --add-port=<portid>[-<portid>]/<portocol> | 为指定区域设置允许访问的某个/某段端口号(包括协议名) |
[--zone=<zone>] --remove-port=<portid>[-<portid>]/<portocol> | 删除指定区域已设置的允许访问的端口号(包括协议名) |
[--zone=<zone>] --list-icmp-blocks | 显示指定区域内拒绝访问的所有ICMP类型 |
[--zone=<zone>] --add-icmp-block=<icmptype> | 为指定区域设置拒绝访问的某项ICMP类型 |
[--zone=<zone>] --remove-icmp-block=<icmptype> | 删除指定区域已设置的拒绝访问的某项ICMP类型,省略--zone=<zone>时表示对默认区域操作 |
zone:区域 interface:接口 service:服务 portid:端口id icmptype:icmp类型
具体操作如下:
为默认区域设置允许访问的服务
1. [root@localhost ~]# firewall-cmd --list-services //显示默认区域允许访问的所有的服务 2. dhcpv6-client ssh 3. [root@localhost ~]# firewall-cmd --add-service=http //设置默认区域允许访问http服务 4. success 5. [root@localhost ~]# firewall-cmd --add-service=https //设置默认区域允许访问https服务 6. success 7. [root@localhost ~]# firewall-cmd --list-services 8. dhcpv6-client ssh http https
为internal区域设置允许访问的服务
1. [root@localhost ~]# firewall-cmd --zone=internal --add-service=mysql 2. success 3. [root@localhost ~]# firewall-cmd --zone=internal --remove-service=samba-client 4. success 5. [root@localhost ~]# firewall-cmd --zone=internal --list-services 6. ssh mdns dhcpv6-client mysql
- 端口管理
在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就回自动打开。但是,对于非定义的服务只能手动为指定的区域添加端口。例如,执行以下操作即可是现在internal区域打开443/TCP端口。
1. [root@localhost ~]# firewall-cmd --zone=internal --add-port=443/tcp 2. success
若想实现在internal区域禁止443/TCP端口访问,可以执行以下命令。
1. [root@localhost ~]# firewall-cmd --zone=internal --remove-port=443/tcp 2. success
- 两种配置模式
firewall-cmd命令工具有两种配置模式:运行时模式表示当前内存中运行的防火墙配置,在系统或firewalld服务重启、停止时配置将失效;永久模式表示重启防火墙重新加载防火墙时的规则配置,是永久存储在配置文件中的。
firewall-cmd命令工具与配置模式相关的选项有三个。
- --reload:重新加载防火墙规则并保持状态信息,即将永久配置规则应用为运行时配置。
- --permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动ifrewalld或重新加载防火墙规则时才会生效;若不带有此选项,表示用于设置运行规则。
- --runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
防火墙配置实例
企业网络中,网关服务器和网站服务器采用CentOS7操作系统,网关服务器安装了三块千兆网卡、分别连接internet、企业内网、网站服务器。
实验需求
网关服务器连接互联网网卡ens33地址为100.1.1.10,为公网IP地址,分配到firewall的external区域;连接内网网卡ens36地址为192.168.1.1,分配到firewall的trusted区域;连接服务器网卡ens37地址为192.168.2.1,分配到firewall的dmz区域。
网站服务区和网关服务器均通过SSH来远程管理,为了安全,将SSH默认端口改为12345.
网站服务开启https,过滤未加密的http流量。
网站服务器拒绝ping。
所有服务器先关闭防火墙和selinux,后面需要在开启。
基本环境配置
在网关服务器上配置主机名及网卡地址。
1. [root@localhost ~]# hostname gateway-server //更改主机名方便后面ssh识别 2. [root@gateway-server ~]# ifconfig 3. ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 4. inet 100.1.1.10 netmask 255.255.255.0 broadcast 100.1.1.255 5. inet6 fe80::5bb6:9cb7:d574:31f3 prefixlen 64 scopeid 0x20<link> 6. ether 00:0c:29:01:d9:3d txqueuelen 1000 (Ethernet) 7. RX packets 282 bytes 90613 (88.4 KiB) 8. RX errors 0 dropped 0 overruns 0 frame 0 9. TX packets 190 bytes 31853 (31.1 KiB) 10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 11. 12. ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 13. inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 14. inet6 fe80::a6d8:7e68:b2ff:49dd prefixlen 64 scopeid 0x20<link> 15. ether 00:0c:29:01:d9:47 txqueuelen 1000 (Ethernet) 16. RX packets 156 bytes 47629 (46.5 KiB) 17. RX errors 0 dropped 0 overruns 0 frame 0 18. TX packets 94 bytes 15201 (14.8 KiB) 19. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 20. 21. ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 22. inet 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255 23. inet6 fe80::3470:1ac:fcda:6679 prefixlen 64 scopeid 0x20<link> 24. ether 00:0c:29:01:d9:51 txqueuelen 1000 (Ethernet) 25. RX packets 145 bytes 44528 (43.4 KiB) 26. RX errors 0 dropped 0 overruns 0 frame 0 27. TX packets 98 bytes 16528 (16.1 KiB) 28. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
开启网关服务器的路由转发功能。
1. [root@gateway-server ~]# vim /etc/sysctl.conf 2. net.ipv4.ip_forward=1 3. [root@gateway-server ~]# sysctl -p 4. net.ipv4.ip_forward = 1
配置web服务器主机名及网卡地址。
1. [root@web ~]# hostname web 2. [root@web ~]# ifconfig 3. ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 4. inet 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255 5. inet6 fe80::595f:84d:a379:7b6e prefixlen 64 scopeid 0x20<link> 6. ether 00:0c:29:bc:c7:b8 txqueuelen 1000 (Ethernet) 7. RX packets 295 bytes 98302 (95.9 KiB) 8. RX errors 0 dropped 0 overruns 0 frame 0 9. TX packets 225 bytes 37892 (37.0 KiB) 10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 11. [root@web ~]# route -n 12. Kernel IP routing table 13. Destination Gateway Genmask Flags Metric Ref Use Iface 14. 0.0.0.0 192.168.2.1 0.0.0.0 UG 100 0 0 ens33
网站服务器环境搭建
安装httpd和mod_ssl软件包。
1. [root@web ~]# yum -y install -y httpd mod_ssl 2. [root@web ~]# systemctl start httpd 3. [root@web ~]# systemctl enable httpd 4. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
创建网站首页。
1. [root@web ~]# vim /var/www/html/index.html 2. <h1>this is a test web</h1>
更改SSH的侦听地址。
1. [root@web ~]# vim /etc/ssh/sshd_config 2. Port 12345 //去掉注释更改端口号 3. [root@web ~]# systemctl restart sshd //这里需要提前关闭selinux才能重启成功
在网站服务器上配置firewalld
在网站服务器上启动firewalld并将默认区域设置为dmz区域。
1. [root@web ~]# systemctl start firewalld 2. [root@web ~]# systemctl enable firewalld 3. Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. 4. Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service. 5. [root@web ~]# systemctl status firewalld 6. ● firewalld.service - firewalld - dynamic firewall daemon 7. Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) 8. Active: active (running) since 二 2022-07-05 21:19:38 CST; 23s ago 9. Docs: man:firewalld(1) 10. Main PID: 5791 (firewalld) 11. CGroup: /system.slice/firewalld.service 12. └─5791 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 13. 14. 7月 05 21:19:38 web systemd[1]: Starting firewalld - dynamic firewall daemon... 15. 7月 05 21:19:38 web systemd[1]: Started firewalld - dynamic firewall daemon. 16. Hint: Some lines were ellipsized, use -l to show in full. 17. [root@web ~]# firewall-cmd --set-default-zone=dmz //设置默认区域为dmz区域 18. success
为dmz区域打开https服务及添加TCP的12345端口。
1. [root@web ~]# firewall-cmd --zone=dmz --add-service=https --permanent 2. success 3. [root@web ~]# firewall-cmd --zone=dmz --add-port=12345/tcp --permanent 4. success
禁止ping。
1. [root@web ~]# firewall-cmd --add-icmp-block=echo-request --zone=dmz --permanent 2. success
因为预定义的SSH服务已经更改端口,所以将预定义SSH服务移除。
1. [root@web ~]# firewall-cmd --zone=dmz --remove-service=ssh --permanent 2. success
重新加载firewalld激活配置,并查看刚才的配置。
1. [root@web ~]# firewall-cmd --reload 2. success 3. [root@web ~]# firewall-cmd --list-all --zone=dmz 4. dmz (active) 5. target: default 6. icmp-block-inversion: no 7. interfaces: ens33 8. sources: 9. services: https 10. ports: 12345/tcp 11. protocols: 12. masquerade: no 13. forward-ports: 14. sourceports: 15. icmp-blocks: echo-request 16. rich rules:
在网关服务器上配置firewalld
查看启动状态并运行firewalld。
1. [root@gateway-server ~]# firewall-cmd --state 2. not running 3. [root@gateway-server ~]# systemctl start firewalld 4. [root@gateway-server ~]# systemctl enable firewalld 5. Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. 6. Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service. 7. [root@gateway-server ~]# firewall-cmd --state 8. running
设置默认区域为external区域,并查看配置结果。
1. [root@gateway-server ~]# firewall-cmd --set-default-zone=external 2. success 3. [root@gateway-server ~]# firewall-cmd --list-all 4. external (active) 5. target: default 6. icmp-block-inversion: no 7. interfaces: ens33 ens36 ens37 8. sources: 9. services: ssh 10. ports: 11. protocols: 12. masquerade: yes 13. forward-ports: 14. sourceports: 15. icmp-blocks: 16. rich rules:
将ens36网卡配置到trusted区域,ens37配置到dmz区域。
1. [root@gateway-server ~]# firewall-cmd --change-interface=ens36 --zone=trusted 2. The interface is under control of NetworkManager, setting zone to 'trusted'. 3. success 4. [root@gateway-server ~]# firewall-cmd --change-interface=ens37 --zone=dmz 5. The interface is under control of NetworkManager, setting zone to 'dmz'. 6. success 7. [root@gateway-server ~]# firewall-cmd --get-active-zones 8. dmz 9. interfaces: ens37 10. external 11. interfaces: ens33 12. trusted 13. interfaces: ens36
在企业内网访问dmz区域的网站服务器,就可以成功访问了。
网关服务器修改SSH侦听端口,并重启服务(需要关闭selinux)。
1. [root@gateway-server ~]# vim /etc/ssh/sshd_config 2. Port 12345 3. [root@gateway-server ~]# systemctl restart sshd
配置external区域添加TCP的12345端口。
1. [root@gateway-server ~]# firewall-cmd --zone=external --add-port=12345/tcp --permanent 2. success
配置external区域移除SSH服务。
1. [root@gateway-server ~]# firewall-cmd --zone=external --remove-service=ssh --permanent 2. success
配置external区域禁止ping。
1. [root@gateway-server ~]# firewall-cmd --zone=external --add-icmp-block=echo-request --permanent 2. success
重新加载防火墙激活配置。
1. [root@gateway-server ~]# firewall-cmd --reload 2. success
在互联网测试计算机上通过SSH登录网关外部接口地址的12345端口,成功。
1. [root@localhost ~]# ssh -p 12345 100.1.1.10 2. The authenticity of host '[100.1.1.10]:12345 ([100.1.1.10]:12345)' can't be established. 3. ECDSA key fingerprint is ae:dd:3a:6a:23:aa:d4:2d:cc:90:f2:f9:4f:4b:b6:de. 4. Are you sure you want to continue connecting (yes/no)? yes 5. Warning: Permanently added '[100.1.1.10]:12345' (ECDSA) to the list of known hosts. 6. root@100.1.1.10's password: 7. Last failed login: Tue Jul 5 21:47:54 CST 2022 from :0 on :0 8. There was 1 failed login attempt since the last successful login. 9. Last login: Tue Jul 5 20:46:32 2022
在企业內网测试计算机上SSH登录web网站服务器的12345端口,成功。
1. [root@localhost ~]# ssh -p 12345 192.168.2.10 2. The authenticity of host '[192.168.2.10]:12345 ([192.168.2.10]:12345)' can't be established. 3. ECDSA key fingerprint is d3:34:18:89:73:c8:d3:47:e4:7d:36:c7:a3:62:17:b6. 4. Are you sure you want to continue connecting (yes/no)? yes 5. Warning: Permanently added '[192.168.2.10]:12345' (ECDSA) to the list of known hosts. 6. root@192.168.2.10's password: 7. Last login: Tue Jul 5 20:38:39 2022