CentOS Dockerコンテナ内の仮想マシンからホストポートにトラフィックをリダイレクトする方法は?

CentOS Dockerコンテナ内の仮想マシンからホストポートにトラフィックをリダイレクトする方法は?

このシナリオがあります。

  • 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ルールを使用してトラフィックを転送する必要があります。

取ることができるアクションの例は次のとおりです。

  1. Dockerネットワークを作成し、ここにCentOSコンテナを接続します。

    docker network create mynetwork
    docker run --network=mynetwork --name=centos_container centos
    
  2. CentOSコンテナ内でDockerネットワークと同じネットワークの静的IPアドレスを使用するようにVMを設定します。たとえば、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にアクセスして、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

  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
    

関連情報