网络安全:ACL、VPN 与零信任
这一课你将能做到
- 写出正确的 ACL:放行该放的、默认拒绝其余、并验证生效
- 说清三种 VPN(IPSec / WireGuard / SSL)的层次与取舍
- 用零信任的「永不信任、始终验证」重审自己的服务暴露面
为什么要学
网络安全的 80% 是「少开几个口」。数据库挂公网、Redis 未授权访问、K8s API 裸奔,每年都在批量上新闻。本课给你三件武器:ACL(边界)、VPN(通道)、零信任(方法论),并落在 Nginx + K8s + 云的真实场景里;学完请立刻回到自己的服务,跑一遍步骤 4 的暴露面审计。
先建立图像
传统边界模型(城堡 + 护城河):
Internet ══[防火墙]══ 内网(进来后基本畅通)→ 内部一失守 = 全域沦陷
零信任模型(每个门都验票):
用户 ──认证──▶ 应用A │ 每次访问都验:身份 + 设备 + 上下文
用户 ──认证──▶ 应用B │ 服务之间同样互相验(mTLS)
数据库只对「明确授权的应用账号」开放,不对网段开放
跟着做
步骤 1:写一条白名单式 ACL(iptables 版)
# 只允许办公网段访问 SSH,其余拒绝
sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
sudo iptables -L INPUT -n --line-numbers # 顺序即优先级
云上等价:安全组里「来源 203.0.113.0/24,端口 22,允许」+ 默认拒绝。
步骤 2:Nginx 层再加一道(应用层 ACL)
location /admin/ {
allow 203.0.113.0/24;
deny all;
proxy_pass http://backend;
}
sudo nginx -t && sudo systemctl reload nginx
curl -s -o /dev/null -w '%{http_code}\n' https://你的域名/admin/ # 异地应返回 403
步骤 3:搭一条 WireGuard 隧道(现代 VPN 首选)
sudo apt install wireguard
wg genkey | tee privatekey | wg pubkey > publickey
/etc/wireguard/wg0.conf:
[Interface]
PrivateKey = <服务端私钥>
ListenPort = 51820
Address = 10.66.0.1/24
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.66.0.2/32
sudo systemctl enable --now wg-quick@wg0
sudo wg show # 看 latest handshake 与 transfer 是否增长
内核级实现、代码量小、性能高;对比:IPSec 重但适合网关对网关,SSL VPN 免客户端适合浏览器直达应用。
步骤 4:审计自己的暴露面
ss -tlnp | awk '$4 ~ /0.0.0.0|::/ {print $4, $6}' # 全网监听的口
nmap -Pn -p 22,80,443,3306,6379,8080 你的公网IP # 从外部看
预期只看到 80/443;3306 / 6379 / 22 出现在结果里 = 立即处理。
讲清楚要点
- ACL 顺序即逻辑:从上到下首个命中生效;「先 deny all 再 accept」永远不生效——白名单是 accept 在前、默认拒绝兜底。
- 分层设防:网络层(安全组 / ACL)管端口,应用层(Nginx / WAF)管内容,主机层(最小权限 + 补丁)管进程;任何单层都可能被绕过。
- VPN 三形态:IPSec 站点对站点、WireGuard 主机对主机(轻快现代)、SSL/TLS VPN 用户对应用(远程办公);选型看「谁来连谁」。
- 零信任不是产品是架构:强认证(人 / 服务)+ 设备信任 + 动态授权 + 全程加密(mTLS);K8s 服务网格的 mTLS 就是服务间零信任的落地。
- 最小暴露面原则:数据库 / Redis / MQ 永不直连公网;管理入口收敛到 VPN / 堡垒机;临时端口用完即关。
- 策略要记账:每条放行规则都能对上「谁申请的、为什么、何时回收」;临时规则必须带有效期,到期自动删除——不记账的策略迟早变成后门。
你可能会懵的地方
-
DROP 和 REJECT 区别? DROP 静默丢弃(对方等超时,探测更难但浪费重试);REJECT 回拒绝包(立刻失败,体验好)。对外入口建议 DROP,内网用 REJECT 利于排障。
-
有了 VPN 还要 ACL 吗? 要。VPN 解决「谁能进网络」,ACL 解决「进来后能碰什么」;「VPN 一连全通」正是要消灭的过度授权。
-
mTLS 和 TLS 区别? TLS 只验证服务端;mTLS 双向互验证书,服务间调用靠它确认「对端真的是它声称的服务」,是零信任的通信底座。落地时注意证书轮换:用内部 CA 短周期证书 + 自动续签,别让「加密」变成新的可用性风险。
-
K8s 里 ACL 对应什么? NetworkPolicy + 云安全组。注意 NetworkPolicy 默认全通,且要 CNI 支持才生效;Pod 间东西向流量靠它收敛。
-
零信任会不会让运维变复杂? 初期会;长期反而简单——策略跟着身份走,不再维护一堆 IP 白名单。分阶段落地:先管管理入口,再收服务间流量。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 安全组 0.0.0.0/0 开 22 | 全网爆破源 | 限办公网段或走 VPN,密钥登录 |
| ACL 先 deny any 再 allow | allow 永远匹配不到 | 白名单在前,deny all 兜底 |
| 内网即可信,数据库裸奔 | 拖库一条龙 | 白名单 + 强口令 + 审计,内网也分层 |
| 只在 Nginx 配 HTTPS,后端明文 | 链路后半段裸奔 | 端到端加密或内网 mTLS |
| 用 IP 白名单管第三方对接 | 对方出口一变就断,被仿冒就放行 | mTLS 或 API 签名为主,IP 白名单为辅 |
| 规则只加不减 | 策略库膨胀成筛子 | 季度审计,无主规则直接下线 |
| 临时开洞用完不关 | 忘了就是永久后门 | 变更单里写死回收时间与责任人 |
卡点急救
- 改完 ACL 把自己锁外面:云控制台 VNC / 串口是最后生命线;本地改 iptables 先备份并用定时任务自动回滚再上线。
- WireGuard 握手不成功:依次查 UDP 51820 是否放行(安全组 + 系统防火墙)、Peer 的 PublicKey 是否写成了对方公钥、AllowedIPs 是否重叠。
- Nginx allow 了还是 403:中间有 LB/CDN,Nginx 看到的是代理 IP;用 real_ip 还原 X-Forwarded-For,或把 allow 列表挪到 LB 层。
面试常问
-
描述零信任架构的核心原则? 永不信任、始终验证:所有主体(人 / 服务)先强认证,按身份 + 设备 + 上下文动态授权,最小权限,全程加密与审计;信任边界从「网络位置」变为「身份」。落地顺序建议:管理入口 → 数据库访问 → 服务间 mTLS,分阶段收口。
-
IPSec 两个阶段? 阶段一 IKE 建立加密的管理通道(IKE SA);阶段二在该通道内协商保护业务流量的 IPSec SA(ESP,隧道 / 传输模式)。
-
如何保证 K8s 集群的东西向安全? NetworkPolicy 默认拒绝 + 按需放行、服务网格 mTLS、最小 RBAC、镜像与运行时安全;网络层只是其中一面。
自测三问
- iptables 规则的匹配顺序是什么?为什么「先 deny any」必错?
- IPSec、WireGuard、SSL VPN 各适合什么场景?
- 你的服务里哪些组件绝不该暴露公网?现在真的没暴露吗?
小结一句话
安全的本质是收敛与验证:口越少越好,每次访问都验身份,而不是信任某个网段;审计自己的暴露面是本课唯一的必做作业。
延伸
- NIST SP 800-207:零信任架构
- 下一课:云网络与自动化——VPC、对等连接与 Ansible。