이 시나리오가 있습니다.
- ufw가 설치된 Debian을 실행하는 호스트.
- CentOS Docker 컨테이너에는 특정 IP에서 실행되는 가상 머신이 있습니다.
- VM에는 컨테이너 호출을 처리
https://app.domain
하고 항목을hosts
(애플리케이션 IP).
localhost:7000
내 호스트 머신을 호출하고 컨테이너의 가상 머신 애플리케이션을 사용하고 싶습니다 .
컨테이너를 실행할 때 컨테이너의 포트를 노출했습니다 -p 7000:7000
.
iptables
컨테이너의 트래픽을 읽고 리디렉션하려고 시도했지만 운이 없었습니다!
그렇다면...누구든지 iptables
내가 실행해야 하는 명령의 예를 만들 수 있나요?
편집하다:다음과 같은이것나는 시도했다:
IP_CONTAINER=xxx.xxx.xxx.xxx
APP_IP=xxx.xxx.xxx.xxx
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING --protocol tcp --destination $APP_IP --dport 80 --source $IP_CONTAINER --jump DNAT --to-destination $APP_IP
iptables -t nat -A POSTROUTING -j MASQUERADE
하지만 여전히 성공하지 못했습니다!
답변1
호스트 포트에서 CentOS Docker 컨테이너 내부의 가상 머신에서 실행되는 애플리케이션으로 트래픽을 리디렉션하려면 Docker 컨테이너 네트워크를 구성하고 iptables 규칙을 사용하여 트래픽을 전달해야 합니다.
취할 수 있는 조치의 예는 다음과 같습니다.
Docker 네트워크를 생성하고 여기에 CentOS 컨테이너를 연결합니다.
docker network create mynetwork docker run --network=mynetwork --name=centos_container centos
CentOS 컨테이너 내에서 Docker 네트워크와 동일한 네트워크의 고정 IP 주소를 사용하도록 VM을 구성합니다. 예를 들어 Docker 네트워크 IP 범위인 경우 이를
172.18.0.0/16
사용하도록 가상 머신을 구성할 수 있습니다172.18.0.2
.CentOS 컨테이너에 있는 가상 머신의 포트를 Docker 네트워크에 노출합니다. 예를 들어 애플리케이션이 가상 머신 내의 포트 80에서 실행 중인 경우 docker run 명령을 사용하고
-p
해당 포트를 Docker 네트워킹에 매핑하도록 선택할 수 있습니다.docker run --network=mynetwork --name=centos_container -p 7000:80 centos
이는 컨테이너 포트 80을 호스트 포트 7000에 매핑합니다.
HOST 시스템에서 IP 전달을 활성화합니다.
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables
호스트 포트 7000에서 Docker 컨테이너 내부의 가상 머신으로 트래픽을 전달하는 규칙을 구성합니다 . 예를 들어 컨테이너 내부 가상 머신의 IP 주소가 이면172.18.0.2
다음iptables
규칙을 사용할 수 있습니다.iptables -t nat -A PREROUTING -p tcp --dport 7000 -j DNAT --to-destination 172.18.0.2:80 iptables -t nat -A POSTROUTING -j MASQUERADE
이러한 규칙은 호스트의 포트 7000에서 들어오는 트래픽을 컨테이너 내부 가상 머신의 포트 80으로 전달하여 소스 IP 주소를 호스트의 IP 주소로 다시 씁니다.
이러한 단계를 수행한 후에는 호스트 시스템의 http://localhost:7000에 액세스하여 CentOS 컨테이너 내부의 VM에서 실행 중인 애플리케이션에 액세스할 수 있어야 합니다.
답변2
애플리케이션에 연결할 수 있습니다., 호스트에서 CentOS Docker 컨테이너 내부의 VM에 위치CentOS 컨테이너에서 올바르게 구성된 프록시를 사용하십시오.컨테이너의 공용 IP에서 VM IP 및 애플리케이션 포트로 트래픽을 전달합니다!
그럼 방법은..대리인컨테이너 내부!
나는 사용했다HA 프록시다음 구성을 사용하십시오 haproxy.conf
.
global
log 127.0.0.1 local0
debug
defaults
log global
mode http
timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000
frontend apps
bind CONTAINER_IP:80
bind CONTAINER_IP:443
option tcplog
mode tcp
default_backend apps
backend apps
mode tcp
balance roundrobin
option ssl-hello-chk
server webserver1 APP_IP:APP_PORT check
frontend api
bind CONTAINER_IP:6443
option tcplog
mode tcp
default_backend api
backend api
mode tcp
balance roundrobin
option ssl-hello-chk
server webserver1 APP_IP:APP_PORT check
나는 가지고있다전달 활성화컨테이너의 경우:
$ sysctl net.ipv4.conf.all.forwarding=1
$ sudo iptables -P FORWARD ACCEPT
답변3
- 현재
iptables
규칙을 확인하세요iptables -t nat -L -n -v
- IP 전달 활성화
echo "1" > /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward
- PG 트래픽 전달 규칙
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination new-master-ip:80 iptables -t nat -A POSTROUTING -j MASQUERADE
iptables
규칙을 확인하세요iptables -t nat -L -n -v