如何防止 libvirt 为客户 NAT 网络添加 iptables 规则?

如何防止 libvirt 为客户 NAT 网络添加 iptables 规则?

如同Fedora 8 的 BugZilla 上的旧请求,我希望从那时起情况有所改变或者有人知道其他方法。

我想手动管理 iptables 规则 — 千篇一律的自动规则根本不适合我。这些规则似乎在网络启动和销毁时被添加和删除。有没有办法可以完全阻止添加这些规则,或者将脚本挂接到网络启动中,之后恢复默认规则。

目前,我正在使用一种非常粗鲁的方法cron,但我希望有更好的方法:

  *  *  *  *  * root    iptables-restore < /etc/sysconfig/iptables

答案1

好吧,我找到了一个适合我的答案:我回到学校,学会了用老式的方法做这件事。不需要使用 libvirt 的花哨网络功能,因为我可以:

  • 设置我自己的桥接网络(不连接到任何物理网络端口)
  • 在主机上使用 DHCP 服务器并在 iptables 中伪装
  • 编辑 libvirt 客户机配置文件以使用桥接器
  • 可以完全灵活地使用 iptables 配置安全性

答案2

无法修改这些规则,因为它们不在配置文件或脚本中,而是在源代码中。

但在 2016 年添加了“开放”网络“转发模式”。当为网络指定时,libvirt 不会为该网络生成任何 iptables 规则。参见错误 846810

因此,编辑您的网络(virsh net-edit)以<forward mode='open'/>

open类似route,但不会添加防火墙规则来启用或阻止任何此类流量。请参阅网络 XML 格式更多细节。

答案3

来自 Red Hat Bugzilla

首先,已经可以避免使用 iptables 规则 - 只需不请求基于 NAT 的虚拟网络即可。“默认”虚拟网络是故意基于 NAT 的。您可以随意删除不提供 NAT 的此虚拟网络和默认虚拟网络。

为了避免 cron 作业:

virsh net-destroy default
virsh net-undefine default

当然,正如@user83664 所写,您必须使用桥接网络或仅主机网络。

答案4

使用钩子来恢复你的 iptables 规则:

# The "hooks/" folder is not created by default by Libvirt
mkdir /etc/libvirt/hooks

# Libvirt supports multiple possible listeners like "daemon", "qemu", etc. 
# We are generating automatically all of these listeners in one go.
for f in daemon qemu lxc libxl network; do

  echo '#!/bin/sh
iptables-restore < /etc/sysconfig/iptables' > "/etc/libvirt/hooks/$f"
  chmod +x "/etc/libvirt/hooks/$f"

done

# Restarting Libvirt to confirm that rules are actually restored
service libvirtd restart

Iptables 规则将仅针对某些操作重新加载,但这足以使其变为静态。只有SIGHUPlibvirtd 的重新加载 ( ) 才会写入自己的规则,但它不会被任何系统脚本触发,因此除非您自己输入,否则不会发生:

service libvirtd reload

https://libvirt.org/hooks.html

更新: 最近的 libvirt 版本使用自己的链来插入规则,并且这些链是启动/停止网络和域所必需的。因此以前的方式不起作用。以下是这些链的iptables-restore格式:

*mangle
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
*filter
:LIBVIRT_FWI - [0:0]
:LIBVIRT_FWO - [0:0]
:LIBVIRT_FWX - [0:0]
:LIBVIRT_INP - [0:0]
:LIBVIRT_OUT - [0:0]
-A INPUT -j LIBVIRT_INP
-A FORWARD -j LIBVIRT_FWX
-A FORWARD -j LIBVIRT_FWI
-A FORWARD -j LIBVIRT_FWO
-A OUTPUT -j LIBVIRT_OUT
*nat
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT

要覆盖 libvirtd 规则,只需将您的自定义规则放在 libvirt-jump 规则 (-j LIBVIRT_XXX) 之前。当 libvirtd/network/domain 启动时,它只会在不存在跳转规则的情况下插入它们。因此,您只需在 libvirtd 启动之前加载您的规则(创建所有 libvirt 链并正确放置 libvirt-jump 规则)。从另一个角度来看 - 每次更改和加载新规则后,您都需要重新启动/重新加载 libvirtd - 以让它插入 libvirt 的规则。

相关内容