深表惭愧的前言
最近忽然想起还有个公众号来着,上来一看居然有57名关注用户~真对不起大家!想想当初的初衷,惭愧啊!所以呢,最近会发些技术文章来提升下活跃度,当然,应该会一直坚持下去(大概)。
今天要写的是我想开的一个新专题,叫每周实战,就是把我日常使用中遇到的一些issue和解决方案写下来,共享给大家互相学习借鉴~
目的:
现有公网服务器一台(未特别说明时均为Linux服务器),IP为111.111.111.111,公司内网服务器一台,内网IP10.0.0.233,家里内网一台,内网IP192.168.3.200。希望能够从家里ssh连接到公司服务器,最好也能够从公司连到家里电脑。
网络拓扑如图:
分析:
遇到这个问题,第一反应就是ssh转发呀,但是怎么转呢?什么本地端口转发,远程端口转发什么的,搞得人头都晕了。没关系,我们来慢慢捋~~
原理:
SSH支持三种转发方式:本地端口转发,远程端口转发,动态转发。
先说简单的,动态转发。
命令格式:
ssh -D '*:1080' user@your_server
动态转发就是Socks5代理,连接成功后,支持socks5代理的程序可以通过命令行指定的端口(这里就是1080)来连接远程服务器那边可以访问的网络资源。
加星号表示监听 0.0.0.0,如果不加星号,则该代理端口仅允许本地连接。
下面讲另外两个比较容易混淆的:本地端口转发和远程端口转发。
两种命令的格式几乎是一致的,这也是这两个功能比较令人迷惑的:
ssh -L [host:]port:host:hostport user@your_server
ssh -R [host:]port:host:hostport user@your_server
这里的“本地”和“远程”指的是监听端口所在的机器(相对于ssh客户端)。如果你想在ssh客户端所在的机器上监听一个端口并将数据转发到ssh服务器,那就用本地端口转发;反之,如果你想在ssh服务器上监听一个端口并把请求数据转发到ssh客户端这边,那就是远程端口转发。
图解如下:
这里有几个关注点:
和动态转发一样,省略参数中的 '*' 会导致转发的端口只允许本地访问。
两条命令中的 'localhost' 含义不一样:本地转发命令中,localhost是对远程机器而言的一个名称;而远程转发命令中,localhost则确实指的是本机。
还有个坑要注意:如果你使用上面图3的命令来尝试转发本地ssh服务,那么很有可能无法访问2233端口,这是因为sshd默认禁用了GatewayPorts选项,只能在sshd服务所在本机访问绑定的2233端口,你可以把这个选项直接设为yes,也可以再开一个本地端口转发
总结
针对我们开头的问题,解决方案很简单了:
公司电脑访问家里电脑:
在家里电脑上连接公网服务器,并开启公网机器上的GatewayPorts选项
// -f: 后台运行
// -q: 静默模式
// -N: 不执行命令
111.111.111.111 $> grep 'GatewayPorts' /etc/ssh/sshd_config
GatewayPorts yes
家里电脑访问公司电脑:
以上操作在公司电脑上执行一遍即可。
领取专属 10元无门槛券
私享最新 技术干货