一、场景如下:
各个角色的对应关系如下:
角色描述APP 个人笔记本,属于内网IP
sshd server 公网 VPS ( 映射端口: port 2222 ),拥有公网IP
ssh client 内网机器,属于另一个内网IP
APPSRV
与 内网 ssh client 是同一台机器 ( 目的端口: hostport 22 )
两个帐号:admin/password为“内网机器”ssh的登录帐号密码,VPS-user/password为“公网VPS”ssh的登录帐号密码
网络连通情况:“内网机器”可以访问公网VPS,“个人笔记本”可以访问“公网VPS”,但是不可以访问“内网机器”;“公网VPS”不能访问“内网机器”,也不能访问“个人笔记本”
二、目标:实现私网的笔记本访问另一个私网的“内网机器”
三、思路:建立反向代理,把访问公网VPS某个端口的流量映射到“内网机器”的某个端口;然后建立正向代理,把“个人笔记本”对“内网机器”的访问流量、访问请求,通过代理发给“VPS”的那个映射端口
四、步骤:
1、反向代理:“公网VPS”===>"内网机器",通过内网机器反向连接VPS
在内网机器上配置:(ssh clinet) # ssh -CfnNT -R 2222:localhost:22 VPS-user@VPS
(ssh clinet) # ssh -p 22 -qngfNTR 6666:localhost:22 VPS-user@VPS
这样就把“内网机器”的22端口转发到了远程机器(VPS)的6666端口上
查看内网机器的进程
[ssh clinet ~]# ps aux | grep "ssh -p"
root 14594 0.0 0.0 59856 1056 ? Ss 11:16 0:00 ssh -p 22 -qngfNTR 6666:localhost:22 VPS-user@VPS
查看公网VPS的端口情况,注意端口6666,只有本地环回地址可以访问
[sshd server ~]# netstat -anpt | grep 6666
tcp 0 0 127.0.0.1:6666 0.0.0.0:* LISTEN 10703/sshd
这时候,在公网VPS上就可以通过ssh连接内网机器,打通了“公网VPS”到“内网机器”的访问通道
[sshd server ~]# ssh -p 6666 admin@localhost
admin@localhost\'s password:
输入“内网机器”ssh帐号的密码“password”,就可以在公网VPS上实现到内网机器的ssh连接
2、正向代理:“个人笔记本”===>“公网VPS”
在“个人笔记本”上配置:[App ~] # ssh -p 6666 -qngfNTD 6767 VPS-user@VPS,这样,访问“个人笔记本”本机(127.0.0.1)端口6767的流量就流向了“内网机器”
但是目前,上面配置是不生效的,因为“公网VPS”的端口6666,只允许它自己访问。解决办法有两个:
a、思路:修改“公网VPS”的配置sshd_config,使其建立的SSH端口供所有IP访问
方法:把“公网VPS”配置文件/etc/ssh/sshd_config里的配置“GatewayPorts no”修改为“GatewayPorts yes”,重新执行步骤1,执行完查看“公网VPS”的6666端口如下
[sshd server ~]# netstat -anpt | grep 6666
tcp 0 0 0.0.0.0:6666 0.0.0.0:* LISTEN 10703/sshd
b、思路:不修改“公网VPS”的配置sshd_config,仍然采用默认配置“GatewayPorts no”,在“公网VPS”上增加一个本地端口映射,使新增加的端口供所有IP访问,或者供特定的IP访问
方法:在“公网VPS”上配置:[sshd server~] # ssh -fCNL *:6667:localhost:6666 localhost,这一步执行需要“公网VPS”的root帐号密码
查看“公网VPS”的进程和端口情况:
[sshd server ~]# netstat -anpt | grep 6667
tcp 0 0 0.0.0.0:6667 0.0.0.0:* LISTEN 1073/sshd