このシナリオがあります。
- 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