在 Debian 9 上,我安装了firewalld
(版本0.4.4.2-1
)。
sudo firewall-cmd --get-active-zones
显示没有输出。并echo $?
显示退出状态为 0 ( EXIT_SUCCESS
)。为什么?
我有一个 network interface eth0
,由ip link
(以及 loopback interface lo
)显示。
我应该说我的防火墙配置似乎大部分都在工作。FWIW,我已将默认区域从 更改public
为MyZone
,定义如下:
$ sudo cat /etc/firewalld/zones/MyZone.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>My Zone</short>
<service name="ssh"/>
<service name="https"/>
<!-- ... -->
</zone>
如果我尝试使用另一台计算机连接,我可以访问 SSH 和 HTTPS 服务。如果我ncat -l -p 8000
在服务器上运行,并尝试连接ncat my-server 8000
,则连接被正确阻止。(Ncat: No route to host.
并tcpdump
显示生成了一个 ICMP 无法访问的回复,输入“管理员禁止”)。
为什么firewall-cmd --get-active-zones
没有将 MyZone 显示为活动状态?
$ sudo firewall-cmd --state
running
$ sudo firewall-cmd --get-active-zones
$ echo $?
0
$ sudo firewall-cmd --get-default-zone
MyZone
$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:43:01:c0:ab brd ff:ff:ff:ff:ff:ff
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fd5e:fcf3:b885:0:250:43ff:fe01:c0ab/64 scope global mngtmpaddr dynamic
valid_lft forever preferred_lft forever
inet6 fe80::250:43ff:fe01:c0ab/64 scope link
valid_lft forever preferred_lft forever
firewalld.service
不记录任何警告。
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2019-01-30 13:17:31 GMT; 56min ago
Docs: man:firewalld(1)
Main PID: 509 (firewalld)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/firewalld.service
└─509 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
Jan 30 13:17:21 brick systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 30 13:17:31 brick systemd[1]: Started firewalld - dynamic firewall daemon.
我看到它firewalld
更喜欢与 NetworkManager 一起使用。我目前没有运行 NetworkManager,听起来这有点脆弱。
https://firewalld.org/documentation/concepts.html
如果不使用 NetworkManager,则有一些限制... 如果 firewalld 在网络已经启动后启动,则连接和手动创建的接口不会绑定到区域。
但是,自从安装firewalld
. 我检查了systemd
服务。 firewalld.service
开始了Before=network-pre.target
。 networking.service
开始了After=network-pre.target
。我已经确认firewalld
是在之前开始的networking.service
:
$ sudo journalctl -b -u networking -u firewalld
-- Logs begin at Sat 2019-01-26 04:15:01 GMT, end at Wed 2019-01-30 14:15:33 GMT. --
Jan 30 13:17:21 brick systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 30 13:17:31 brick systemd[1]: Started firewalld - dynamic firewall daemon.
Jan 30 13:17:31 brick systemd[1]: Starting Raise network interfaces...
Jan 30 13:17:37 brick systemd[1]: Started Raise network interfaces.
我没有手动重新启动网络或运行ifdown
/ ifup
,我没有运行ifplugd
。内核日志(如下)表明以太网链路已经启动,并且 IPv6 一直在运行,自启动以来一直在运行。
$ sudo dmesg|grep eth0
[ 4.082350] mv643xx_eth_port mv643xx_eth_port.0 eth0: port 0 with MAC address 00:50:43:01:c0:ab
[ 47.577570] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 49.981569] mv643xx_eth_port mv643xx_eth_port.0 eth0: link up, 1000 Mb/s, full duplex, flow control disabled
[ 49.991543] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
我什至没有使用 DHCP。eth0
in的配置/etc/network/interfaces
是
auto eth0
iface eth0 inet static
address 172.16.1.8
netmask 255.255.255.0
gateway 172.16.1.1
dns-nameservers 172.16.1.1
他们不是在开玩笑。
在没有 NetworkManager 的情况下,网页文档继续说您需要在两个不同的地方复制/保持配置之间的一致性。
另外,这两个地方中的第一个是
ifcfg
网络配置系统,在 Debian 上是不存在的。暗示,在 Debian上需要 NetworkManager :-)。(综合各种信息,很明显,只有在您在网络接口启动后
/etc/firewalld/
手动启动时才需要重复配置。这包括如果您重新启动,尽管您通常不希望重新启动。)firewalld
firewalld
firewalld
一方面,期望在问题中观察到的特定“主要工作”行为可能是公平的。根据其他文档和进一步的观察,您可以合理地期望将默认区域应用于您的界面。
在没有 NetworkManager 的 Debian 上,将接口分配给不同的区域可能会在正在运行的系统上工作,但在重新启动时无法工作。
您可能希望对防火墙有更多的“合理期望”。如果您可以使用“推荐”配置,则更令人放心,该配置在
firewalld
更改时可能会得到更好的测试,而不必依赖这种令人困惑的行为。我仍然对此的影响感到困惑,包括对红帽系统的影响。当它未能正确保存区域配置时,
firewall-cmd --permanent --add-interface=...
可以从字面上显示结果“ ”是非常令人困惑的!success
这是相关的报价
man firewalld
:作为实验,我尝试了提到的命令:
如果我的网络接口在
firewalld
. 但是我的网络接口在firewalld
.该
man
页面听起来像是firewalld
依赖于从ifcfg
启动网络接口时获取回调。但是ifcfg
Red Hat 的网络系统;它没有安装在我的 Debian 系统上。似乎 Debianfirewalld
软件包没有提供任何等价物。所以我们降级为“接口将由默认区域自动处理”。我跑去
sudo iptables-save
查看由firewalld
. 如果我没有手动运行firewall-cmd --add-interface...
,那么就没有提及eth0
。但如果我没看错的话,这些规则会使用默认区域的规则来处理此类数据包,作为后备。如果您没有在其中放置任何配置文件,
/usr/lib/firewalld/zones
或者/etc/firewalld/zones
您没有任何配置的区域。您所拥有的只是一个通用防火墙。根据您拥有的规则仍然有效,只是无法从公共切换到私有或您可能配置的任何其他区域并自动更改规则。此外,如果您使用 GUI 配置防火墙,只需检查这些目录以确保您实际设置的设置已到位。
如果您手动将配置文件放在那里,或者 GUI 设置管理器成功地将您配置的区域的文件放置到位,那么我不知道。
检查:
iptables -S
,有什么?如果列出了规则,则它是通用防火墙!您不需要firewalld来拥有防火墙,您可以手动编辑iptables。然后安装
iptables-persistent
,然后在每次编辑后保存您的规则netfilter-persistent save
大多数系统上的默认策略是 (PUBLIC):
然后您可以以链的形式详细说明规则。
句法:
示例:(允许默认端口上的所有传入 SSH 不是安全的良好做法)