利用阿里云服务器反向代理实现远程连接内网服务器

利用阿里云服务器反向代理实现远程连接内网服务器

建立连接需求:

  • 目标服务器A:可以访问外网
  • 公网服务器B:具有公网IP
  • 本地设备C:可以访问外网

1.ssh连接

刚买的服务器需要重置root密码。在实例的控制台上在线远程连接,然后点击重置密码。该密码即为root密码。随后即可通过ssh username@ipaddr连接服务器。

设置密钥连接

首先在本地找到密钥对:

1
cat ~/.ssh/id_rsa.pub

复制下来,随后

1
2
3
4
5
6
7
8
## 连接到服务器:
ssh user@ipaddr
## 在远程操作:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
vi ~/.ssh/authorized_keys

把cat出来的公钥复制到服务器上,即可完成密钥连接设置。

也可以使用ssh-copy-id(如果有):

1
ssh-copy-id -p 5000 root@ip

还需要在/etc/ssh/sshd_config里,把

1
2
GatewayPorts yes
AllowTcpForwarding yes

改成可用,并设置防火墙策略打开5000端口:

1
2
sudo ufw allow 5000/tcp
sudo ss -tulnp | grep :5000

提高安全性

/etc/ssh/sshd_config里设置:

1
PasswordAuthentication no

以禁止密码连接。

禁用了密码登录后,可以免疫最常见的扫描爆破攻击。进一步提高安全性:

  • 设置fail2ban策略 (小心自己被关在外面,别问我怎么知道会被关在外面)
  • 设置knockd端口敲门
  • 仅允许本地所在网段进行连接
  • 禁用22端口,改用其他端口登录ssh

2.反向ssh

在需要连接的服务器上,使用命令建立隧道:

1
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax=3" -NTR *:5000:localhost:22 root@**.**.***.***

测试:

1
2
3
4
5
6
7
8
# 目标服务器A检查autossh进程
ps aux | grep 5000

# 公网服务器B查看端口监听情况
sudo ss -tulnp | grep :5000

# 本地通过隧道远程连接
ssh -J root@**.**.***.*** username@localhost -p 5000

访问对应服务器的web应用

转发目标服务器的5010端口到本地8080:

1
ssh -L 8080:localhost:5010 -J root@**.**.***.*** username@localhost -p 5000

此时本地就可以访问localhost:8080来访问目标服务器开在5010的服务了

升级为systemctl服务

首先建立系统服务文件:

1
sudo vi /etc/systemd/system/autossh-tunnel.service

编辑内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[Unit]
Description=AutoSSH tunnel service for port 5000 to **.**.***.***
# 确保网络连接后再启动
After=network-online.target 
# 同上,更强的依赖
Wants=network-online.target 
# 允许无限次尝试重启
# StartLimitIntervalSec=0 

[Service]
User=root
Group=root
# 设置一些 autossh 环境变量,特别是 AUTOSSH_GATETIME=0 很重要,因为它不再使用 -f
Environment="AUTOSSH_GATETIME=0"
# 可选,方便管理
Environment="AUTOSSH_PIDFILE=/run/autossh-tunnel.pid" 

# 执行的命令,注意:
# 1. 使用 autossh 的完整路径 (通常是 /usr/bin/autossh,可用 which autossh 确认)
# 3. 不再需要 -f 参数,systemd 会负责后台运行
# 4. 明确使用 -M 0 或其他监控端口
# 5. 包含所有必要的 SSH 选项 (-N, -T, -R, -o)
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax=3" -NTR *:5000:localhost:22 root@**.**.***.***

# 定义如何停止服务 (给 autossh 主进程发送终止信号)
ExecStop=/bin/kill -TERM $MAINPID

# 自动重启设置
# 无论什么原因退出,总是尝试重启
Restart=always      
# 重启前等待 10 秒
RestartSec=10       

# 日志记录设置 (将输出重定向到 systemd journal)
StandardOutput=journal
StandardError=journal
# 在 journal 中的标识符
SyslogIdentifier=autossh-tunnel 

[Install]
# 表明这个服务应该在多用户模式下启用
WantedBy=multi-user.target 

启用服务:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable autossh-tunnel.service
sudo systemctl start autossh-tunnel.service

检查:

1
2
3
4
5
sudo systemctl status autossh-tunnel.service
# 查看该服务的实时日志 (-f)
sudo journalctl -u autossh-tunnel.service -f
# 查看该服务的所有日志
sudo journalctl -u autossh-tunnel.service
Total hits!