内网穿透之SSH反向隧道

DNS #

将一个域名(aaa.bbb.com)用A记录解析到你的服务器ip(123.456.789)

服务器设置 #

安装SSH服务器软件 #

sudo apt-get install openssh-server // ubuntu
sudo yum install openssh-server // centos

配置SSH服务器 #

编辑SSH服务器的配置文件。在Ubuntu或CentOS中,配置文件通常位于/etc/ssh/sshd_config。在配置文件中,请确保以下选项设置为“yes” sudo nano /etc/ssh/sshd_config

GatewayPorts yes AllowTcpForwarding yes

重启ssh sudo systemctl restart ssh

配置NGINX #

编辑Nginx配置文件(例如/etc/nginx/sites-available/default):

vim /etc/nginx/sites-available/default

server {
    listen 80;
    server_name aa.bbb.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重启

sudo systemctl reload nginx

客户端 #

首先可以ssh登录到服务器,最好是已经把公钥发送给了服务器,不然每次都输密码有些恼火。

启动ssh反向隧道 ssh -N -R 8080:localhost:3000 [email protected] 或者 ssh -N -R 8080:localhost:3000 [email protected]

解释一下:80是告诉ssh在服务器监听80端口,将接收到的流量都转发到客户端的localhost:3000。-R是要在SSH连接中创建反向隧道。-N表示不执行命令。

如果有另一个客户端也要监听服务器的80端口就会失败。

pm2和nodejs开启SSH反向隧道 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const { spawn } = require('child_process');

const sshTunnel = spawn('ssh', ['-N', '-R', '8080:localhost:3000', '[email protected]']);

sshTunnel.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

sshTunnel.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

sshTunnel.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
pm2 start sshTunnel.js --name ssh-tunnel
pm2 save
pm2 startup