我在连接新配置的 SSL 站点时遇到了一个非常奇怪的问题。这是托管在 Amazon lightsail 上的 Ubuntu VPS。
我有服务端口 80 和 443 的 Docker 容器,如您在此处所见:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce7114e8383a nginx:alpine "nginx -g 'daemon of…" 43 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp app_nginx_1
ffe588588a67 registry.gitlab.com/example/example-personal-website:latest "/bin/sh -c 'npm run…" 43 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp app_web_1
从服务器内部,我可以向该容器发出 curl 请求并在 SSL 上获得正确的响应。我在端口 80 上获得了相同的响应。
ubuntu@ip-172-26-13-199:~$ curl -k https://0.0.0.0:443
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/>
... // rest of served HTML
我已暂时完全禁用防火墙以排除该问题。
ubuntu:~$ sudo ufw disable
Firewall stopped and disabled on system startup
ubuntu:~$ sudo ufw status
Status: inactive
但从外面我无法访问https://www.example.com/仅有的http://www.example.com/
这是迄今为止我的 nginx 默认配置。它是另一个 docker 镜像的反向代理。
upstream node-app {
server web:9000;
}
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate /certbot/live/www.example.com/fullchain.pem;
ssl_certificate_key /certbot/live/www.example.com/privkey.pem;
location / {
proxy_pass http://node-app;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
这包含在默认的 nginx 配置中。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
编辑 #1 - Test-NetConnection 的输出
C:\Users\Richard> Test-NetConnection -Port 443 -ComputerName www.example.com -InformationLevel Detailed
WARNING: TCP connect to ([server_ip] : 443) failed
WARNING: Ping to [server_ip] failed with status: TimedOut
ComputerName : www.example.com
RemoteAddress : [server_ip]
RemotePort : 443
NameResolutionResults : [server_ip]
MatchingIPsecRules :
NetworkIsolationContext : Internet
IsAdmin : False
InterfaceAlias : WiFi
SourceAddress : 192.168.1.103
NetRoute (NextHop) : 192.168.1.1
PingSucceeded : False
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : False
C:\Users\Richard> Test-NetConnection -Port 80 -ComputerName www.example.com -InformationLevel Detailed
ComputerName : www.example.com
RemoteAddress : [server_ip]
RemotePort : 80
NameResolutionResults : [server_ip]
MatchingIPsecRules :
NetworkIsolationContext : Internet
IsAdmin : False
InterfaceAlias : WiFi
SourceAddress : 192.168.1.103
NetRoute (NextHop) : 192.168.1.1
TcpTestSucceeded : True
答案1
如果从本地系统可以建立到端口 443 和端口 80 的本地连接,但从远程只能访问端口 80,则通常有两种可能性:a) 端口 443 绑定到不同的 IP 地址(这里不是这种情况)或 b) 端口 443 被某些防火墙阻止。
请注意,这里可能涉及多个防火墙,因为远程系统和本地系统之间有多个跳转。虽然您已禁用本地系统上的防火墙,但您的设置中至少还有另一个防火墙:了解 Amazon Lightsail 中的公有网络端口和防火墙设置。
虽然有些人可能认为需要明确打开另一个防火墙很麻烦,但这种纵深防御实际上可以保护用户在不知情的情况下向外部打开数据库或其他服务的几种设置。