web-dev-qa-db-ja.com

インターネットからローカルホストに到達するようにNginxリバースプロキシを設定するにはどうすればよいですか?

プライベートIPアドレスを持つVMをインターネットから到達可能にするために、Nginxをリバースプロキシとして構成するのに問題があります。

現在の構成で図を描きました。

enter image description here

私の専用サーバーはProxmoxハイパーバイザーで実行され、パブリックIPアドレスは1つだけです。ハイパーバイザーにブリッジがインストールされており、VMがローカルIPアドレスを介してインターネットにアクセスできるようになっています。

調査したところ、Nginxリバースプロキシを使用すると、インターネットからプライベートIPアドレス(Webサイトを実行している)でVMに到達できることがわかりましたが、正しく設定するのに問題があります。

ハイパーバイザーの構成/ etc/network/interfaces:

root@ns568745:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback


    # vmbr0: Bridging. Make sure to use only MAC adresses that were assigned to you.
    auto vmbr0
    iface vmbr0 inet static
            address 40.53.XX.XX/24
            gateway 40.53.XX.254
            bridge_ports eno1
            bridge_stp off
            bridge_fd 0





    auto vmbr1
    iface vmbr1 inet static
            address  192.168.4.254/24
            broadcast 192.168.4.255
            bridge_ports none
            bridge_stp off
            bridge_fd 0
            post-up echo 1 > /proc/sys/net/ipv4/ip_forward
            post-up iptables -t nat -A POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE
            post-down iptables -t nat -D POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE


    post-up   iptables -t nat -A PREROUTING -i vmbr1 -p tcp --dport 80 -j DNAT --to 192.168.4.2:80
    post-down iptables -t nat -D PREROUTING -i vmbr1 -p tcp --dport 80 -j DNAT --to 192.168.4.2:80
    post-up   iptables -t nat -A PREROUTING -i vmbr1 -p tcp --dport 443 -j DNAT --to 192.168.4.2:443
    post-down iptables -t nat -D PREROUTING -i vmbr1 -p tcp --dport 443 -j DNAT --to 192.168.4.2:443

Vm1のIPアドレスは192.168.4.4で、ドメイン名が「london.austria.com」のWebサイト(Apacheを使用)を実行します。

Vm2のIPアドレスは192.168.4.5で、ドメイン名が「manchester.austria.com」のWebサイト(Apacheを使用)を実行します。

ドメイン名を購入しました。「austria.com」と呼びましょう。

レジストラで、2つのサブドメインのAレコードを設定しました。

40.53.XX.XXを指すAレコードを持つlondon.austria.com

40.53.XX.XXを指すAレコードを持つmanchester.austria.com

VM1構成:Apacheでwwebisteを実行しているサブドメイン「london.austria.com」の192.168.4.4。ファイアウォールが無効になっている

VM2構成:Apacheでwwebisteを実行しているサブドメイン「manchester.austria.com」の192.168.4.5。ファイアウォールが無効になっている

Nginxは、次の手順でLXCubuntuコンテナーにインストールされています。

systemctl start nginx

systemctl enable nginx

/ etc/nginx/sites-enabled/defaultのリンクを解除します

cd/etc/nginx/sites-利用可能

vim reverse-proxy.conf

    server {
            listen 80;
            listen [::]:80;

            access_log /var/log/nginx/reverse-access.log;
            error_log /var/log/nginx/reverse-error.log;

            location / {
                        proxy_pass http://192.168.4.4:80;
      }
    }

ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf

私が実行したテスト:

Vm1の内部:

IPアドレス192.168.4.4を入力してWebサイトにアクセスできます

ブラウザにドメイン名「london.austia.com」を入力してウェブサイトにアクセスできません。

家から:

仮想マシンのWebサイトにアクセスできません。

私はvm2をテストするためにさらに進んでいませんでした。


私の新しい/ etc/network/interfaces

root@ns568745:~# cat /etc/network/interfaces
    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5).

    # The loopback network interface
    auto lo
    iface lo inet loopback


    # vmbr0: Bridging. Make sure to use only MAC adresses that were assigned to you.
    auto vmbr0
    iface vmbr0 inet static
        address 40.53.XX.XX /24
        gateway 40.53.XX.XX .254
        bridge_ports eno1
        bridge_stp off
        bridge_fd 0





    auto vmbr1
    iface vmbr1 inet static
        address  192.168.4.254/24
        broadcast 192.168.4.255
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.4.254/24' -o vmbr0 -j MASQUERADE



    iptables -t nat -A PREROUTING -d 40.53.XX.XX  -p tcp -m multiport --dports 80,443,22 -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2

    iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX

編集1:

だから、私がしたこと:

シェルで、私は入力しました:

iptables -t nat -F
iptables -t nat -A PREROUTING -d 40.53.XX.XX -p tcp -m multiport --dports 80,443,22 -m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX

次に、自宅からブラウザにURL http://london.austria.com と入力すると、このWebサイトにアクセスできるようになります。

しかし、別のタブを開くと、2番目のWebサイトのURL http://manchester.austria.com 、表示されるWebサイトはまだ http://london.austria.com

1
qwerty1805

DNATルールの方向が間違っています(プライベートネットワークではなくインターネットから送信されるパケット、つまりインターフェイスvmbr0には、宛先アドレスの変換が必要です)。 post-upフックとpost-downフックを変更する前に、ルートシェルからそれらをテストします。

iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dports 80,443 \
-m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2

ただし、静的IPアドレス(40.53.XX.XX)があるため、MASQUERADEルールとDNATルールの両方を次のように置き換えます。

iptables -t nat -A PREROUTING -d 40.53.XX.XX -p tcp -m multiport --dports 80,443 \
-m comment --comment "nginx" -j DNAT --to-destination 192.168.4.2
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 40.53.XX.XX

SNATターゲットの方が速いため( netfilter manual を参照)。この一連のルールは、 ヘアピンNAT 構成も提供し、サーバーのパブリックIPを使用してVMから別のルールに接続できるようにします。

編集:ネットワークが機能しているので、nginxを次のように構成できます2つのserverブロック:

server {
    listen 80 default;
    listen [::]:80 default;
    server_name manchester.example.com;

    location / {
        proxy_pass http://192.168.4.5:80;
    }
}

server {
    listen 80;
    listen [::]:80;
    server_name london.example.com;

    location / {
        proxy_pass http://192.168.4.4:80;
    }
}
1