我有一台 Xen 服务器,上面有几台虚拟机,与局域网上的普通 PC 并排放置。虚拟机托管用于 Web 访问的内容。Httpd 就是其中之一,因此我们以它为例。
我想这样配置 iptables(或者我的网络):
允许环回
-A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT
允许端口 80 与 WAN(Web)的入站/出站连接。
允许端口 foo 进出 LAN 上白名单计算机的流量,同时拒绝 LAN 的其余部分。
#allow one ip with port foo -A INPUT -i eth0 -p tcp -s 192.168.0.w --dport foo -m state --state NEW,ESTABLISHED -j ACCEPT -A OUTPUT -o eth0 -p tcp --sport foo -m state --state ESTABLISHED -j ACCEPT #block the rest of the lan -A INPUT -i eth0 -m iprange --src-range 192.168.1.x-192.168.1.y -j DROP -A OUTPUT -o eth0 -m iprange --src-range 192.168.1.m-192.168.1.n -j DROP
拒绝所有其他类型的流量。
-P INPUT DROP -P OUTPUT DROP -P FORWARD DROP
基本我希望我的虚拟机只能与 Web 和其他虚拟机通信(在 LAN 上的某个块范围内)。仅使用 iptables 可以实现吗?如果不行,我该如何实现?
我当前的 iptables 如下所示(其中大部分是由 centos 预先生成的):
# Generated by iptables-save v1.4.7 on Tue Mar 12 10:43:43 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Mar 12 10:43:43 2013
目前,我可以使用开发箱访问内容,但我希望强化网络,保护非服务器 PC。而且,我没有足够的 iptables 经验来信任自己。
提前致谢。PS:我还需要考虑 Dom0 和虚拟机之间的网络通信。
答案1
乍一看,建议的规则似乎不错。但不要忘记允许 DNS 流量 - 目标 UDP 端口 53 到达 WAN 上的 DNS 服务器。
答案2
也许我回答了自己的问题,正在和朋友讨论这个问题。这是我们想出的办法,希望对大家有帮助。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
#Loopback
-A INPUT -i lo -j ACCEPT
#DNS Servers
-A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
#SSH conditional
-A INPUT -i eth0 -p tcp -s 192.168.0.x --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -d 192.168.0.x --sport 22 -m state --state ESTABLISHED -j ACCEPT
#communicate with some other server on the lan
-A INPUT -i eth0 -p tcp -s 192.168.0.y --dport yp -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -d 192.168.0.y --sport yp -m state --state ESTABLISHED -j ACCEPT
#HTTP
-A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
#HTTPS
-A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
#Drop other output to my LAN
-A OUTPUT -d 192.168.0.1/24 -j REJECT
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT