SSH 安全加固
七月 18, 2025 [linux] #ssh #security #port-forwarding #fail2banSSH 安全加固
服务端配置
/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.local 由 ssh.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,仅允许端口转发而不允许交互登录。