Webアプリケーションを提供するTomcatサーバーがあり、その前でリバースプロキシとしてNginxサーバーが実行されています。以前の質問( nginxリバースプロキシの背後にあるTomcatサーバー-サーバーへの直接アクセスをブロックする方法? )への回答として、Tomcatインスタンスをファイアウォールで保護するように提案されましたが、さまざまなフォーラムでの調査結果に基づいています、Tomcatをlocalhostをリッスンするように制限するのが道のりのようでした。 Tomcatが他のIPをリッスンしないようにするために、コネクタ構成に「address = 127.0.0.1」を追加しました。コネクタブロック全体は次のようになります-
<Connector port="8080"
address="127.0.0.1"
maxThreads="150"
minSpareThreads="25"
connectionTimeout="20000"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"
proxyName=<FQDN>
proxyPort="80"/>
Nginxサーバーには、サーバー構成用のこれらの行があります。
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name <FQDN>;
location / {
proxy_pass <FQDN>;
proxy_set_header X-Forwarded-Host $Host;
proxy_set_header X-Forwarded-Server $Host;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
}
}
さて、FQDNを使用してWebアプリケーションにアクセスしようとすると、ChromeはERR_CONNECTION_REFUSEDを報告します。私のNginx構成は、私が理解したことに基づいて原因のようです。どうすれば修正できますか?
質問の目的のために、私は次のIPを想定します
Nginx 192.168.0.1
Tomcat 192.168.0.2
Tomcatサーバーを構成します
次の行をaddress="127.0.0.1"
からaddress="192.168.0.2"
に変更します-これにより、TomcatはループバックアドレスではなくローカルIPをリッスンするようになります。
次に、IPtablesを構成します。ジェネレーターを使用しました ここ 。
以下のルールは「安全」であり、リモートアクセスからロックアウトされることはありません(sshポートがデフォルトであると仮定して、ポート22でSSHを許可しました)が、おそらくそうあるべき/可能性があるほど制限的ではありません。少し時間を取って、それらを確認してください。また、現在のルールも削除されます
#!/bin/sh
# iptables script generated 2016-04-20
# http://www.mista.nu/iptables
IPT="/sbin/iptables"
# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain
# Set default policies for all three default chains
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# Enable free use of loopback interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP
# Accept inbound TCP packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT # Accepts SSH from everywhere
$IPT -A INPUT -p tcp --dport 8080 -m state --state NEW -s 192.168.0.1/32 -j ACCEPT # Accepts connection to port 8080 only from the Nginx Server
# Accept inbound ICMP messages
$IPT -A INPUT -p ICMP --icmp-type 8 -s 0.0.0.0/0 -j ACCEPT
$IPT -A INPUT -p ICMP --icmp-type 11 -s 0.0.0.0/0 -j ACCEPT
Nginxサーバーを構成します
サーバー構成を少し編集する必要があります。ここで、ローカルIPでTomcatサーバーにプロキシします。
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name <FQDN>;
location / {
proxy_pass http://192.168.0.2:8080;
proxy_set_header X-Forwarded-Host $Host;
proxy_set_header X-Forwarded-Server $Host;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
}
}
FQDNにプロキシできますが、Nginxサーバーを指すものとは別のFQDNを構成する必要があります。たとえば、上記のFQDNがmyapp.example.com
の場合、Tomcat.example.com
などの別のFQDNを構成し、それを192.168.0.2
に解決して、上記のnginx構成の192.168.0.2
をTomcat.example.com
に置き換えることができます。