利用ssh隧道端口转发,方便调试内网服务器

目标把内网A主机(IP地址: a.a.a.a) 的80端口,通过外网主机(IP地址: b.b.b.b)端口 8080暴露到公网。

A,B都为CentOS Linux. 并且B不能ssh到A

下面从A测试 ssh -NTR 0.0.0.0:8080:0.0.0.0:80 root@b.b.b.b -p 22

(请先设置B可以让A 采用key方式免密登录。自行Google)

然后在B上面看 netstat -anlp | grep ssh | grep 8080 ,可以看到相应的

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1800/sshd: root
tcp6 0 0 :::8080 :::* LISTEN 1800/sshd: root

在B,需要改写 /etc/ssh/sshd_config 里面 GatewayPorts yes,然后B 重启ssh , systemctl restart sshd

测试端口是否已经转发 curl -v http://b.b.b.b:8080

关于让A可以自动在断线后连接B,可以做如下处理

A修改 /etc/ssh/ssh_config 增加

ServerAliveInterval 10
ServerAliveCountMax 3

B修改 /etc/ssh/sshd_config,增加

ClientAliveInterval 10
ClientAliveCountMax 3

同时A做一个service

vi /usr/lib/systemd/system/ssh-link.service

[Unit]
Description=ssh port forwarding service.
[Service]
Type=simple
ExecStart= /bin/sh -c 'ssh -NT -R 8080:0.0.0.0:80 root@b.b.b.b -p 22'
Restart=always
RestartSec=10
User=root
Group=root
[Install]
WantedBy=multi-user.target

启动
systemctl start ssh-link
加入自动启动
systemctl enable ssh-link

本文参考 :https://segmentfault.com/a/1190000038153088

备注,关于如果B不改写 GatewayPorts yes, 在B上面只能有 127.0.0.1:8080的绑定,不过可以通过nginx的proxy来实现对127.0.0.1:8080的代理,配置代码如下:

stream {
server {
listen 8081;
proxy_pass 127.0.0.1:8080;
}
}

发表评论

邮箱地址不会被公开。 必填项已用*标注