0

我正在编写一个 bash 脚本来为 Xen 添加简单的防火墙。

这是实际的防火墙配置:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ha-cluster
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

我想为我的每个虚拟机添加一个新链(每个虚拟机都有一个名为 vif1.0、vif2.0 等的虚拟接口)。输出接口(桥接)是xenbr0。

这是我所做的(例如阻止 ping 'in'to domU1, vif1.0):

iptables -N domUFirewall
iptables -I FORWARD -j domUFirewall
iptables -I INPUT -j domUFirewall
iptables -A domUFirewall -i vif1.0 -p icmp -j DROP

但是..它不起作用,我仍然能够ping入/出domU。

一定是真的“愚蠢”,但我不知道出了什么问题。

有什么线索吗?

谢谢

4

1 回答 1

2

由于您将 XEN 与桥接网络一起使用,因此在普通 iptables 命令影响它们之前,数据包会被拦截。因此,您可能需要使用该ebtables命令以您想要的方式影响数据包路由。

下面留下的原始答案适用于其他配置,但不适用于具有桥接网络的 XEN。

我将假设 IP 地址vif1.0是 192.168.1.100。

我会重做逻辑,不检查输入设备,而是按 IP 地址检查。在输入链上,数据包来自(比如说) device eth0,而不是来自vif1.0。因此,这条规则:

iptables -I INPUT -i vif1.0 -j domUFirewall

我之前提出的永远不会匹配任何数据包。但是,如果您执行以下操作,它应该执行您想要的操作:

iptables -I INPUT -d 192.168.1.100 -j domUFirewall

在这种情况下,链domUFirewall由以下方式设置:

iptables -N domUFirewall
iptables -F domUFirewall
iptables -A domUFirewall -p icmp -j DROP

如果给定的链是针对单个设备的,那么您希望在跳入链之前-j chainName根据带有“ ”操作的规则进行此检查。然后,在链本身中,您无需检查设备或 IP 地址。

其次,我总是会刷新(清空)脚本中的链,以防万一你重新运行脚本。请注意,当您重新运行脚本时,您可能会-N在线收到投诉。没关系。

还有其他方法可以做到这一点,但举一个不同的例子,我需要具体了解你的虚拟机是如何设置的——桥接网络?NAT?等等。但是我在这里给出的例子应该可以在任何这些模式下工作。

以下是一些对未来有用的链接:

于 2009-03-17T15:21:53.797 回答