目标把内网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 [email protected] -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 [email protected] -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;
}
}