IP 表条目后的 80 端口不再监听

IP 表条目后的 80 端口不再监听

我创建了一个部署在 Linux 机器上的 nodeJS 应用程序。为了在整个应用程序中仅允许使用 HTTPS,我创建了一些 IP 表规则,将所有传入请求重定向到 443 => 3000(3000 === 应用程序端口)。

我想要实现的目标:

1)用户输入http域=> https => PORT 3000(应用程序)

2)用户进入https域=>PORT 3000(应用程序)

我已经做了什么:

将所有传入流量路由到 https!

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 443
iptables -t nat -I OUTPUT -p tcp -o lo --dport 80 -j REDIRECT --to-ports 443

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 3000
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 3000

iptables-save

已在运行的内容:

目前只有方案 2) 有效。

为了将端口 80 上的所有传入流量重定向到 443(https),然后再重定向到端口 3000(应用程序端口),我该怎么做?

答案1

您不能仅仅将端口 80 转发到端口 443。

您需要返回 HTTP 重定向(HTTP 状态代码 301 或 302),以便浏览器知道它现在正在谈论 HTTPS 而不是 HTTP。

您无法使用 iptables 执行此操作,执行此类操作的最佳方法是使用 nginx 或 apache 之类的程序为应用程序提供代理。这也意味着代理可以处理 HTTPS 证书处理,而这最好不要在应用程序中完成。

以下是 nginx 配置的开始部分:

server {
    listen 80;
    listen [::]:80;

    server_name www.example.com;

    return 301 https://www.example.com$request_uri;
}

server {
     listen 443;
     listen [::]:443;

     server_name www.example.com;

     //SSL cert stuff goes here
     ....

     location / {
           proxy_pass http://nodejs.server:3000/;
     }
}

相关内容