我有一个带有单个公共IP的proxmox主机和一些安装了网络服务器和多个域的虚拟机,第一个VM是带有haproxy的代理,它将请求转发到其他VM,在proxmox主机中我有这个iptables脚本:
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 22100 -j DNAT --to-destination 192.168.1.100:22
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 22101 -j DNAT --to-destination 192.168.1.101:22
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 22102 -j DNAT --to-destination 192.168.1.102:22
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 22103 -j DNAT --to-destination 192.168.1.103:22
iptables-save > /etc/iptables.rules
内部lan是192.168.1.0,接口eth0有公共ip,代理是192.168.1.100,其他机器是101、102、103等。
在另一个虚拟机中,我安装了一个网站,如果我从外部连接,则该网站可以工作,而不是curl www.mydomain.com
从我拥有的同一虚拟机启动curl: (7) Failed connect to www.mydomain.com:80
;连接被拒绝,我认为是iptables的问题
答案1
终于找到了解决方案或解决方法。我不知道是什么原因造成的(它与一些 Proxmox 或 Debian frewall 或其他东西有关),我使用普通 OpenVZ 的旧设置工作得很好。
问题是当在同一服务器(相同外部 IP)上的另一个 VM B 使用 VM A 上的服务时。如果我在另一台服务器上使用代理,则一切顺利,因为另一台代理的 IP 与服务器的 IP 不同。
因此,不要让对服务的调用超出服务器的范围。我使用 dsnmasq 在服务器上设置 DNS 服务。来自 VM B 的调用现在会到达服务器上的 DNS 并获取 VM A 的 IP。不要忘记将每个 VM 的名称服务器设置为本地服务器!
该解决方案还有一个额外的好处,即通过缓存服务器上虚拟机的所有 DNS 调用来提高速度。
详细说明:
在服务器上安装dnsmasq
# apt-get install dnsmasq
# update-rc.d dnsmasq enable
配置 dnsmasq 作为 DNS 服务器和缓存:
# cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
# vi /etc/dnsmasq.conf
取消注释以下行:
domain-needed
bogus-priv
让它监听服务器本身的内部IP:
listen-address=10.0.186.254 # internal IP
listen-address=127.0.0.1 # must be added too
添加 localhost 作为名称服务器:
# vi /etc/resolv.conf
search mydomain.com
nameserver 127.0.0.1 # this line added
nameserver 8.8.8.8
添加应路由到本地代理 (10.0.186.1) 或虚拟机的域条目:
# vi /etc/hosts
10.0.186.1 api.mydomain.com # these all point to the proxy
10.0.186.1 loginservice.mydomain.com
10.0.186.1 api.otherdomain.com
更改 /etc/hosts 后不要忘记重新启动 dnsmasq
# service dnsmasq restart
确保将 127.0.0.1 作为(主)名称服务器添加到 Proxmox Web 界面中的所有虚拟机!
答案2
我在托管一些容器的 Proxmox 服务器上遇到了同样的问题。其中之一是 Gitlab 服务器。
从其中一个容器甚至从主机,我无法克隆任何存储库。
解决方案非常简单:打开 /etc/hosts 并将所有域/子域重定向到您的代理:
192.168.0.100 mydomain.com www.mydomain.com subdomain.mydomain.com
奇迹般有效。