SSH(Secure Shell)是每个开发者都离不开的远程管理工具,它就像一把安全的钥匙,能让我们在不同网络环境下访问远程服务器。但很多新手第一次配置时,常常被"内网"和"公网"这两个概念搞得晕头转向。我刚开始接触时也踩过不少坑,比如明明在办公室能连上的服务器,回家后就死活连不上,折腾半天才发现是网络环境不同导致的。
简单来说,SSH访问可以分为两种典型场景:局域网访问和公网访问。局域网就像你家或办公室的内部网络,所有设备都在同一个"小圈子"里,互相访问不需要经过外部网络。而公网访问则像是从咖啡馆或家里连接到公司的服务器,需要经过复杂的互联网路由。
这两种访问方式最核心的区别在于IP地址的可见性。局域网使用的是私有IP地址段(比如192.168.1.x),这些地址在互联网上是不可见的。而公网访问需要真实的公网IP地址,就像你家的门牌号,全互联网都能找到它。在实际工作中,我们经常需要根据所处网络环境,选择不同的连接方式。
局域网SSH访问是最简单直接的场景,适合办公室、实验室或家庭网络环境。我管理的一个开发团队就经常使用这种方式,所有开发机都在同一个局域网内,团队成员可以快速互相访问。这种环境有三大优势:
要让局域网内的SSH访问正常工作,我们需要完成以下几个关键步骤:
首先,在目标机器上启动SSH服务。以Ubuntu系统为例:
bash复制# 检查SSH服务状态
sudo systemctl status ssh
# 如果未运行,启动服务
sudo systemctl start ssh
# 设置开机自启
sudo systemctl enable ssh
接着,我们需要知道目标机器的内网IP地址。在终端执行:
bash复制# Linux/macOS
ifconfig | grep "inet "
# Windows
ipconfig
找到类似192.168.x.x或10.x.x.x的地址,这就是我们要连接的IP。最后,从客户端机器连接:
bash复制ssh username@192.168.1.100
在实际使用中,我遇到过几个典型问题:
连接超时:通常是防火墙阻止了SSH端口。可以临时关闭防火墙测试:
bash复制sudo ufw disable
认证失败:检查目标机器上是否存在该用户,以及是否在/etc/ssh/sshd_config中配置了允许登录
网络不可达:确认两台机器在同一个子网,可以使用ping测试连通性
从公网访问内网机器就像要在茫茫互联网中找到你家客厅里的某台电脑,最大的挑战是如何穿透NAT。大多数企业和家庭网络都使用路由器共享一个公网IP,内部设备对外是不可见的。这就需要用到端口转发技术。
我在帮朋友设置远程办公环境时,就遇到过这样的场景:他的开发机在公司内网,但需要在家访问。我们不得不和网络管理员协调,在公司的防火墙上开了一个小口子。
实现公网SSH访问需要完成以下关键步骤:
获取公网IP:联系网络管理员获取公司出口的公网IP,或者在家用路由器上查看WAN口IP
配置端口转发:以常见的TP-Link路由器为例:
动态DNS配置(可选):如果公网IP是动态的,建议设置DDNS:
bash复制# 以no-ip为例
sudo noip2 -C
连接测试:
bash复制ssh -p 2222 user@your-public-ip
公网SSH面临更多安全威胁,我的服务器日志里每天都能看到大量扫描22端口的尝试。必须做好以下防护:
修改默认端口:编辑/etc/ssh/sshd_config:
code复制Port 22222
禁用密码登录:强制使用密钥认证:
code复制PasswordAuthentication no
fail2ban防护:自动封禁暴力破解IP:
bash复制sudo apt install fail2ban
经过多年实践,我总结了一套优化方案。首先调整sshd_config:
code复制# 连接保持
ClientAliveInterval 60
ClientAliveCountMax 3
# 性能优化
UseDNS no
GSSAPIAuthentication no
# 加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
对于特别重要的服务器,我建议启用多因素认证。以Google Authenticator为例:
bash复制sudo apt install libpam-google-authenticator
google-authenticator
然后在sshd_config中添加:
code复制AuthenticationMethods publickey,keyboard-interactive
长期维护远程服务器,我积累了一些实用技巧:
保持会话:使用tmux或screen防止断连
bash复制tmux new -s work
快速登录:配置~/.ssh/config:
code复制Host myserver
HostName 1.2.3.4
Port 22222
User admin
IdentityFile ~/.ssh/id_ed25519
文件传输:
bash复制# SCP方式
scp -P 22222 file.txt myserver:~/