php apache centos HTML5 开源 Firefox 程序员 Android shell mysql nginx Python linux Windows java wordpress google 微软 Ubuntu linux命令

如何避免 Xen VPS 用户自己修改 IP 地址

作为 Xen VPS 服务商,我们分配独立的 ip 地址给 VPS,我们不希望 VPS 用户自己能随便修改 IP 地址,因为这样有可能和其他用户的 IP 地址造成冲突,而且造成管理上的不便,所以需要绑定 IP 给某个 VPS.

解决这个问题的办法有很多,从路由器、防火墙、操作系统、Xen 等层面都可以做限制。这里介绍的两个简单方法都是从 dom0 入手:一个是在 dom0 上利用 Xen 配置;一个是在 dom0 上利用 iptables.

利用 Xen 配置

Xen 上有个 antispoof 配置选项就是来解决这个问题的,不过默认配置没有打开这个 antispoof 选项,需要修改:

# vi /etc/xen/xend-config.sxp
...
(network-script 'network-bridge antispoof=yes')
...

修改 /etc/xen/scripts/vif-common.sh 里面的 frob_iptable() 函数部分,加上 iptables 一行:

# vi /etc/xen/scripts/vif-common.sh
function frob_iptable()
{
    ...
    iptables -t raw "$c" PREROUTING -m physdev --physdev-in "$vif" "$@" -j NOTRACK
}

修改完 Xen 配置后还需要修改 domU 的配置,给每个 domU 分配固定 IP 和 MAC 地址,还有 vif 名字:

# vi /etc/xen/vm01
...
vif = [ "vifname=vm01,mac=00:16:3e:7c:1f:6e,ip=172.16.39.105,bridge=xenbr0" ]
...

很多系统上 iptables 在默认情况下都不会理会网桥上的 FORWARD 链,所以需要修改内核参数确保 bridge-nf-call-iptables=1,把这个修改可以放到 antispoofing() 函数里,这样每次 Xen 配置网络的时候会自动配置内核参数:

# vi /etc/xen/scripts/network-bridge
antispoofing () {
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
...
}

修改完毕后测试的话需要关闭 domU,重启 iptables 和 xend 服务,再启动 domU.

# xm shutdown vm01
# /etc/init.d/iptables restart
# /etc/init.d/xend restart
# xm create vm01

上面的方法在 Xen 3.x 上 测试有效,有人说在 Xen 4.x 上行不通,我们下面将要介绍的方法绕开了 Xen 配置,直接从 iptables 限制,在 Xen 3.x 和 Xen 4.x 上应该都可以用。

利用 iptables

首先在 dom0 上确定 iptables 已经开启,这里需要注意的是一定要在每个 domU 的配置文件中的 vif 部分加上 vifname, ip, mac,这样才能在 iptables 规则里面明确定义:

# /etc/init.d/iptables restart

# vi /etc/xen/vm01
...
vif = [ "vifname=vm01,mac=00:16:3e:7c:1f:6e,ip=172.16.39.105,bridge=xenbr0" ]
...

# vi /etc/iptables-rules
*filter
:INPUT accept [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# The antispoofing rules for domUs
-A FORWARD -m state --state RELATED,ESTABLISHED -m physdev --physdev-out vm01 -j ACCEPT
-A FORWARD -p udp -m physdev --physdev-in vm01 -m udp --sport 68 --dport 67 -j ACCEPT
-A FORWARD -s 172.16.39.105/32 -m physdev --physdev-in vm01 -j ACCEPT
-A FORWARD -d 172.16.39.105/32 -m physdev --physdev-out vm01 -j ACCEPT
# If the IP address is not allowed on that vif, log and drop it.
-A FORWARD -m limit --limit 15/min -j LOG --log-prefix "Dropped by firewall: " --log-level 7
-A FORWARD -j DROP
# The access rules for dom0
-A INPUT -j ACCEPT
COMMIT

# iptables-restore < /etc/iptables.rules

当然,别忘了:

# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

延伸阅读

评论