Iptables 无法使用 proxmox 从/向内部 LAN 转发

Iptables 无法使用 proxmox 从/向内部 LAN 转发

我有一个带有单个公共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

奇迹般有效。

相关内容