如何使用 firewall-cmd 工具(新的 firewalld)创建防火墙规则,以便限制特定网络仅访问一项服务,并允许一个区域中的所有服务。
例如:
我只有一个接口 eno1,它与公共区域相关联。该区域启用了 Http 和 https 服务。我想在该区域启用 ssh 访问,但我想限制对网络的 ssh 访问(例如 100.0.0.0/8)
做这个的最好方式是什么?
我正在尝试使用 FirewallD 来限制网络上其他机器对 CentOS 服务器的访问。它有一个单一的网络接口,并且在公共区域中运行。假设此服务器的 IP 地址为 10.10.1.20。
我想要做的是只允许 IP 地址为 10.10.1.125 和 10.10.1.126 的机器能够连接(ssh 和 https)到该服务器。其他任何 ip 地址都不应该能够连接到该服务器(甚至知道它存在)。
我尝试使用 FirewallD 的丰富规则如下(10.10.1.20)
sudo firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.10.1.0/24" drop'
sudo firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.10.1.125" accept'
sudo firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.10.1.126" accept'
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用。我无法从 10.10.1.125 或 10.10.1.126 建立到 10.10.1.20 的 ssh 连接。
我尝试以相反的顺序输入规则,但它仍然不起作用。
有人可以帮我吗?在应用我上面写的规则之前,我是否需要将区域从公共区域更改为更严格的区域,例如 drop ?
在 FirewallD 附带的 CentOS 7 中,启用 HTTP 访问很容易:
firewall-cmd --permanent --zone=public --add-service=httpRun Code Online (Sandbox Code Playgroud)
然而,
firewall-cmd --permanent --zone=public --add-service=ftpRun Code Online (Sandbox Code Playgroud)
不起作用:规则适用,但除禁用 FirewallD 外,我无法通过任何方式访问 FTP。
一些诊断信息:
zgrep FTP /proc/config.gz
Run Code Online (Sandbox Code Playgroud)
CONFIG_NF_CONNTRACK_FTP=y
CONFIG_NF_CONNTRACK_TFTP=y
CONFIG_NF_NAT_FTP=y
CONFIG_NF_NAT_TFTP=y
Run Code Online (Sandbox Code Playgroud) 我一直在努力解决一些奇怪的(对我来说)防火墙错误,但现在看到了我想要的防火墙行为。但是,令我困惑的是,有效的似乎是区域drop和区域的混合。trusted
[root@douglasii ~]# firewall-cmd --get-active-zones
drop
interfaces: eth0 veth879317c vethaff7c39 vethb2fec6e
trusted
sources: 192.168.0.0/16
[root@douglasii ~]# firewall-cmd --zone=drop --list-all
drop (default, active)
interfaces: eth0 veth879317c vethaff7c39 vethb2fec6e
sources:
services: ssh
ports: 443/tcp 80/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@douglasii ~]# firewall-cmd --zone=trusted --list-all
trusted
interfaces:
sources: 192.168.0.0/16
services: ssh
ports: 443/tcp 80/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Run Code Online (Sandbox Code Playgroud)
我的印象是您使用 一次设置一个区域set-default-zone。我发现无论我为哪一个这样做,都会获得“活跃”标签。难道不是这样吗?多个防火墙区域可以在任何给定时间处于活动状态吗?都是同时申请吗?什么是默认区域?通过阅读FirewallD 上的文档,我并不清楚。
我在这台机器上安装了 Fedora,它完全是一个网关/防火墙系统。
安装后,我运行了 ' yum upgrade',所以它应该是最新的 Fedora 21 - 我故意有点落后(不是 Fedora 22),所以任何问题都有望得到解决(现在意识到可能我应该有去 Fedora 20 了吗?!)...
一启动,我就用它们各自的 IP 地址配置了盒子中的两个 NIC,重新启动,确认它们没问题,然后开始“防火墙”设置。首先,我跑了:
# firewall-cmd --list-all-zones
Run Code Online (Sandbox Code Playgroud)
我确认 firewalld 使用的接口名称与其他工具一致(与 Fedora 的过去版本不同,例如 19 - 请参阅请求的 FC19 FirewallD 调试帮助:端口不转发)
为了将接口放入正确的区域,我然后运行:
firewall-cmd --permanent --zone=external --change-interface=enp2s0
firewall-cmd --permanent --zone=internal --change-interface=enp5s4
Run Code Online (Sandbox Code Playgroud)
..然后继续尝试设置端口转发等。有几个步骤,例如打开端口,然后转发它。然而,这些都没有奏效。经过一番挖掘,我找到了这篇文章,日期仅在几天前,所以我认为它是最新的 - http://www.certdepot.net/rhel7-get-started-firewalld/ - 并按照其建议进行编辑/etc/sysctl.conf和添加一行阅读net.ipv4.ip_forward=1并用 激活它# sysctl -p,然而,不幸的是,事情实际上“倒退了”......
以前,尝试与转发端口的连接挂起,但现在它们正在返回:
ssh: connect to host 167.101.97.2 port 6543: No route to host
Run Code Online (Sandbox Code Playgroud)
所以,我试图通过取消端口转发和对 sysctl.conf 的编辑来恢复正常,但事情并没有回到“原始”!
令人难以置信的是,我重新启动了,一切都设置为默认值,只是尽可能地安装条件 - 除了那些区域更改;他们会造成什么伤害?!但是当系统恢复时,接口已经回到默认区域!
然后我又重新尝试了一遍。不!无论我做什么,重新启动后接口都停留在“FedoraServer”区域。我已经在命令行中的几个不同位置尝试了 --permanent 。每次响应都是“成功”,然而,每次结果都是它在重新启动后无法生存,即使这是重新启动之间在系统上所做的唯一事情。 …
我想使用 firewalld 创建一个规则,该规则使用标准用户名或用户 ID 以及一个其他模块标准。
在 iptables 中,我认为你可以做这样的事情
iptables -A OUTPUT -m owner --uid-owner <UID> -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
(并且您可以将其他 -m 模块或 -p 协议添加到同一命令中)
但是我阅读了firewall-cmd联机帮助页,但找不到如何制定相同类型的规则。即使是“丰富的规则”似乎也没有这种支持。我必须使用“直接”功能吗?我不太明白它的语法。尤其让我担心的是这些没有任何回报!
firewall-cmd --direct --get-chains ipv4 filter
firewall-cmd --direct --get-rules ipv4 filter OUTPUT
firewall-cmd --direct --get-rules ipv4 filter INPUT
Run Code Online (Sandbox Code Playgroud)
当然iptables -L显示我有这些表、链和规则。
那么我如何使用firewalld为所有者添加一个永久规则,也许还有一个标准?
我正在使用来自 AWS MarketPlace 的这张图片。问题是 centos 7 应该附带firewalld而不是 iptables。但是firewalld不是安装在上面而是iptables安装了。这是为什么。centos 提供的这个特定图像还有哪些其他变化,这些图像应该是常规的 centos 7 图像。
从 iptables 迁移到firewalld 并使用firewall-cmd 更新规则后,我的服务被正确过滤。然后我使用 Docker 将所有服务移至容器,并使用 docker-compose 运行所有内容。
我的默认区域是“公共”。我已手动将 docker0、我的外部(以太网)接口以及 Docker 容器似乎通过 (br-304604a31e79) 与外界通信的接口添加到“公共”区域。我已运行命令将带或不带标志的接口移至“公共”区域--permanent。
当我用来nmap扫描我的服务器时,Docker 容器中运行的服务仍然可以访问(仍然是“开放”,而不是“过滤”)。
为什么 Firewalld 不过滤在我的 Docker 容器中运行的服务?
所以是的,配置 Fedora 20 的 firewall-cmd。试图将入站流量限制为仅 http、https 和 ssh。但是,机器仍然响应 ping,并且 --get-service 命令显示了我不使用的东西的清单。
为什么会断线?
--get-service 命令是否准确,或者 --list-services 命令是否准确?
如果是后者,为什么ping通?
[root@build-node httpd]# firewall-cmd --get-service
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@build-node httpd]# firewall-cmd --get-active-zone
public
interfaces: eth0 eth1 eth2
[root@build-node httpd]# firewall-cmd …Run Code Online (Sandbox Code Playgroud) 我在使用 firewalld 的 centos 7 上。
我已经配置了 firewalld,所以 443 是打开的:
$ sudo firewall-cmd --zone=public --permanent --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: couchdb2 dhcpv6-client http https ssh
ports: 443/tcp 5984/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
$ sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
Warning: ALREADY_ENABLED: 443:tcp
success
Run Code Online (Sandbox Code Playgroud)
显然端口 443 是开放的,但是......
$ curl https://127.0.0.1:443
curl: (7) Failed connect to 127.0.0.1:443; Connection refused
Run Code Online (Sandbox Code Playgroud)
我还使用http://www.yougetsignal.com/tools/open-ports/ 上的网络工具对其进行了测试
我输入我的 IP 地址和端口 443 并得到: Closed Port 443 is closed on {my-ip} …