定制化 SSH VPN 专用服务器方案

定制化 SSH VPN 专用服务器方案

PS: 没啥用, 仅供参考


定制化 SSH VPN 专用服务器方案

针对「服务器仅用于 SSH VPN」的场景,以下是优化后的安全实施方案,实现 客户端零配置 + 服务器自动鉴权


一、服务器端配置(一次性操作)

1. 创建专用 VPN 用户

1
2
sudo useradd -r -s /usr/sbin/nologin vpn-tunnel  # 创建无登录权限的系统用户
sudo mkdir -p /home/vpn-tunnel/.ssh

2. 生成服务器专用密钥对

1
2
3
4
5
# 在服务器上生成密钥(仅需执行一次)
sudo ssh-keygen -t ed25519 -f /etc/ssh/vpn-server-key -N "" -C "vpn-server@company"

# 设置权限
sudo chmod 600 /etc/ssh/vpn-server-key*

3. 配置自动授权

1
2
3
# 将公钥设为 VPN 用户的唯一授权方式
sudo cp /etc/ssh/vpn-server-key.pub /home/vpn-tunnel/.ssh/authorized_keys
sudo chown -R vpn-tunnel:vpn-tunnel /home/vpn-tunnel/.ssh

4. 加固 SSH 配置 (/etc/ssh/sshd_config)

1
2
3
4
5
6
7
8
9
# 限制 VPN 用户权限
Match User vpn-tunnel
AllowTcpForwarding no # 禁用端口转发
PermitTunnel yes # 允许创建隧道
ForceCommand /bin/false # 禁止执行任何命令
AuthenticationMethods publickey
PermitRootLogin no
X11Forwarding no
AllowAgentForwarding no

5. 应用配置

1
sudo systemctl restart sshd

二、客户端零配置连接方案

方案 A:预共享密钥(适合内网可信环境)

  1. 获取服务器私钥
    将服务器生成的 /etc/ssh/vpn-server-key 私钥分发给客户端,保存为 ~/.ssh/vpn-default-key

  2. 建立连接

    1
    sshuttle --ssh "ssh -i ~/.ssh/vpn-default-key" -r vpn-tunnel@10.0.1.90 0.0.0.0/0

方案 B:证书认证(更安全,适合生产环境)

1
2
3
4
5
6
7
# 在服务器上生成 CA 证书
sudo ssh-keygen -t ed25519 -f /etc/ssh/ca_key -N ""

# 签署 VPN 用户证书(有效期 30 天)
sudo ssh-keygen -s /etc/ssh/ca_key -I "vpn-cert" -n vpn-tunnel -V +30d /home/vpn-tunnel/.ssh/authorized_keys

# 客户端只需信任 CA 公钥即可连接

三、自动化连接脚本

创建一键连接脚本 vpn-connect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
SERVER_IP="10.0.1.90"
TUN_KEY="vpn-default-key"

# 自动检测本地密钥
if [ ! -f ~/.ssh/$TUN_KEY ]; then
echo "下载默认 VPN 密钥..."
curl -s https://internal.company.com/vpn-keys/$TUN_KEY > ~/.ssh/$TUN_KEY
chmod 600 ~/.ssh/$TUN_KEY
fi

# 静默启动 VPN
sshuttle --ssh "ssh -i ~/.ssh/$TUN_KEY -o StrictHostKeyChecking=no" \
-r vpn-tunnel@$SERVER_IP 0.0.0.0/0 \
--daemon --pidfile /tmp/sshuttle.pid

echo "VPN 已启动 (PID: $(cat /tmp/sshuttle.pid))"

四、安全增强措施

安全层级 实施方法
网络隔离 服务器绑定 VPN 专用网卡,仅开放 SSH 端口
密钥轮换 通过 cron 每周自动更新服务器密钥,客户端脚本同步获取新密钥
连接审计 服务器记录所有 VPN 连接日志到 /var/log/ssh-vpn.log
流量限制 使用 iptables 限制每个客户端的带宽和并发连接数
双因子认证 集成 Google Authenticator 实现动态口令(需修改 SSH PAM 配置)

五、方案优势对比

特性 预共享密钥方案 证书认证方案
部署复杂度 低(适合小型团队) 中(需要 CA 管理)
安全性 依赖密钥保管 自动过期 + 吊销列表
客户端更新需求 密钥变更需重新分发 无需更新客户端
适合场景 内部测试/临时使用 生产环境/长期运维

六、运维监控建议

  1. 状态检查脚本 (check-vpn.sh)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    # 检查活跃连接
    netstat -tn | grep ':22' | grep ESTABLISHED

    # 监控流量
    vnstat -i tun0 -tr 5

    # 自动重启(如果进程不存在)
    pgrep sshuttle || /path/to/vpn-connect
  2. Prometheus 监控指标

    1
    2
    3
    4
    5
    6
    7
    # 暴露 SSH 隧道指标
    - job_name: 'ssh_vpn'
    static_configs:
    - targets: ['10.0.1.90:9100']
    metrics_path: /probe
    params:
    module: [ssh_tunnel]

七、应急预案

  1. 快速封锁用户

    1
    2
    # 实时移除授权
    sudo sed -i '/user-pubkey/d' /home/vpn-tunnel/.ssh/authorized_keys
  2. 紧急切换端口

    1
    2
    # 使用 socat 临时重定向流量
    socat TCP-LISTEN:2222,fork TCP:10.0.1.90:22
  3. 全流量捕获分析

    1
    sudo tcpdump -i tun0 -w vpn-traffic.pcap

通过此方案,您将获得:

  • 客户端:无需管理密钥,一键连接
  • 服务端:自动化的密钥生命周期管理
  • 安全:企业级防护与监控能力
  • 运维:完善的应急和审计机制

可根据实际需求选择预共享密钥或证书认证方案,平衡安全性与易用性。