网络安全基础
TLS、分段与防火墙。
网络安全基础
这一课你将能做到
- 用
openssl s_client和curl -v完整走一遍 TLS 握手过程,说出每一步在交换什么 - 在 Nginx 上配置一套合格的 HTTPS(TLS 1.2+、强加密套件、HTTP 强制跳转、HSTS),并用 SSL Labs 验证评分
- 解释 VLAN、安全组、防火墙在网络分段中的作用,画出本站(Nginx → Spring Boot → MySQL/Redis)的分段拓扑
为什么要学
你的 Java 应用不是活在真空里:浏览器到 Nginx、Nginx 到 Spring Boot、Spring Boot 到 MySQL/Redis,每一跳都是网络。不懂网络,就看不懂「为什么开了 HTTPS 还被劫持」「为什么数据库不能暴露公网」这些基本问题。
人话:网络是敌我分界线。TLS 保证「你和我说的话别人听不懂」;防火墙和分段保证「不该通的路一律不通」。本站的事故里,一半以上本质是网络配置问题——Redis 裸奔公网、MySQL 0.0.0.0 监听、TLS 版本太老被降级攻击。
先建立图像
一次 HTTPS 请求的完整旅程:
浏览器 ──① DNS 查询──→ DNS 服务器 (拿到 IP)
│
├──② TCP 三次握手──→ Nginx (443 端口)
│ SYN → SYN+ACK → ACK
│
├──③ TLS 握手──→ Nginx
│ ClientHello (支持的 TLS 版本/套件)
│ ServerHello + 证书链
│ 密钥交换 → 会话密钥
│
├──④ 加密 HTTP 请求──→ Nginx
│
└── Nginx ──⑤ 反向代理(明文HTTP)──→ Spring Boot :8080
│
├──⑥ TCP──→ MySQL :3306
└──⑦ TCP──→ Redis :6379
网络分段的正确姿势:
┌─ 公网 ────────────────────────────┐
│ 只暴露 Nginx 的 80/443 │
└──────────┬────────────────────────┘
│ (DMZ 区)
┌──────────▼────────────────────────┐
│ Spring Boot :8080 │
│ 安全组:只允许 Nginx 服务器 IP 访问 │
└──────────┬────────────────────────┘
│ (内网数据区)
┌──────────▼────────────────────────┐
│ MySQL :3306 / Redis :6379 │
│ 安全组:只允许应用服务器 IP 访问 │
│ bind 127.0.0.1 或内网网卡 │
└───────────────────────────────────┘
跟着做
步骤 1:观察 TLS 握手
# 看完整握手过程:协议版本、加密套件、证书链
openssl s_client -connect coderoadmap.cn:443 -servername coderoadmap.cn
# 重点看这几行输出:
# Protocol : TLSv1.3
# Cipher : TLS_AES_256_GCM_SHA384
# Verify return code: 0 (ok)
用 curl 看简化版:
curl -vI https://coderoadmap.cn 2>&1 | findstr /C:"SSL connection" /C:"subject:" /C:"issuer:"
-servername 参数是 SNI(Server Name Indication):一台 Nginx 托管多个域名证书时,靠它告诉服务器「我要访问哪个域名」。
步骤 2:Nginx 配置合格的 HTTPS
server {
listen 443 ssl;
server_name coderoadmap.cn;
# 证书(用 Let's Encrypt 免费证书)
ssl_certificate /etc/letsencrypt/live/coderoadmap.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/coderoadmap.cn/privkey.pem;
# 只开 TLS 1.2 和 1.3,关掉有漏洞的 SSLv3/TLS1.0/1.1
ssl_protocols TLSv1.2 TLSv1.3;
# 强加密套件,禁用弱算法
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off; # TLS1.3 下让客户端选
# HSTS:告诉浏览器以后只走 HTTPS,防降级
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-Proto $scheme; # 让后端知道原始协议
}
}
# HTTP 强制跳转 HTTPS
server {
listen 80;
server_name coderoadmap.cn;
return 301 https://$host$request_uri;
}