如何配置您的防火墙¶
Linux 防火墙基于 netfilter
。Incus 使用相同的子系统,这可能导致连接问题。
如果您在系统上运行防火墙,您可能需要对其进行配置以允许在受管理的 Incus 桥接和主机之间进行网络流量。否则,某些网络功能(DHCP、DNS 和外部网络访问)可能无法按预期工作。
您还可能看到您的防火墙(或其他应用程序)定义的规则与 Incus 添加的防火墙规则之间的冲突。例如,如果您的防火墙在 Incus 守护程序之后启动,它可能会擦除 Incus 规则,这可能会中断与实例的网络连接。
xtables
与 nftables
¶
有不同的用户空间命令可以向 netfilter
添加规则:xtables
(iptables
用于 IPv4 和 ip6tables
用于 IPv6)和 nftables
。
xtables
提供一个有序的规则列表,如果多个系统添加和删除列表中的条目,这可能会导致问题。 nftables
添加了将规则分离到命名空间的能力,这有助于分离来自不同应用程序的规则。但是,如果一个数据包在一个命名空间中被阻止,那么另一个命名空间就不可能允许它。因此,一个命名空间中的规则仍然会影响另一个命名空间中的规则,并且防火墙应用程序仍然会影响 Incus 网络功能。
如果您的系统支持并使用 nftables
,Incus 会检测到这一点并切换到 nftables
模式。在这种模式下,Incus 将其规则添加到 nftables
中,使用它自己的 nftables
命名空间。
使用 Incus 的防火墙¶
默认情况下,受管理的 Incus 桥接会添加防火墙规则以确保完整的功能。如果您没有在系统上运行其他防火墙,您可以让 Incus 管理其防火墙规则。
要启用或禁用此行为,请使用 ipv4.firewall
或 ipv6.firewall
配置选项。
使用其他防火墙¶
其他应用程序添加的防火墙规则可能会干扰 Incus 添加的防火墙规则。因此,如果您使用其他防火墙,您应该禁用 Incus 的防火墙规则。您还必须配置您的防火墙以允许实例和 Incus 桥接之间的网络流量,以便 Incus 实例可以访问 Incus 在主机上运行的 DHCP 和 DNS 服务器。
请参阅以下部分,了解有关如何禁用 Incus 的防火墙规则以及如何分别正确配置 firewalld
和 UFW 的说明。
禁用 Incus 的防火墙规则¶
运行以下命令以阻止 Incus 为特定网络桥接设置防火墙规则(例如,incusbr0
)
incus network set <network_bridge> ipv6.firewall false
incus network set <network_bridge> ipv4.firewall false
firewalld
:将桥接添加到受信任区域¶
为了允许流量进出firewalld
中的 Incus 桥接,将桥接接口添加到trusted
区域。要永久执行此操作(以便它在重启后仍然有效),请运行以下命令
sudo firewall-cmd --zone=trusted --change-interface=<network_bridge> --permanent
sudo firewall-cmd --reload
例如
sudo firewall-cmd --zone=trusted --change-interface=incusbr0 --permanent
sudo firewall-cmd --reload
警告
以上给出的命令展示了一个简单的示例配置。根据你的用例,你可能需要更高级的规则,并且示例配置可能会无意中引入安全风险。
UFW:为桥接添加规则¶
如果 UFW 有一个规则用于丢弃所有未识别的流量,它会阻止进出 Incus 桥接的流量。在这种情况下,你必须添加规则以允许进出桥接的流量,以及允许转发到它的流量。
为此,请运行以下命令
sudo ufw allow in on <network_bridge>
sudo ufw route allow in on <network_bridge>
sudo ufw route allow out on <network_bridge>
例如
sudo ufw allow in on incusbr0
sudo ufw route allow in on incusbr0
sudo ufw route allow out on incusbr0
警告
以上给出的命令展示了一个简单的示例配置。根据你的用例,你可能需要更高级的规则,并且示例配置可能会无意中引入安全风险。
以下是一个示例,用于限制来宾对主机访问权限(仅限 DHCP 和 DNS),并允许所有出站连接的更严格的防火墙规则
# allow the guest to get an IP from the Incus host
sudo ufw allow in on incusbr0 to any port 67 proto udp
sudo ufw allow in on incusbr0 to any port 547 proto udp
# allow the guest to resolve host names from the Incus host
sudo ufw allow in on incusbr0 to any port 53
# allow the guest to have access to outbound connections
CIDR4="$(incus network get incusbr0 ipv4.address | sed 's|\.[0-9]\+/|.0/|')"
CIDR6="$(incus network get incusbr0 ipv6.address | sed 's|:[0-9]\+/|:/|')"
sudo ufw route allow in on incusbr0 from "${CIDR4}"
sudo ufw route allow in on incusbr0 from "${CIDR6}"
防止 Incus 和 Docker 的连接问题¶
在同一主机上运行 Incus 和 Docker 会导致连接问题。这些问题的一个常见原因是 Docker 将全局 FORWARD 策略设置为drop
,这会阻止 Incus 转发流量,从而导致实例丢失网络连接。有关详细信息,请参阅 Docker on a router。
有多种方法可以解决这个问题
- 卸载 Docker
防止此类问题的最简单方法是从运行 Incus 的系统中卸载 Docker,然后重启系统。你可以将 Docker 运行在 Incus 容器或虚拟机中。
- 启用 IPv4 转发
如果无法卸载 Docker,则在 Docker 服务启动之前启用 IPv4 转发将阻止 Docker 修改全局 FORWARD 策略。Incus 桥接网络通常启用此设置。但是,如果 Incus 在 Docker 之后启动,则 Docker 已经修改了全局 FORWARD 策略。
警告
启用 IPv4 转发可能会导致你的 Docker 容器端口从本地网络上的任何机器访问。根据你的环境,这可能是不希望的。有关更多信息,请参阅 local network container access issue。
要在 Docker 启动之前启用 IPv4 转发,请确保以下
sysctl
设置已启用net.ipv4.conf.all.forwarding=1
重要
你必须使此设置在主机重启后保持有效。
一种方法是使用以下命令将文件添加到
/etc/sysctl.d/
目录echo "net.ipv4.conf.all.forwarding=1" > /etc/sysctl.d/99-forwarding.conf systemctl restart systemd-sysctl
- 允许出站网络流量流
如果你不希望 Docker 容器端口可能从本地网络上的任何机器访问,则可以应用 Docker 提供的更复杂的解决方案。
使用以下命令明确允许来自你的 Incus 管理桥接接口的出站网络流量流
iptables -I DOCKER-USER -i <network_bridge> -j ACCEPT iptables -I DOCKER-USER -o <network_bridge> -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
例如,如果你的 Incus 管理桥接名为
incusbr0
,则可以使用以下命令允许出站流量流iptables -I DOCKER-USER -i incusbr0 -j ACCEPT iptables -I DOCKER-USER -o incusbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
重要
你必须使这些防火墙规则在主机重启后保持有效。如何执行此操作取决于你的 Linux 发行版。