我只是在尝试使用 OpenVZ,之前没有虚拟化经验。因此,我在理解这个虚拟基础架构时遇到以下问题:
我有一台物理 Linux 服务器,它有一个 IP 地址(例如 1.2.3.4),并且我在 OpenVZ 中运行了 2 个虚拟服务器实例。我想通过 ssh 访问这两个虚拟服务器。那么我应该使用哪个 IP 地址呢?
我总共需要 3 个 IP 地址吗?
- 一个用于物理主服务器
- 一个用于第一个虚拟服务器,
- 一个用于第二个虚拟服务器
或者 openVZ 如何决定采用哪个实例?
答案1
每个 OpenVZ VM 都会分配有自己的 IP 地址,并运行自己的 SSH 守护程序,并在 VM 的 IP 地址上进行监听。当您想要通过 SSH 连接到主机时,请使用主机的 IP 地址;当您想要通过 SSH 连接到某个客户机时,请使用客户机的 IP 地址。(当我说“IP 地址”时,您也可以将其替换为“引用 IP 地址的 DNS 条目”)。
在大多数方面(至少在您学习曲线的早期阶段),您可以将虚拟机视为在日常使用方面与真实的物理机器一样。
答案2
我强烈建议研究硬件节点上的 DNAT 设置。
这是我的工作设置(有一些模糊的东西):
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# DHCP
-A INPUT -i vzpb -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
-A OUTPUT -o vzpb -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
# Allow ping to and from
-A INPUT -p icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp --icmp-type 0 -j ACCEPT
-A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
-A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
# All new DROP
-A INPUT -m state --state NEW -j REJECT
-A OUTPUT -m state --state NEW -j REJECT
# All non-tcp DROP
-A INPUT ! -p tcp -j REJECT
-A OUTPUT ! -p tcp -j REJECT
# username xsmith = 1234 (XX State University)
#-A INPUT -m owner --uid-owner 1234 -j REJECT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# SNAT (to give Internet access for the local containers)
-A POSTROUTING -p tcp -o vzpb -j SNAT --to-source 1.2.3.4
# upd is needed for DNS
-A POSTROUTING -p udp -o vzpb -j SNAT --to-source 1.2.3.4
# DNAT SSH
-A PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 192.168.1.2
# SNAT --to-source NOT required
# DNAT Web
-A PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 192.168.1.3
-A POSTROUTING -p tcp -d 192.168.1.2 --dport 80 -j SNAT --to-source 192.168.1.1
# --to-source required
COMMIT
- 硬件节点公网:1.2.3.4
- 硬件节点本地:192.168.1.1
- 容器本地:192.168.1.2
- 你可能需要删除所有的“-o vzpb”和“-i vzpb”,因为我有 veth,而你可能有默认的 venet(请阅读http://wiki.openvz.org/Differences_between_venet_and_veth)
另外,将其放入硬件节点的 /etc/sysctl.conf 并运行sysctl -p
:
### OpenVZ settings (2011-01-25)
# from http://wiki.openvz.org/VEs_and_HNs_in_different_subnets
# On Hardware Node we generally need packet
# forwarding enabled and proxy arp disabled
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.ip_forward=1
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
# Enables the magic-sysrq key
kernel.sysrq = 1
# TCP Explict Congestion Notification
net.ipv4.tcp_ecn = 0
# we do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
选项 2
为了更加灵活和安全,请考虑从硬件节点中删除所有公共 IP,并将上述 NAT 配置放入专用于 NAT 的容器中。该容器将需要一个公共 IP(可以是该机器上唯一的公共 IP)。
NAT 容器将需要 MAC 级别的公共网络接口访问,因此您需要从 VENET 切换到 VETH: http://wiki.openvz.org/Differences_between_venet_and_veth
注意:如果您正确地为网桥设置防火墙,那么 veth 会非常安全。
要做到 veth 你需要多读这个页面: http://wiki.openvz.org/Veth