我有一台 Tomcat 服务器为 Web 应用程序提供服务,并且在其前面运行一台 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 配置似乎是罪魁祸首。如何纠正?
答案1
为了回答这个问题,我假设以下 IP
Nginx 192.168.0.1
Tomcat192.168.0.2
配置 tomcat 服务器
将以下行更改address="127.0.0.1"
为address="192.168.0.2"
- 这将告诉 Tomcat 监听本地 IP 而不是环回地址。
然后我们要配置 IPtables。我使用了生成器这里。
以下规则是“安全的”,它们不会锁定您的远程访问(我已允许在端口 22 上使用 SSH,假设您的 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。例如,如果上面的 FQDN 是,myapp.example.com
您需要配置另一个 FQDN,例如,tomcat.example.com
并将其解析为,192.168.0.2
然后您可以192.168.0.2
在上面的 nginx 配置中将其替换为tomcat.example.com