

有一台已经装好 Ubuntu 的机器后,最常见的下一步就是把它当作远端服务器使用:本地电脑通过 ssh 登录,在服务器上跑代码、部署服务、传文件或远程开发。
这篇文章整理一套从零开始的 OpenSSH 配置流程,目标是:
- 局域网内可以 SSH 登录
- 公网或云服务器场景知道该放行哪些端口
- 支持 SSH 密钥登录
- 关闭高风险登录方式,减少被爆破的概率
- 遇到连不上时能快速定位问题
默认环境:
- 服务器:Ubuntu 22.04 / 24.04 或相近版本
- 客户端:Linux / macOS / Windows PowerShell 均可
- SSH 服务端:OpenSSH Server
1. 安装 OpenSSH Server#
在 Ubuntu 服务器上执行:
sudo apt update
sudo apt install -y openssh-serverbash安装完成后启动 SSH 服务,并设置开机自启:
sudo systemctl enable --now sshbash查看服务状态:
sudo systemctl status sshbash如果看到 active (running),说明 SSH 服务已经正常运行。
也可以用下面的命令确认 22 端口是否在监听:
sudo ss -tlnp | grep ':22'bash正常情况下会看到类似:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))text2. 创建一个普通登录用户#
如果你现在只是在本机上用安装系统时创建的用户,也可以直接用这个用户登录。
如果这台机器之后要长期当服务器用,推荐单独创建一个普通用户。
例如创建 hana 用户:
sudo adduser hanabash如果这个用户需要执行 sudo:
sudo usermod -aG sudo hanabash之后就可以用这个用户远程登录:
ssh hana@服务器IPbash不推荐直接用 root 远程登录。服务器日常运维最好使用普通用户登录,需要管理员权限时再通过 sudo 提权。
3. 查看服务器 IP#
局域网 IP#
如果你只需要在同一个 Wi-Fi / 路由器 / 实验室内网里连接,先查看服务器的内网 IP:
hostname -Ibash输出可能类似:
192.168.1.20 172.17.0.1text一般使用 192.168.x.x、10.x.x.x 或 172.16.x.x 到 172.31.x.x 这一类地址。
然后在本地电脑上连接:
ssh hana@192.168.1.20bash第一次连接时会看到主机指纹确认提示:
Are you sure you want to continue connecting (yes/no/[fingerprint])?text确认 IP 没写错后输入:
yestext之后再输入服务器用户密码即可登录。
公网 IP#
如果是云服务器,公网 IP 通常在云厂商控制台里可以直接看到。
如果是放在家里或实验室的物理机器,则需要区分两件事:
- 机器自己的内网 IP,例如
192.168.1.20 - 路由器对外的公网 IP
可以在服务器上查看对外出口 IP:
curl ifconfig.mebash但能看到公网 IP 不代表外部一定能连进来。很多校园网、公司网络、家庭宽带可能处在 NAT 后面,没有可直接访问的公网入口。
4. 开放防火墙端口#
Ubuntu 常用防火墙是 ufw。如果你启用了它,需要允许 SSH 流量。
查看防火墙状态:
sudo ufw statusbash放行 OpenSSH:
sudo ufw allow OpenSSHbash或者明确放行 22 端口:
sudo ufw allow 22/tcpbash如果 ufw 还没启用,可以启用它:
sudo ufw enablebash再次确认:
sudo ufw status numberedbash如果后面你把 SSH 改到了非默认端口,例如 2222,记得提前放行新端口:
sudo ufw allow 2222/tcpbash重点:先放行新端口,再改 SSH 配置。 否则可能把自己锁在服务器外面。
5. 从本地电脑连接服务器#
最基本的 SSH 命令格式是:
ssh 用户名@服务器IPbash例如:
ssh hana@192.168.1.20bash如果 SSH 服务不是默认的 22 端口,需要加 -p:
ssh -p 2222 hana@192.168.1.20bashWindows PowerShell、macOS Terminal、Linux Terminal 都可以直接使用这个命令。
如果 Windows 提示找不到 ssh,可以在系统设置的“可选功能”里安装 OpenSSH Client。
6. 配置 SSH 密钥登录#
密码登录能用,但不适合长期暴露在公网。更推荐使用 SSH 密钥。
6.1 在本地电脑生成密钥#
在本地电脑执行,不是在服务器上执行:
ssh-keygen -t ed25519 -C "your_email@example.com"bash默认会生成:
- 私钥:
~/.ssh/id_ed25519 - 公钥:
~/.ssh/id_ed25519.pub
看到 passphrase 提示时:
- 想安全一些:设置一个私钥密码
- 想省事:直接回车留空
更推荐设置 passphrase,然后配合 ssh-agent 使用。
6.2 把公钥上传到服务器#
Linux / macOS 通常可以直接用:
ssh-copy-id -i ~/.ssh/id_ed25519.pub hana@192.168.1.20bash如果服务器端口不是 22:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 hana@192.168.1.20bashWindows PowerShell 没有 ssh-copy-id 时,可以手动追加公钥:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh hana@192.168.1.20 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"powershell上传完成后测试密钥登录:
ssh hana@192.168.1.20bash如果不再要求输入服务器用户密码,说明密钥登录已经生效。
如果你设置了私钥 passphrase,系统可能会要求输入私钥密码,这是正常的。
7. 配置本地 SSH 别名#
每次输入 ssh -p 2222 hana@1.2.3.4 很麻烦,可以在本地电脑配置 ~/.ssh/config。
Linux / macOS:
nano ~/.ssh/configbashWindows:
notepad $env:USERPROFILE\.ssh\configpowershell添加:
Host my-server
HostName 192.168.1.20
User hana
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 5ssh-config之后直接连接:
ssh my-serverbash如果是 Windows,也可以把私钥路径写成:
IdentityFile C:/Users/YourName/.ssh/id_ed25519ssh-config这套配置对 scp、rsync、VSCode Remote SSH 也都有效。
8. 公网访问需要额外做什么#
局域网能连,不代表公网能连。公网访问取决于你的机器放在哪里。
云服务器#
云服务器通常需要检查三层:
- Ubuntu 里的 SSH 服务是否正常运行
- Ubuntu 防火墙是否放行 SSH 端口
- 云厂商安全组是否放行 SSH 端口
云厂商安全组里至少需要一条入站规则:
协议:TCP
端口:22 或你的自定义端口
来源:你的本地公网 IP,或临时使用 0.0.0.0/0text更安全的做法是只允许自己的公网 IP,而不是长期开放给所有地址。
家里或实验室物理机#
如果服务器在路由器后面,需要在路由器里设置端口转发:
公网 TCP 2222 -> 192.168.1.20:22text外部连接时写:
ssh -p 2222 hana@你的公网IPbash这里推荐把公网端口设成 2222 这类非默认端口,再转发到内网的 22 端口。
这不能替代密钥和安全配置,但可以减少一些默认端口扫描噪音。
如果你的网络没有公网 IP,或者被校园网 / 公司网 NAT 隔离,可以考虑:
- Tailscale / ZeroTier 这类内网穿透组网工具
- WireGuard 自建 VPN
- 云服务器反向 SSH 隧道
不要为了省事把路由器后台、服务器密码登录和弱密码一起暴露到公网。
9. 安全加固 SSH 服务端#
确认密钥登录已经成功后,再进行安全加固。
Ubuntu 的 OpenSSH 配置主文件是:
/etc/ssh/sshd_configtext更推荐把本地自定义配置放到:
/etc/ssh/sshd_config.d/99-local.conftext这样以后系统升级时更清晰。
创建配置文件:
sudo nano /etc/ssh/sshd_config.d/99-local.confbash写入:
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
X11Forwarding no
AllowUsers hanassh-config含义:
PermitRootLogin no:禁止 root 远程登录PubkeyAuthentication yes:允许公钥登录PasswordAuthentication no:禁止密码登录KbdInteractiveAuthentication no:关闭键盘交互式密码认证X11Forwarding no:关闭不常用的图形转发AllowUsers hana:只允许指定用户登录
如果你有多个用户,可以写成:
AllowUsers hana deploy ubuntussh-config保存后先检查配置语法:
sudo sshd -tbash没有输出通常表示语法正确。然后重载 SSH:
sudo systemctl reload sshbash不要立刻关闭当前 SSH 窗口。
请打开一个新的终端窗口,再测试一次:
ssh my-serverbash确认新连接可以登录后,再退出旧连接。
10. 是否需要修改默认端口#
修改默认端口不是必须项。它不能真正替代密钥登录和防火墙策略,但能减少自动化扫描日志。
如果要把 SSH 端口改成 2222,先放行新端口:
sudo ufw allow 2222/tcpbash然后编辑本地配置文件:
sudo nano /etc/ssh/sshd_config.d/99-local.confbash添加或修改:
Port 2222ssh-config检查配置并重载:
sudo sshd -t
sudo systemctl reload sshbash新开一个终端测试:
ssh -p 2222 hana@服务器IPbash确认新端口可用后,再考虑删除旧的防火墙规则。
11. 安装 fail2ban(可选)#
如果服务器必须暴露在公网,并且你还保留了密码登录,建议至少安装 fail2ban。
即使已经关闭密码登录,fail2ban 也可以减少日志里的暴力扫描噪音。
安装:
sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2banbash查看状态:
sudo systemctl status fail2banbash查看 SSH jail:
sudo fail2ban-client status sshdbash如果只是内网服务器,可以先不装,避免引入额外变量。
12. 常见问题排查#
12.1 Connection timed out#
一般是网络路径不通,重点检查:
- IP 是否写对
- 端口是否写对
- 服务器是否开机
ufw是否放行- 云服务器安全组是否放行
- 路由器端口转发是否正确
- 是否处在不可入站的 NAT 网络后面
服务器上看端口监听:
sudo ss -tlnp | grep sshbash本地测试端口连通性:
nc -vz 服务器IP 22bashWindows PowerShell 可以用:
Test-NetConnection 服务器IP -Port 22powershell12.2 Connection refused#
通常说明网络到了服务器,但目标端口没有服务在监听。检查:
sudo systemctl status ssh
sudo ss -tlnp | grep ':22'bash如果 SSH 没启动:
sudo systemctl restart sshbash12.3 Permission denied#
这类错误通常是认证失败。检查:
- 用户名是否正确
- 公钥是否写入服务器的
~/.ssh/authorized_keys - 服务器是否禁用了密码登录
- 本地是否用了正确的私钥
~/.ssh权限是否正确
在服务器上修复权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysbash在本地指定私钥测试:
ssh -i ~/.ssh/id_ed25519 hana@服务器IPbash12.4 改配置后彻底连不上#
如果是云服务器,优先使用云厂商控制台的 VNC / Web Terminal 登录修复。
如果是物理机,需要接显示器或通过管理口进入。
常见恢复动作:
sudo sshd -t
sudo systemctl status ssh
sudo nano /etc/ssh/sshd_config.d/99-local.conf
sudo systemctl reload sshbash所以修改 SSH 配置时,一定要遵守这个顺序:
- 保留当前 SSH 会话
- 修改配置
- 执行
sudo sshd -t - 执行
sudo systemctl reload ssh - 新开终端测试新连接
- 确认无误后再关闭旧会话
13. 一套推荐的最终配置#
如果是个人长期使用的 Ubuntu 服务器,我通常会采用:
- 普通用户登录,不允许 root 登录
- SSH 密钥登录
- 禁止密码登录
ufw只放行必要端口- 云服务器安全组只允许自己的 IP 访问 SSH
- 本地配置
~/.ssh/config别名 - 长任务放在
tmux里跑
最小可用服务端配置:
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
X11Forwarding no
AllowUsers hanassh-config本地客户端配置:
Host my-server
HostName 服务器IP
User hana
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 5ssh-config以后连接只需要:
ssh my-serverbash到这里,这台 Ubuntu 机器就已经可以作为一台基础远端服务器使用了。后续可以继续接上 VSCode Remote SSH、scp、rsync、tmux 等工具,形成完整的远程开发工作流。