如何将流量从 CentOS Docker 容器内的虚拟机重定向到主机端口?

如何将流量从 CentOS Docker 容器内的虚拟机重定向到主机端口?

我有这样的场景:

  • 一台运行 Debian 并安装了 ufw 的主机。
  • 一个 CentOS docker 容器,有一个在特定 IP 上运行的虚拟机。
  • 该虚拟机有一个应用程序正在处理容器调用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 规则转发流量。

以下是您可以采取的步骤的示例:

  1. 创建一个 Docker 网络并将 CentOS 容器附加到其中:

    docker network create mynetwork
    docker run --network=mynetwork --name=centos_container centos
    
  2. 在 CentOS 容器内,将 VM 配置为使用与 Docker 网络位于同一网络中的静态 IP 地址。例如,如果 Docker 网络 IP 范围为172.18.0.0/16,您可以将虚拟机配置为使用172.18.0.2

  3. 将 CentOS 容器内虚拟机的端口暴露给 Docker 网络。例如,如果应用程序在虚拟机内的端口 80 上运行,您可以使用 docker run 命令并选择-p将该端口映射到 Docker 网络:

    docker run --network=mynetwork --name=centos_container -p 7000:80 centos
    

    这会将容器端口 80 映射到主机端口 7000。

  4. 在HOST机器上启用IP转发:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  5. 配置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 来访问在 Ce​​ntOS 容器内的 VM 上运行的应用程序。

答案2

我能够连接到该应用程序,位于 CentOS Docker 容器内的 VM 内,来自 Host使用在 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

  1. 检查当前iptables规则
    iptables -t nat -L -n -v
    
  2. 启用IP转发
    echo "1" > /proc/sys/net/ipv4/ip_forward
    cat /proc/sys/net/ipv4/ip_forward
    
  3. 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
    
  4. 检查iptables规则
    iptables -t nat -L -n -v
    

相关内容