我有这样的场景:
- 一台运行 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 规则转发流量。
以下是您可以采取的步骤的示例:
创建一个 Docker 网络并将 CentOS 容器附加到其中:
docker network create mynetwork docker run --network=mynetwork --name=centos_container centos
在 CentOS 容器内,将 VM 配置为使用与 Docker 网络位于同一网络中的静态 IP 地址。例如,如果 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 内,来自 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
- 检查当前
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