nginx反向代理停止端口覆盖
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理停止端口覆盖相关的知识,希望对你有一定的参考价值。
我目前正在使用nginx在一个vps上运行两个节点应用程序。但它正在工作,从任一URL,如果我手动输入另一个端口,它将运行另一个应用程序,即转到mydomain1.com和mydomain2.com正确路由到在端口1337和1338上运行的节点应用程序。但是我可以做mydomain1.com:1337或mydomain1.com:1338我可以访问任一应用程序,这似乎不正确。我可以,如果是这样,是否可以阻止将端口附加到交叉访问应用程序?
以下是我在etc / nginx / conf.d,mydomain1.conf和mydomain2.conf中的文件:
mydomain1.conf
server {
listen 80;
server_name mydomain1.com;
location / {
proxy_pass http://localhost:1337;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
mydomain2.conf
server {
listen 80;
server_name mydomain2.com;
location / {
proxy_pass http://localhost:1338;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我还添加了一个/etc/nginx/nginx.conf文件,其中包含以下内容:
server_names_hash_bucket_size 64;
这似乎更像是防火墙问题?域名只会让您进入计算机,如果节点服务器在“公开”端口上运行,那么您可以访问它们。您可能应该锁定暴露的端口,并可能在应用程序路由中强制执行域重定向。
Web服务器可能只需要公开端口80用于http,443用于https,22用于ssh,可能25用于ftp
正如其他答案所指出的那样,最好的办法是设置防火墙,只绑定你的节点应用程序来监听localhost
。
对于防火墙,你不必乱用iptables,你可以使用ufw(简单防火墙)。这使得保护Web服务器端口变得非常轻松:
- 默认情况下,最初拒绝所有传入连接
- 只允许
HTTP:80
,HTTPS:443
,SSH:22
和FTP:21
对于debian / ubuntu系统,该过程看起来像这样(首先确保你是root
或sudo
):
$ apt install ufw
$ ufw default deny incoming
$ ufw allow ssh
$ ufw allow http
$ ufw allow https
$ ufw allow ftp
$ ufw enable
如果您输入ufw status
,您可以看到您有哪些活动规则。
为了只将您的节点进程绑定到localhost(以便服务器上没有的任何东西都无法连接到该端口),您可以将主机名作为server.listen()
的第二个参数(或app.listen()
的express)传递:
const PORT = process.env.PORT || 1337;
const HOST = "localhost" || "127.0.0.1"; // You can use either of these
app.listen(PORT, HOST, err => {
if (err) throw err;
console.log(`Listening on http://${HOST}:${PORT}`);
});
像这样设置防火墙是明智的,它显然提供了一个解决方案。
如果您感兴趣,可以访问节点应用程序的实际原因是,除非您将它们绑定到IP,否则它们将侦听所有网络接口上的流量,因此将响应您的公共IP上的请求。
将您的节点应用程序(或您计算机上运行的任何服务器)绑定到127.0.0.1,它只会响应内部请求,包括由Nginx代理的请求,但不会响应外部世界。
我正在为自己的问题添加一个答案,我接受了一个让我朝着正确的方向前进的答案。这个答案可能对于那些在线上打这个线程的人有用。
肯定有更强大的方法,但对于我使用linux iptables,以下只允许端口80和端口22(对于我的ssh会话),因此用户无法输入mydomain1:1337或mydomain1:1338,它还包括几个基本的攻击保护:
红晕
iptables -F
阻止空包
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
同步洪水攻击保护
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
XMAS数据包保护
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
允许本地主机
iptables -A INPUT -i lo -p all -j ACCEPT
现在我们可以允许Web服务器流量:
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
允许相关,已建立
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
以上是关于nginx反向代理停止端口覆盖的主要内容,如果未能解决你的问题,请参考以下文章