我正在尝试在我的 xen 主机服务器上设置 IPTABLES,它将阻止对同一台机器上的 xen 客户端的传入和/或传出访问。具体来说,我需要阻止到特定容器的传出端口 25 流量和传入端口 53 流量。
常规 IPTABLE 规则似乎只会影响流向主机的流量,而不会影响 xen 客户端。
对于我的服务器来说,eth0 是内部网络,eth1 是外部网络。
以下规则集看起来应该可以工作,但容器根本不受到影响:
iptables -A OUTPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED –sport 25 -d -j REJECT iptables -A INPUT -p tcp -m state –state NEW,ESTABLISHED,RELATED –dport 53 -d -j REJECT iptables -A INPUT -p udp -m state –state NEW,ESTABLISHED,RELATED –dport 53 -d -j REJECT
所以基本上,我如何设置适用于 xen 客户端而不是 xen 主机的 IPTABLE 规则?
谢谢
答案1
此规则在我的安装中有效:
iptables -I FORWARD 1 -d [client-ip] -p tcp -m tcp --dport 53 -j DROP
iptables -I FORWARD 1 -d [client-ip] -p udp -m udp --dport 53 -j DROP
请注意,netfilter 从上到下读取规则,如果您有一条规则允许所有流量到达上面的这个客户端(iptables -A添加规则结尾表格中的“新规”将无法达成,也不会生效。
我不明白为什么你要使用“状态”模块,如果你列出了所有有效状态?它只是占用 CPU 时间,在我看来没有任何效果。
接下来,我不确定阻止来自端口 25 的流量的目的是什么。如果你的客户端发送ab 电子邮件,他连接到远程服务器的端口 25,但使用其中一个本地端口(默认为 32k..64k)。你能解释一下,你想要得到什么结果吗?
答案2
您可以使用 iptables 的“physdev”模块。但请记住,xen 会在客户机启动时插入(即,将其放在防火墙规则列表的开头)完全访问规则。因此,您应该调整 xen 逻辑。
我自己为 xen 主机配备了简单的防火墙,其配置如下:
#!/bin/bash
# ====== Public settings ======
LAN='192.168.0.0/24'
WAN='0.0.0.0/0.0.0.0'
HOST_IP='192.168.0.20'
ADMIN_PORTS='22,873'
DB_IP='192.168.0.6'
MYSQL_PORTS='3306'
DB_PORTS="$ADMIN_PORTS,$MYSQL_PORTS"
WS_IP='192.168.0.10'
WS_PORTS="$ADMIN_PORTS,80"
WS2_IP='192.168.0.9'
WS2_PORTS="$ADMIN_PORTS,8082"
XP_IP='192.168.0.7'
XP_PORTS="$ADMIN_PORTS,3389,6666,6688,12345"
# ====== Private settings ======
IPTABLES='/sbin/iptables'
clearTables()
{
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t filter -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
}
listTables(){
for table in filter nat mangle; do
echo "=========== $table ============";
$IPTABLES -t $table -n -L;
echo;
done
}
clearTables
PHYSDEV='-m physdev --physdev-is-bridged'
# ====== Firewall logic ======
#========= Common permissions for host machine ==========
$IPTABLES -A FORWARD $PHYSDEV -p ALL -s $HOST_IP -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -p ALL -d $HOST_IP -j ACCEPT
# ======= For all (guests) =======
# DNS
$IPTABLES -A FORWARD $PHYSDEV -p udp --dport 53 -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -p udp --sport 53 -j ACCEPT
# ping
#$IPTABLES -A FORWARD $PHYSDEV -p icmp -s $DB_IP -d $LAN -j REJECT
$IPTABLES -A FORWARD $PHYSDEV -p icmp -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -p icmp -j ACCEPT
#======= DB server ======
# LAN <--> admin ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $DB_IP -p tcp -m multiport --dports $ADMIN_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $DB_IP -d $LAN -p tcp -m multiport --sports $ADMIN_PORTS -j ACCEPT
# MySQL between WS and DB
$IPTABLES -A FORWARD $PHYSDEV -s $WS_IP -d $DB_IP -p tcp -m multiport --dports $MYSQL_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $DB_IP -d $WS_IP -p tcp -m multiport --sports $MYSQL_PORTS -j ACCEPT
#======== WS ========
# LAN <--> admin ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $WS_IP -p tcp -m multiport --dports $ADMIN_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $WS_IP -d $LAN -p tcp -m multiport --sports $ADMIN_PORTS -j ACCEPT
# HTTP-порт
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $WS_IP -p tcp -m multiport --dports $WS_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $WS_IP -d $LAN -p tcp -m multiport --sports $WS_PORTS -j ACCEPT
#======== WS2 =======
# LAN <--> admin ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $WS2_IP -p tcp -m multiport --dports $ADMIN_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $WS2_IP -d $LAN -p tcp -m multiport --sports $ADMIN_PORTS -j ACCEPT
# HTTP-ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $WS2_IP -p tcp -m multiport --dports $WS2_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $WS2_IP -d $LAN -p tcp -m multiport --sports $WS2_PORTS -j ACCEPT
#======== WIN_XP =======
# LAN <--> admin ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $XP_IP -p tcp -m multiport --dports $ADMIN_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $XP_IP -d $LAN -p tcp -m multiport --sports $ADMIN_PORTS -j ACCEPT
# HTTP-ports
$IPTABLES -A FORWARD $PHYSDEV -s $LAN -d $XP_IP -p tcp -m multiport --dports $XP_PORTS -j ACCEPT
$IPTABLES -A FORWARD $PHYSDEV -s $XP_IP -d $LAN -p tcp -m multiport --sports $XP_PORTS -j ACCEPT
#========== Common ban to LAN for guests ==========
$IPTABLES -A FORWARD $PHYSDEV -p ALL -d $LAN -j DROP
$IPTABLES -A FORWARD $PHYSDEV -p ALL -s $LAN -j DROP
答案3
我很少尝试阻止 DomU VM,所以我无法确切告诉您该怎么做。但请参考此页面:
http://wiki.xensource.com/xenwiki/XenNetworking
尤其是“桥接”部分。那里有一些iptables
例子。