nginx 反向代理停止端口覆盖
nginx reverse proxy stop port override
我目前正在使用 nginx 运行 一个 vps 上的两个节点应用程序。但是,它正在工作,如果我手动输入另一个 URL 的端口,它将 运行 另一个应用程序,即转到 mydomain1.com 和 mydomain2.com 正确路由到节点应用程序 运行ning 在端口 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;
这似乎更像是一个防火墙问题?域名只是让你进入机器,如果节点服务器在 'exposed' 端口上 运行,那么你当然可以访问它们。您可能应该锁定暴露的端口,并可能在应用程序路由中强制执行域重定向。
Web 服务器可能只需要为 http 公开端口 80,为 https 公开 443,为 ssh 公开 22,也许 25 为 ftp
我正在为我自己的问题添加一个答案,我接受了一个让我朝着正确方向前进的答案。这个答案可能对直接点击此线程的人有用。
肯定有更强大的方法,但对我来说,使用 linux iptables 和以下内容仅允许端口 80 和端口 22(用于我的 ssh 会话),因此用户无法输入 mydomain1:1337 或 mydomain1:1338,它还包括一些基本的攻击保护:
同花顺
iptables -F
阻止空数据包
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood 攻击防护
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
现在我们可以允许网络服务器流量:
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
像这样设置你的防火墙是明智的,它显然提供了一个解决方案。
如果您有兴趣,您的节点应用程序可访问的实际原因是,除非您将它们绑定到 IP,否则它们会侦听您所有网络接口上的流量,因此将响应您 public 知识产权。
将您的节点应用程序(或您计算机上的任何服务器 运行)绑定到 127.0.0.1,它只会响应内部请求,包括由 Nginx 代理的请求,但不会响应外部世界。
正如其他答案所指出的,最好的办法是同时设置防火墙 和 仅绑定您的节点应用程序以侦听 localhost
.
对于你没有与iptables混淆的防火墙,你可以使用ufw (Uncomplicated Firewall)。这使得保护 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
,您可以看到您激活了哪些规则。
为了仅将您的节点进程绑定到本地主机(这样任何不在您的服务器上的东西都无法连接到该端口),您可以将主机名作为 server.listen()
(or app.listen()
for 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}`);
});
我目前正在使用 nginx 运行 一个 vps 上的两个节点应用程序。但是,它正在工作,如果我手动输入另一个 URL 的端口,它将 运行 另一个应用程序,即转到 mydomain1.com 和 mydomain2.com 正确路由到节点应用程序 运行ning 在端口 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;
这似乎更像是一个防火墙问题?域名只是让你进入机器,如果节点服务器在 'exposed' 端口上 运行,那么你当然可以访问它们。您可能应该锁定暴露的端口,并可能在应用程序路由中强制执行域重定向。
Web 服务器可能只需要为 http 公开端口 80,为 https 公开 443,为 ssh 公开 22,也许 25 为 ftp
我正在为我自己的问题添加一个答案,我接受了一个让我朝着正确方向前进的答案。这个答案可能对直接点击此线程的人有用。
肯定有更强大的方法,但对我来说,使用 linux iptables 和以下内容仅允许端口 80 和端口 22(用于我的 ssh 会话),因此用户无法输入 mydomain1:1337 或 mydomain1:1338,它还包括一些基本的攻击保护:
同花顺
iptables -F
阻止空数据包
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood 攻击防护
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
现在我们可以允许网络服务器流量:
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
像这样设置你的防火墙是明智的,它显然提供了一个解决方案。
如果您有兴趣,您的节点应用程序可访问的实际原因是,除非您将它们绑定到 IP,否则它们会侦听您所有网络接口上的流量,因此将响应您 public 知识产权。
将您的节点应用程序(或您计算机上的任何服务器 运行)绑定到 127.0.0.1,它只会响应内部请求,包括由 Nginx 代理的请求,但不会响应外部世界。
正如其他答案所指出的,最好的办法是同时设置防火墙 和 仅绑定您的节点应用程序以侦听 localhost
.
对于你没有与iptables混淆的防火墙,你可以使用ufw (Uncomplicated Firewall)。这使得保护 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
,您可以看到您激活了哪些规则。
为了仅将您的节点进程绑定到本地主机(这样任何不在您的服务器上的东西都无法连接到该端口),您可以将主机名作为 server.listen()
(or app.listen()
for 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}`);
});