Total Pageviews

Sunday 29 January 2012

在openvz中共享IP的vps配置方法

我们都知道,在配置OpenVZ时需要打开核心的路由转换支持,并且通常设置Hardware Node和VPS使用相同网段的地址,以便外面的机器可以直接访问到VPS上。但在某些情况下,例如托管服务器中,通常只提供一个互联网IP地址,再购买 一个IP地址是比较贵的。这时,我们可以把VPS设置为内网地址,然后通过iptables的NAT转换,让VPS与外界可以互相联通。

一、网络架构
当前IP配置是:
引用
HW:121.12.172.184/255.255.255.0
VPS:192.168.100.112/24
这样,VPS处在HW里面,使用私有网段地址,HW相当于网关的作用。
首先,需确认HW上已经打开路由转发,并关闭防火墙:
引用
# cat /proc/sys/net/ipv4/ip_forward
1
# service iptables stop
如果没有的话,请打开/etc/sysctl.conf的支持,并使用sysctl -p生效:
引用
net.ipv4.ip_forward = 1

※ 初次使用,请务必关闭防火墙设定,否则,可能会带来很多意想不到的事情。
然后,确认HW和VPS之间可以互通:
引用
# ping 192.168.100.112 -c 1
PING 192.168.100.112 (192.168.100.112) 56(84) bytes of data.
64 bytes from 192.168.100.112: icmp_seq=1 ttl=64 time=0.044 ms

--- 192.168.100.112 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms
# vzctl exec 112 ping 121.12.172.184 -c 1
PING 121.12.172.184 (121.12.172.184) 56(84) bytes of data.
64 bytes from 121.12.172.184: icmp_seq=1 ttl=64 time=0.046 ms

--- 121.12.172.184 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms

二、查看VPS状态
以我使用的模板centos-5-x86_64-default-5.2-20081210.tar.gz为例,VPS中的网络状态:
引用
# vzctl enter 112
entered into CT 112
# ifconfig venet0:0
venet0:0   Link encap:UNSPEC   HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
           inet addr:192.168.100.112   P-t-P:192.168.100.112   Bcast:192.168.100.112   Mask:255.255.255.255
           UP BROADCAST POINTOPOINT RUNNING NOARP   MTU:1500   Metric:1

[root@112 /]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref     Use Iface
192.0.2.0       *               255.255.255.0   U     0       0         0 venet0
169.254.0.0     *               255.255.0.0     U     0       0         0 venet0
default         192.0.2.1       0.0.0.0         UG     0       0         0 venet0
# cat /etc/sysconfig/network
NETWORKING="yes"
GATEWAY="192.0.2.1"
HOSTNAME="112.linuxfly.org"
[root@112 /]# ping 192.0.2.1
connect: Invalid argument
可见,VPS通过venet0与HW互相访问。但网关192.0.2.1是一个虚拟出来的IP地址,VPS在启动时自动设定该值,不能直接修改。
(若使用route add/del命令修改VPS的默认网关,VPS和HW将中断网络连接)

三、使用HW iptables的NAT转发
在HW上执行(121.12.172.184为HW上eth0的对外IP地址):
# iptables -F -t nat
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 121.12.172.184
若HW使用浮动IP地址,请使用:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
然后设定VPS的DNS地址:
引用
# vzctl set 112 --nameserver 202.96.128.86 --save
File resolv.conf was modified
Saved parameters for CT 112
测试VPS能否出去:
引用
# vzctl exec 112 ping www.163.com -c 1
PING www.cache.idns.yeah.net (220.181.28.50) 56(84) bytes of data.
64 bytes from 220.181.28.50: icmp_seq=1 ttl=55 time=42.7 ms

--- www.cache.idns.yeah.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.757/42.757/42.757/0.000 ms
这时,VPS处在HW的后面,若需要从互联网访问VPS,则还需要根据应用转发端口。例如22服务,在HW上设置:
# iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.100.112:22
同样的道理,想利用VPS提供http服务的话,可以在HW上设置iptables或squid反向代理实现转发。

四、NAT inside VE
实际上这不属于本次内容的话题,但由于概念有点相似,觉得有必要说说。
NAT inside VE,也就是在VPS中使用iptables的NAT功能。VPS作为一个相对独立的虚拟系统环境,是支持iptables防火墙设置的。但VPS可使用的iptables模块受限与HW环境,并由/etc/vz/vz.conf决定:
引用
## IPv4 iptables kernel modules
IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length iptable_nat ip_nat_ftp"
其中,默认没有加入iptable_nat模块的。添加后,即可在VPS中使用了。

五、参考资料
在Virtuozzo 3.5版以上平台上,使用NAT功能节约SVPS的IP
Parallels Virtuozzo Containers - 虚拟机之家
ubuntu 下 openvz 与 virtualbox 的综合设置
Nat inside VE - openvpn again [message #32095]
Source URL: http://www.linuxfly.org/post/287/
来自:  http://hi.baidu.com/133782/blog/item/3d8d649664736f6154fb963f.html

No comments:

Post a Comment