Linux 服务器连接公网安全配置
一、核心原则
Linux 服务器一旦连接公网,就会持续遭遇自动化扫描、弱口令爆破、漏洞探测。安全配置的目标不是“绝对安全”,而是做到:
- 不暴露不必要端口;
- 不允许密码登录 SSH;
- 只允许可信设备远程连接;
- 系统和软件保持更新;
- 出现异常登录和攻击时能被阻断;
- 重要服务尽量放在内网或 Tailscale 等虚拟专网中访问。
最重要的一条:公网服务器只开放必须开放的端口。
二、初始登录后先做的事
1. 更新系统
Ubuntu / Debian:
sudo apt update
sudo apt upgrade -y
CentOS / Rocky / AlmaLinux:
sudo dnf update -y
2. 创建普通用户
不要长期使用 root 直接操作。
adduser yourname
usermod -aG sudo yourname
然后切换到新用户:
su - yourname
测试 sudo:
sudo whoami
如果返回:
root
说明权限正常。
三、配置 SSH 安全登录
1. 在本地电脑生成 SSH 密钥
在本地电脑执行:
ssh-keygen -t ed25519 -C "[email protected]"
一路回车即可。
生成后一般会有两个文件:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
其中 .pub 是公钥,可以放到服务器;没有 .pub 的私钥不能泄露。
2. 把公钥上传到服务器
在本地电脑执行:
ssh-copy-id yourname@服务器IP
如果没有 ssh-copy-id,也可以手动复制公钥内容:
cat ~/.ssh/id_ed25519.pub
然后在服务器上执行:
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
把公钥粘贴进去,保存后执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. 修改 SSH 配置
编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
建议修改或确认以下内容:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
Port 22
排查
sudo grep -RInE 'Include|PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication|PermitRootLogin|PubkeyAuthentication|Match' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
如果想降低自动扫描干扰,也可以把 SSH 端口改成其他端口,例如:
Port 2222
注意:改端口不是核心安全措施,只是减少噪音。真正关键是关闭密码登录。
4. 重启 SSH 服务
Ubuntu / Debian:
sudo systemctl restart ssh
CentOS / Rocky / AlmaLinux:
sudo systemctl restart sshd
重启前不要关闭当前终端窗口。另开一个新窗口测试是否能登录:
ssh yourname@服务器IP
如果改了端口:
ssh -p 2222 yourname@服务器IP
确认新窗口可以登录后,再关闭旧窗口。
四、配置防火墙
1. Ubuntu / Debian 使用 UFW
安装 UFW:
sudo apt install ufw -y
允许 SSH:
sudo ufw allow 22/tcp
如果 SSH 改成 2222:
sudo ufw allow 2222/tcp
如果服务器要提供网站服务:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status
推荐状态是只开放必要端口,例如:
22/tcp
80/tcp
443/tcp
2. 不需要公网访问的服务不要开放
例如下面这些端口,除非明确知道自己在做什么,否则不要开放到公网:
3306 MySQL
5432 PostgreSQL
6379 Redis
27017 MongoDB
8080 管理后台
9000 面板或内部服务
数据库、后台管理、监控面板,原则上只允许本机或内网访问。
五、安装 Fail2ban 防爆破
Fail2ban 可以自动封禁频繁尝试登录失败的 IP。
Ubuntu / Debian:
sudo apt install fail2ban -y
启动并设置开机自启:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
查看状态:
sudo systemctl status fail2ban
查看 SSH 防护情况:
sudo fail2ban-client status sshd
六、使用 Tailscale 降低公网暴露
更安全的做法是:SSH 不直接暴露到公网,而是通过 Tailscale 访问。
1. 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
启动:
sudo tailscale up
按提示登录账号。
2. 查看 Tailscale 内网 IP
tailscale ip -4
之后可以通过这个 IP 登录服务器:
ssh yourname@Tailscale内网IP
3. 关闭公网 SSH,只允许 Tailscale 访问
确认 Tailscale 登录正常后,可以让防火墙只允许 Tailscale 网卡访问 SSH。
示例:
sudo ufw delete allow 22/tcp
sudo ufw allow in on tailscale0 to any port 22 proto tcp
如果 SSH 是 2222:
sudo ufw delete allow 2222/tcp
sudo ufw allow in on tailscale0 to any port 2222 proto tcp
这样公网无法直接 SSH 登录,只能通过 Tailscale 登录。
七、检查当前开放端口
执行:
sudo ss -tulpen
重点看 LISTEN 状态的端口。
如果看到服务监听在:
0.0.0.0:端口
说明它对所有公网网卡开放。
如果只监听:
127.0.0.1:端口
说明只允许本机访问,相对安全。
八、设置自动安全更新
Ubuntu / Debian:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure unattended-upgrades
选择启用自动安全更新。
九、普通用户不要安装来路不明脚本
不要随便执行这种命令:
curl 某个网址 | bash
wget 某个网址 -O- | sh
除非来源可信,并且知道脚本做了什么。
风险包括:
- 创建隐藏用户;
- 修改 SSH 配置;
- 安装挖矿程序;
- 上传服务器密钥;
- 关闭安全服务。
十、推荐的最低安全配置
适合普通 VPS 或家庭服务器:
- 禁止 root 登录;
- 禁止 SSH 密码登录;
- 使用 SSH 密钥登录;
- 只开放必要端口;
- 安装并启用 UFW;
- 安装 Fail2ban;
- 使用 Tailscale 远程管理;
- 数据库、后台、面板不暴露公网;
- 定期更新系统;
- 重要数据定期备份。
十一、常见错误
错误一:只改 SSH 端口,以为就安全了
改端口只能减少扫描噪音,不能替代密钥登录和关闭密码登录。
错误二:公网开放数据库端口
数据库端口暴露公网是高危行为。MySQL、Redis、PostgreSQL 等应只允许本机、内网或 Tailscale 访问。
错误三:长期使用 root 用户
root 权限太高,一旦被攻破,攻击者可以完全控制服务器。
错误四:防火墙规则没确认就断开 SSH
修改 SSH 或防火墙时,一定要保留一个已登录窗口,再开新窗口测试登录成功后再退出。
错误五:把服务器登录信息交给不可信工具
AI Agent、自动化脚本、远程管理工具可以提高效率,但必须限制权限。不要直接把 root 密码交给未知工具。
十二、最终检查清单
执行以下检查:
sudo ufw status
确认只开放必要端口。
sudo ss -tulpen
确认没有不该暴露的服务。
sudo grep -E "PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|Port" /etc/ssh/sshd_config
确认 SSH 安全配置正确。
sudo fail2ban-client status
确认 Fail2ban 正常运行。
tailscale status
确认 Tailscale 正常在线。
如果以上都正常,服务器的基础公网安全配置基本完成。