SSH 安全加固

七月 18, 2025 [linux] #ssh #security #port-forwarding #fail2ban

SSH 安全加固

服务端配置

/etc/ssh/sshd_config

Port 12345                                     # 修改默认端口
Protocol 2                                     # 仅使用新协议
PasswordAuthentication no                      # 禁用密码登录
PermitEmptyPasswords no                        # 禁止空密码
PermitRootLogin no                             # 禁止 root 登录
PubkeyAuthentication yes                       # 启用密钥认证
UseDNS no                                      # 禁用 DNS 解析(加速登录)
MaxAuthTries 3                                 # 限制认证尝试次数
X11Forwarding no                               # 禁用 X11 转发
AllowTcpForwarding no                          # 禁用端口转发(按需)
AllowAgentForwarding no                        # 禁用 agent 转发
ClientAliveInterval 120                        # 心跳间隔
ClientAliveCountMax 3                          # 心跳超时次数
HostBasedAuthentication no                     # 禁用基于主机的认证
IgnoreRhosts yes                               # 忽略 .rhosts
PermitUserEnvironment no                       # 禁止用户环境变量
LoginGraceTime 60                              # 登录超时

加密算法加固

Ciphers aes256-ctr,aes128-ctr,aes192-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
MACs umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key

密钥文件权限

chmod 0644 /etc/ssh/*pub
chmod 0600 /etc/ssh/*key
chown root:root /etc/ssh/sshd_config
chmod og-rwx /etc/ssh/sshd_config

重建 Moduli

ssh-keygen -G moduli-2048.candidates -b 2048
ssh-keygen -T moduli-2048 -f moduli-2048.candidates
cp moduli-2048 /etc/ssh/moduli
rm moduli-2048

客户端配置

# 生成 ed25519 密钥
ssh-keygen -t ed25519

# 上传公钥
ssh-copy-id user@host

~/.ssh/config

Host short
  HostName 192.168.1.x
  Port 12345
  User peter
  IdentityFile ~/.ssh/id_ed25519

Fail2Ban 防暴力破解

apt install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑 [sshd]: enabled = true
systemctl restart fail2ban

防火墙

# ufw
sudo ufw allow from <IP> to any port 22

# iptables
iptables -I INPUT -p tcp -s <IP> --dport 22 -j ACCEPT

# firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP>" port protocol="tcp" port="22" accept'

ssh-audit 安全审计

pip3 install ssh-audit
ssh-audit <remote.server>

端口转发

本地转发

ssh -L 本地IP:本地端口:目标IP:目标端口 user@ssh-server

DNS 解析发生在 SSH 服务器端(internal_db.localssh.sshgateway.com 解析)。

动态转发(SOCKS)

ssh -D 8800 user@host
export https_proxy=socks5://127.0.0.1:8800

注意:本地有 IPv6 但代理服务器只有 IPv4 时,对 IPv6 站点的访问会失败。临时解决:

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

跳板机(Jump Host)

ssh -J user@jump-host:port target@internal

~/.ssh/config

Host internal
  HostName 192.168.2.x
  User peter
  ProxyJump user@jump-host

跳板机用户可使用 /usr/sbin/nologin 作为 shell,仅允许端口转发而不允许交互登录。