CentOS7和fedora中的默认防火墙都变成了firewalld,当然你也可以选择禁用这个并自己安装iptables,下面内容原文:这里,而且只翻译我用到的部分文章。原文中还展示了如何使用图形界面进行配置,不过作为键盘爱好者,能不用鼠标的就尽量不用鼠标了,直接上命令行操作。


4.5.4 理解域概念

firewalld可以根据不同的信任级别,将处于不同域内的设备进行分离。NetworkManager用于管理firewalld将接口分配到哪个域中,可以通过NetworkManager界面或filrewall-config工具来进行设置。

默认的配置文件位于/etc/firewalld/可以快速的应用在网络接口上,这里有一份关于域的简短的说明:

dorp:任何入站请求都被忽略,无任何回复,只有发起的网络链接请求被放行。

block:任何入站请求都被拒绝,ipv4协议回复”icmp-host-prohibited”消息,ipv6协议回复”icmp6-adm-prohibited”,只有从系统内部发出的链接请求才被放行。

(个人感觉上面两个区别就是在于有无回复,对内的话用block、对外用dorp好一些,让外部扫描费点劲才知道被防火墙过滤了)

public:为在公共场所准备,你不相信网络中的其他电脑不会对你的电脑造成伤害,只有被选定的入站链接被接受。

external:为有伪装的外部网络特别是路由器准备,你不相信网络中的其他电脑不会对你的电脑造成伤害,只有被选定的入站链接被接受。

dmz:为那些处于隔离区(demilitarized zone)可以访问部分内部网络的电脑准备,只有被选定的入站链接被接受。

work:为工作域的电脑准备,你相信网络中其他电脑不会对你的电脑造成伤害,只有被选定的入站链接被接受。

home:为家庭域的电脑准备,你相信网络中其他电脑不会对你的电脑造成伤害,只有被选定的入站链接被接受。

internal:为内部域的电脑准备,你相信网络中其他电脑不会对你的电脑造成伤害,只有被选定的入站链接被接受。

trusted:接受全部请求。

你可以指定一个域为默认域,当一个新接口被添加到NetworkManager中时,它将被分配到默认域中。在默认情况下public为默认域。

4.5.6 理解预设服务

如果一个服务可用的话,它应该有一份本地端口和目标端口的列表,同时防火墙辅助模块自动载入这份列表。使用预设服务可以让用户轻松控制服务是否可以被访问,通过使用预设服务或用户自定义服务的方式来控制访问权限而不是通过管理端口或端口范围也许让管理员更加轻松。(翻译的不好,意思就是只记mysql而不用记3306端口了)服务的配置选项和通用文件信息在firewalld.service(5)中有介绍。服务被指定使用xml文件格式并且命名为service-name.xml这种格式。
可以通过下面的命令查看默认的预设服务:ls /usr/lib/firewalld/services/

不要修改/usr/lib/firewalld/services中的文件,只有/etc/firewalld/services/才可以被修改。

查看系统或用户创建的服务可以使用:ls /etc/firewalld/services/

服务可以通过图形界面或编辑/etc/firewalld/services/中的文件来新增或删除,如果你还没添加或修改过任何一个服务,/etc/firewalld/services/目录下是没有任何文件的,可以把从/usr/lib/firewalld/services/中复制出一个文件作为模板,比如:
cp /usr/lib/firewalld/services/[service].xml /etc/firewalld/services/[service].xml

你也许想新建一个文件,firewalld更喜欢新文件在/etc/firewalld/services/中而非/usr/lib/firewalld/services/中。

4.5.7 理解直接接口

firewalld中有一个功能叫做”直接接口“,它能直接通过iptables、ip6tables、ebtables的规则,这是为应用准备而不是为用户准备的。如果你对iptables不是十分熟悉的话用直接接口是很危险的,这无意间可能导致防火墙规则漏洞。某些规则被添加时仍然被firewalld所追踪,所以还可以用firewalld查看那些应用程序使用直接接口引起变化的规则。可以通过在firewalld-cmd 添加–direct来使用直接接口。

直接接口的目的是让服务或程序在运行时添加特定的防火墙规则, 通过使用–permanent参数或修改/etc/firewalld/direct.xml文件可以让这些规则持久化。如果规则没被持久化,则每次重启、重加载时都要重新添加。

4.5.15.3 通过命令行查看firewalld

查看状态:
firewall-cmd --state

查看当前域:

1
2
3
firewall-cmd --get-active-zones
public
interfaces: em1

根据接口查看所属域:

1
2
firewall-cmd --get-zone-of-interface=em1
public

查看某域下所有接口:

1
2
firewall-cmd --zone=public --list-interfaces
em1 wlan0

这个命令的结果来自Networkmanager而且只显示接口不显示链接。

查看某域的所有设定:

1
2
3
4
5
6
7
firewall-cmd --zone=public --list-all
public
interfaces:
services: mdns dhcpv6-client ssh
ports:
forward-ports:
icmp-blocks: source-quench

查看当前哪些服务被加载:

1
2
firewall-cmd --get-services
cluster-suite pop3s bacula-client smtp ipp radius bacula ftp mdns samba dhcpv6-client dns openvpn imaps samba-client http https ntp vnc-server telnet libvirt ssh ipsec ipp-client amanda-client tftp-client nfs tftp libvirt-tls

这将展示出所有位于/usr/lib/firewalld/services/的预设服务和当前载入的所有用户自定义服务,注意xml文件名必须是service-name.xml。如果用户自定义服务以及创建但没被加载,可以使用命令:firewall-cmd --permanent --get-services

这个命令将展示所有的服务,包括未被加载的那些位于/etc/firewalld/services/的服务。

4.5.15.4 通过命令行设置firewalld

4.5.15.4.1 忽略所有包

使用下面的命令忽略所有入站和出站请求:firewall-cmd --panic-on

已经建立的链接将在会话过期后被终止。重新接受所有请求:firewall-cmd --panic-off

查看panic状态:firewall-cmd --query-panic

yes为启用,no为关闭。

4.5.15.4.2 重载防火墙

重载防火墙但并不打断用户链接:firewall-cmd --reload

重载防火墙同时打断用户链接:firewall-cmd --complete-reload

通常情况这个命令只有在防火墙服务出问题了才被使用。

4.5.15.4.3 通过命令行添加新接口到某个域

更改接口到某个域:firewall-cmd --zone=public --add-interface=em1

从域中删除某接口:firewall-cmd --zone=dmz --change-interface=em1

如果想要持久化,记得添加–permanent参数以及重载防火墙:firewall-cmd --zone=public --remove-interface=em1

4.5.15.4.4 通过修改文件添加新接口到某个域

编辑ifcfg-em1文件(一般位于/ets/sysconfig/network-scripts目录),添加
ZONE=work

如果你省略zone或zone=””,默认将使用默认域。修改完成后NetworkManager将自动重连并设置相应域。

4.5.15.4.5 通过修改配置文件修改默认域

编辑 /etc/firewalld/firewalld.conf

1
2
3
4
default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=home

保存后重载防火墙,这将中断所有链接。

4.5.15.4.6 通过命令行修改默认域

使用命令:firewall-cmd --set-default-zone=public

将立即生效而不需要重载防火墙 。

4.5.15.4.7 通过命令行开放端口

首先列出所有开放的端口,以dmz域为例:firewall-cmd --zone=dmz --list-ports

注意,这里不会展示被–add-services参数打开的端口。

开放某域内的端口,比如开放dmz域的8080端口,命令如下:firewall-cmd --zone=dmz --add-port=8080/tcp

开放某段的端口,命令如下:firewall-cmd --zone=public --add-port=5060-5065/udp

如果需要的话,记得使用--permanent参数进行持久化。

4.5.15.4.8 通过命令行添加删除服务到某域

这里以smtp服务添加到work域为例:

1
2
firewall-cmd --zone=work --add-service=smtp
firewall-cmd --zone=work --remove-service=smtp

同样的添加--permanent进行持久化,如果你使用了这个参数并想立即生效,请重载防火墙。

4.5.15.4.9 通过修改xml文件添加删除服务到某域

首先查看默认域文件:

1
2
3
ls /usr/lib/firewalld/zones/
block.xml drop.xml home.xml public.xml work.xml
dmz.xml external.xml internal.xml trusted.xml

不要编辑这些文件,如果/etc/firewalld/zones/目录中没有等效文件这些文件将被使用。

想查看哪些域文件被修改,使用:

1
2
ls /etc/firewalld/zones/
external.xml public.xml public.xml.old

这里我们以向work域添加服务为例,首先:

1
cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/

现在可以编辑位于/etc/firewalld/zones下的文件了,以添加smtp服务为例,修改work.xml添加:<service name="smtp"/>

如果你删除了这个文件,那么/usr/lib/firewalld/zones/中的文件将被使用。

删除操作和添加相反,删除我们编辑的xml文件中添加的行就行了,就不翻了。

4.5.14.4.12 ip地址伪装

查看:firewall-cmd --zone=external --query-masquerade

启用:firewall-cmd --zone=external --add-masquerade

禁用:firewall-cmd --zone=external --remove-masquerade

记得添加--permanent以及重载防火墙。

4.5.14.4.12 端口转发

想要进行端口转发,先要启用ip地址伪装,然后使用:firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753

上面的例子中把external域中22端口转发给本机的3753端口,协议为tcp。其中端口可以是一个端口也可以是端口范围,而proto则只能是tcp或udp的协议中的一个。

如果是转发给另一个ip,通常是内部Ip并且端口不变,则firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.0.2.55

如果端口也变了:firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.0.2.55

记得添加--permanent以及重载防火墙。

4.5.14.6 使用直接接口

车轱辘话略过,见上面

4.5.14.6.1 添加用户规则

添加规则链

1
2
firewall-cmd --direct --add-rule ipv4 filter IN_public_allow \
0 -m tcp -p tcp --dport 666 -j ACCEPT

4.5.14.6.2 删除用户规则

1
2
firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow \
0 -m tcp -p tcp --dport 666 -j ACCEPT

4.5.14.6.3 展示用户规则

1
firewall-cmd --direct --get-rules ipv4 filter IN_public_allow

如果需要的话,同样使用--permanent以及重载防火墙。


翻到后面发现车轮话太多了,就只进行了意译,而且个人也就使用开放端口、转发一类的常见操作,高深地方就不不翻译了,用到了在说吧。注意的就是如果不加--permanent参数则会实时生效,但重启或重加载后会失效。加--permanent参数则不会实时生效,需要重新reload。
再补充一些东西,类似于黑白名单机制,比如我想根据来源ip来分配不同的域规则,则相关命令如下

1
2
3
4
5
firewall-cmd --permanent --zone=public --list-sources
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

有add-source、port自然就会有remove-source、port了,当你只想让某些指定的ip访问某些服务的话,就可以把这些ip放到相应的域内,加载规则如下:

  1. 如果一个包的来源已经绑定在某个域内,则使用这个域的规则。
  2. 如果一个包的来源没绑定任何一个域,但来源访问的接口绑定了某个域(比如eth0),则使用端口绑定的域规则。
  3. 如果一个包的来源和来源接口都没绑定某个域,则使用默认域规则。
    这里还要注意,一个ip地址只能属于一个域,否则会提示域冲突。