我们都知道,在配置OpenVZ时需要打开核心的路由转换支持,并且通常设置Hardware Node和VPS使用相同网段的地址,以便外面的机器可以直接访问到VPS上。但在某些情况下,例如托管服务器中,通常只提供一个互联网IP地址,再购买一个IP地址是比较贵的。这时,我们可以把VPS设置为内网地址,然后通过iptables的NAT转换,让VPS与外界可以互相联通。
一、网络架构
当前IP配置是:
VPS:192.168.100.112/24
这样,VPS处在HW里面,使用私有网段地址,HW相当于网关的作用。
首先,需确认HW上已经打开路由转发,并关闭防火墙:
1
# service iptables stop
如果没有的话,请打开/etc/sysctl.conf的支持,并使用sysctl -p生效:
※ 初次使用,请务必关闭防火墙设定,否则,可能会带来很多意想不到的事情。
然后,确认HW和VPS之间可以互通:
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中的网络状态:
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 -t nat -A POSTROUTING -o eth0 -j SNAT –to 121.12.172.184
若HW使用浮动IP地址,请使用:
然后设定VPS的DNS地址:
File resolv.conf was modified
Saved parameters for CT 112
测试VPS能否出去:
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上设置:
同样的道理,想利用VPS提供http服务的话,可以在HW上设置iptables或squid反向代理实现转发。
四、NAT inside VE
实际上这不属于本次内容的话题,但由于概念有点相似,觉得有必要说说。
NAT inside VE,也就是在VPS中使用iptables的NAT功能。VPS作为一个相对独立的虚拟系统环境,是支持iptables防火墙设置的。但VPS可使用的iptables模块受限与HW环境,并由/etc/vz/vz.conf决定:
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]
Asianux 4.0 中KVM 使用桥接
使用HyperVM管理OpenVZ
把物理系统搬入OpenVZ中
配置Squid 2.6实现反向代理
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/111119.html