文章目录
仅靠ssh,等只能实现同局域网下的服务器访问,本文介绍使用cpolar内网穿透工具实现非同局域网下的访问,不需要公网ip或云服务器。
基于cpolar实现远程
依赖
远程:1804 ubuntu
软件依赖:ssh,xrdp, cpolar
本地:win10
软件依赖:mstsc.exe(远程桌面)
cpolar安装
1.登录官网,注册账号
https://www.cpolar.com/
2.远程ubuntu安装cpolar
2.1 下载安装cpolar
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
或
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh >install-release-cpolar.sh && bash install-release-cpolar.sh
(国外使用)
curl -sL https://git.io/cpolar | sudo bash
2.2 添加及启动服务
添加cpolar服务
sudo systemctl enable cpolar
启动cpolar服务:
sudo systemctl start cpolar
查看服务状态,如正常显示为active则状态启动正常
sudo systemctl status cpolar
- 查看及隧道创建
通过浏览器访问127.0.0.1:9200
或locahost:9200
,而后使用注册的cpolar账号登录。
登录成功后,点击左上角三横:
点击隧道管理,创建隧道:
输入如下配置,点击创建远程桌面的ip及端口
查看隧道:
画出红线部分为公网ip
隧道名称:可自定义填写,注意不要重复即可
协议:支持http/https/tcp协议,这里选择http
本地地址:填写内网端口号,如8080
域名类型:免费选择随机
地区:选择China或者China vip
参考:https://blog.csdn.net/LisaCpolar/article/details/124320497
使用
终端访问
打开本地shell,或安装ssh的命令行
输入:
ssh -p [端口号] [hostname]@[公网ip]
确认私钥,输入密码登录。
【公网ip:生成端口号】与前文创建的ssh的公网地址(默认就会创建)一致,如下示例:
传输文件
#从远程机拷贝文件到本地
scp -P [端口号] [hostname]@[公网ip]:[文件路径] [本机路径]
#从本地拷贝到远程机
scp -P [端口号] [本机路径] [hostname]@[公网ip]:[文件路径]
#拷贝文件夹
scp -r -P [端口号] [本机路径] [文件路径]
#eg:
scp -r -P 13890 abc@9.tcp.cpolar.top:~/Desktop/pkg/ .
远程桌面访问
打开远程桌面:
输入:[公网ip:生成端口号],连接,输入账号密码。
【公网ip:生成端口号】与前文创建的remote-desk的公网地址一致,如下例子:
参考链接https://www.cpolar.com/blog/windows10-remote-desktop?channel=0&invite=4Mz5#3
其他方案
需要公网ip服务器或云服务器
以下是支持SSH协议且免费安全的内网穿透工具推荐(综合性能与易用性均优于或接近cpolar):
FRP:高性能,支持TCP,适合技术用户
NATOOL:图形界面,动态DNS,适合新手
NPS:轻量级,Web管理
ZeroTier:P2P加密,适合多设备
一、FRP (Fast Reverse Proxy)
SSH支持:通过TCP协议映射本地SSH端口(默认22),实现远程安全访问内网服务器。
核心优势:
高性能反向代理:采用C/S架构,支持负载均衡和健康检查,保障SSH连接稳定性。
自定义配置:可设置访问密码、限制IP白名单,提升安全性。
部署建议:需自建服务端(如云服务器),技术门槛较高,适合开发者或运维人员。
二、NATOOL
SSH支持:通过TCP隧道将内网SSH服务暴露至公网,支持域名绑定。
核心优势:
图形化操作:提供可视化界面,一键生成SSH穿透配置,新手友好。
动态DNS:自动更新域名解析,解决内网IP变动问题。
适用场景:家庭NAS、远程维护小型服务器等轻量级需求。
三、NPS (Network Port Shield)
SSH支持:支持TCP端口映射,兼容SSH、远程桌面等协议。
核心优势:
Web管理端:通过浏览器配置SSH穿透规则,操作便捷。
轻量化设计:资源占用低,适合部署在低配置服务器或树莓派。
安全性:支持隧道加密和客户端身份验证,防止未授权访问。
四、ZeroTier
SSH支持:基于虚拟局域网(SD-WAN)实现P2P直连,无需端口映射即可SSH访问内网设备。
核心优势:
端到端加密:采用AES-256加密,安全性高于传统穿透工具。
跨平台兼容:支持Windows/Linux/Mac/移动端,适合多设备协同。
不足:需在所有设备安装客户端,且免费版限100台设备。
五、Ngrok(临时备用)
SSH支持:通过TCP隧道生成公网地址,临时测试可用。
缺点:免费版域名随机、连接不稳定,仅建议短期调试使用。
综合建议:
技术用户/高稳定性需求:首选FRP或NPS,功能全面且可控性强。
小白用户/快速部署:推荐NATOOL(图形化)或ZeroTier(免配置)。
临时场景:可尝试Ngrok,但需接受稳定性风险。
再其他
在 Ubuntu 上实现安全的内网穿透并远程访问 SSH,需结合加密传输、身份验证和最小化暴露等安全原则。以下是几种高安全性的方案:
⚠️ 安全前置条件(必须配置)
-
禁用 SSH 密码登录
修改/etc/ssh/sshd_config
:PasswordAuthentication no PermitRootLogin no
重启 SSH 服务:
sudo systemctl restart sshd
-
使用 SSH 密钥对
生成强密钥(Ed25519):ssh-keygen -t ed25519 -a 100 -C "your_email@example.com"
-
防火墙限制
仅允许必要端口(如 SSH 的 22 端口):sudo ufw allow 22/tcp sudo ufw enable
方案 1:Tailscale(基于 WireGuard 的零配置 VPN)
优势:自动 NAT 穿透、端到端加密、无需公网 IP
适用场景:个人或小团队远程访问
-
安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
-
启动并认证
sudo tailscale up
按提示打开链接登录账号(支持 Google/GitHub 等 SSO)。
-
直接 SSH 访问
在另一台设备登录 Tailscale 后,直接通过 Tailscale 分配的 IP 连接:ssh user@100.x.y.z
安全增强:
- 在 Tailscale 控制台启用 双因素认证 (2FA)。
- 设置 访问策略(限制设备访问权限)。
方案 2:WireGuard VPN(手动部署)
优势:轻量级、高性能、现代加密协议
适用场景:对网络控制有更高要求的用户
-
安装 WireGuard
sudo apt update && sudo apt install wireguard
-
生成密钥对
umask 077 wg genkey | tee privatekey | wg pubkey > publickey
-
服务端配置(有公网 IP 的服务器)
创建/etc/wireguard/wg0.conf
:[Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = <SERVER_PRIVATE_KEY> [Peer] PublicKey = <CLIENT_PUBLIC_KEY> AllowedIPs = 10.0.0.2/32
-
客户端配置(内网 Ubuntu 主机)
创建/etc/wireguard/wg0.conf
:[Interface] Address = 10.0.0.2/24 PrivateKey = <CLIENT_PRIVATE_KEY> [Peer] PublicKey = <SERVER_PUBLIC_KEY> Endpoint = <SERVER_PUBLIC_IP>:51820 AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 25
-
启动 WireGuard
sudo systemctl enable --now wg-quick@wg0
-
通过 VPN 连接 SSH
ssh user@10.0.0.2
方案 3:SSH 反向隧道(无 VPN)
优势:无需额外工具,仅用 SSH 原生功能
适用场景:临时访问或资源有限的环境
-
在内网主机创建反向隧道
ssh -R 2222:localhost:22 -N -f user@jump-server.com
-R 2222:localhost:22
:将跳板机的 2222 端口转发到内网主机的 22 端口。-N -f
:后台运行不执行命令。
-
通过跳板机连接内网主机
在跳板机上执行:ssh -p 2222 localhost
安全加固:
- 使用
autossh
保持隧道稳定:autossh -M 0 -R 2222:localhost:22 user@jump-server.com
- 在跳板机限制来源 IP:
sudo ufw allow from YOUR_IP to any port 2222
🔒 通用安全建议
-
定期更新系统:
sudo apt update && sudo apt upgrade -y
-
监控登录尝试:
sudo grep 'sshd' /var/log/auth.log
-
限制 SSH 访问 IP(若有固定公网 IP):
sudo ufw allow from YOUR_IP to any port 22
方案对比
方案 | 安全性 | 易用性 | 稳定性 | 适用场景 |
---|---|---|---|---|
Tailscale | ★★★★★ | ★★★★★ | ★★★★★ | 个人/团队长期使用 |
WireGuard | ★★★★★ | ★★★☆☆ | ★★★★☆ | 自定义网络拓扑 |
SSH 反向隧道 | ★★★☆☆ | ★★☆☆☆ | ★★☆☆☆ | 临时访问 |
推荐优先级:Tailscale > WireGuard > SSH 反向隧道。选择时需权衡安全需求与运维复杂度。
以下是使用强密钥对配置 SSH 服务端并通过密钥登录的完整流程:
一、生成强密钥对(客户端操作)
1. 生成 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -a 100 -C "your_comment"
-t ed25519
:使用更安全的 Ed25519 算法-a 100
:增加密钥派生迭代次数增强抗暴力破解-C "备注"
:添加密钥注释(如邮箱)
2. 生成过程中按需配置
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [直接回车]
Enter passphrase (empty for no passphrase): [输入密钥保护密码(强烈建议设置)]
3. 生成结果
~/.ssh/id_ed25519 # 私钥(绝不可泄露)
~/.ssh/id_ed25519.pub # 公钥(需上传到服务端)
二、配置 SSH 服务端(Ubuntu 服务器)
1. 创建 .ssh
目录(如不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
2. 将公钥写入 authorized_keys
# 方法 1:手动复制(适合单次操作)
cat id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 方法 2:使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
3. 修改 SSH 服务端配置
编辑 /etc/ssh/sshd_config
:
sudo nano /etc/ssh/sshd_config
关键配置项:
PubkeyAuthentication yes # 启用密钥认证
AuthorizedKeysFile .ssh/authorized_keys # 公钥存储路径
PasswordAuthentication no # 禁用密码登录
PermitRootLogin no # 禁止 root 直接登录
ChallengeResponseAuthentication no # 关闭交互认证
4. 重启 SSH 服务
sudo systemctl restart sshd
三、客户端通过密钥登录
1. 基础连接命令
ssh -i ~/.ssh/id_ed25519 user@server_ip
2. 简化登录(配置 ~/.ssh/config
)
nano ~/.ssh/config
添加内容:
Host myserver
HostName server_ip
User username
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
之后可直接用别名登录:
ssh myserver
3. 带密码短语的密钥自动管理
# 启动 ssh-agent
eval "$(ssh-agent -s)"
# 添加密钥到 agent
ssh-add ~/.ssh/id_ed25519
(输入一次密码短语后,后续连接无需重复输入)
四、安全增强措施
1. 服务端防火墙配置
sudo ufw allow from your_client_ip to any port 22
sudo ufw enable
2. 修改 SSH 端口(可选)
编辑 /etc/ssh/sshd_config
:
Port 49200 # 改为高位端口(需同步修改防火墙规则)
3. Fail2Ban 安装
sudo apt install fail2ban
sudo systemctl enable fail2ban
五、故障排查
1. 调试连接问题
ssh -vT user@server_ip # -v 查看详细日志
2. 检查服务端日志
sudo tail -f /var/log/auth.log
3. 常见错误解决
- Permission denied (publickey)
检查项:- 服务端
sshd_config
是否启用PubkeyAuthentication
- 客户端密钥路径是否正确
authorized_keys
文件权限是否为 600- SELinux/AppArmor 是否阻止访问
- 服务端
六、密钥管理最佳实践
-
私钥保护:
- 不要共享私钥
- 使用密码短语保护
- 定期轮换密钥(建议每 6-12 个月)
-
多主机管理:
# 为不同服务使用不同密钥 ssh-keygen -t ed25519 -f ~/.ssh/work-server-key
-
撤销密钥:
直接删除服务端authorized_keys
中对应公钥即可