プライベートIPアドレスを持つVMをインターネットから到達可能にするために、Nginxをリバースプロキシとして構成するのに問題があります。
現在の構成で図を描きました。
私の専用サーバーは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
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;
}
}