단일 공용 IP가 있는 proxmox 호스트와 웹 서버 및 여러 도메인이 설치된 일부 VM이 있습니다. 첫 번째 VM은 요청을 다른 VM으로 전달하는 haproxy가 있는 프록시입니다. 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
다른 VM에는 내가 가지고 있는 동일한 VM에서 시작하는 대신 외부에서 연결하면 작동하는 웹사이트가 설치되어 있습니다 curl: (7) Failed connect to www.mydomain.com:80
. 연결이 거부되는데 이는 iptables에 문제가 있다고 생각됩니다.
답변1
마침내 해결책이나 해결 방법을 찾았습니다. 이 문제의 원인이 무엇인지 모르겠습니다(Proxmox 또는 Debian 방화벽 등과 관련이 있습니다). 일반 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
Proxmox 웹 인터페이스의 모든 가상 머신에 127.0.0.1을 (기본) 이름 서버로 추가하십시오!
답변2
일부 컨테이너를 호스팅하는 Proxmox 서버에서도 동일한 문제가 발생했습니다. 그 중 하나가 Gitlab 서버입니다.
컨테이너 중 하나 또는 호스트 시스템에서도 리포지토리를 복제할 수 없습니다.
해결책은 매우 간단합니다. /etc/hosts를 열고 모든 도메인/하위 도메인을 프록시로 리디렉션합니다.
192.168.0.100 mydomain.com www.mydomain.com subdomain.mydomain.com
기적적으로 작동합니다.