Configure Intranet penetration service
Introduction
ssh是我们常用的工具,然而借助ssh的端口转发的特性,我们可以
- 动态端口转发,基于国内的服务器,搭建简易的Sock5代理来改变网络路由
- 远程端口转发,实现内网穿透,并将其配置成linux系统服务
- 本地端口转发,借助ssh访问防火墙限制的端口
Symbol
主机 | ip | 定位 |
---|---|---|
A1 | 192.168.0.1 | 本地主机 |
A2 | 192.168.0.2 | 本地主机 |
B1 | 222.201.187.247 | 云服务器 |
B2 | 192.168.59.2 | 云服务器 |
SSH Port Forwarding
动态端口转发
轻量级socks5代理。
动态端口转发,就是开启一个类似于SSR一样的socks4或者socks5代理,由于只要一条命令就可以实现代理,所以十分的方便。但同样这样的socks5 proxy并不具有混淆机制,流量特征明显,一般不适用于国外的服务器。
ssh -D 本地网卡地址:本地端口 username@ip
事实上,我们常用的会省略本地网卡地址,并加上-N -T参数,如要后台运行也可以加上-f参数。
ssh -NTD 23334 root@222.201.187.247
远程端口转发
学校的电脑因为学校防火墙,校外不可访问,利用远程端口转发,借助云服务器做桥梁,实现内网穿透。
所谓远程端口转发,就是将发送到远程服务器端口的请求,转发到本地的端口。这样,就可以通过访问服务器的远程端口,来访问本地端口的服务。使用-R属性,就可以指定需要转发的端口,语法是这样的:
-R 远程网卡地址:远程端口:目标地址:目标端口
例如,本地主机A1要实现内网穿透,可以配置端口转发到一台ip为222.201.187.247的公网服务器B1上。
这时,通过远程端口转发,可以将发送到远程云主机B1端口2000的请求,转发到本地主机A1端口3000。
# 在本地主机A1登陆远程云主机B1,并进行远程端口转发
ssh -R 0.0.0.0:2000:localhost:3000 root@222.201.187.247
同理,远程网卡地址可以省略,目标地址也可以是其他主机地址。假设本地主机A2的局域网IP地址为192.168.0.2。
# 在本地主机A1登陆远程云主机B1,并进行远程端口转发
ssh -R 2000:192.168.0.2:3000 root@222.201.187.247
远程端口转发可以用来做网络穿透。
本地端口转发
当云服务器只允许ssh端口登录,其余端口被防火墙限制时使用ssh转发来访问其他端口的服务。
这里把本地端口转发放最后,是因为动态端口转发可以解决本地端口转发的问题,动态端口转发更为强大。
所谓本地端口转发,就是将发送到本地端口的请求,借助SSH,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。使用-L属性,就可以指定需要转发的端口,语法是这样的:
-L 本地网卡地址:本地端口:目标地址:目标端口
通过本地端口转发,可以将发送到本地主机A1端口2000的请求,转发到远程云主机B1的3000端口。
# 在本地主机A1登陆远程云主机B1,并进行本地端口转发
ssh -L localhost:2000:localhost:3000 root@222.201.187.247
这样,在本地主机A1上可以通过访问http://localhost:2000来访问远程云主机B1上的3000端口的服务。
实际上**,-L选项中的本地网卡地址是可以省略的**,这时表示2000端口绑定了本地主机A1的127.0.0.1.
另外,-L选项中的目标地址也可以是其他主机的地址。假设远程云主机B2的局域网IP地址为192.168.59.2,则可以这样进行端口转发:
# 在本地主机A1登陆远程云主机B1,并进行本地端口转发。请求被转发到远程云主机B2上
ssh -L 2000:192.168.59.2:3000 root@222.201.187.247
链式端口转发
本地端口转发与远程端口转发结合起来使用,可以进行链式转发。假设A主机在公司,B主机在家,C主机为远程云主机。A主机上运行了前文的Node.js服务,需要在B主机上访问该服务。由于A和B不在同一个网络,且A主机没有独立公共IP地址,所以无法直接访问服务。
可以A主机远程转发给C,B主机本地转发给C,只要C的端口一致,就能访问呢。
SSH Tunnel & Systemd
Create a new Service File
在/etc/systemd/system
下添加服务文件ssh-tunnel.service
其中{cloud_server_ip}
和 {username}
是自定义项目
[Unit]
Description=ssh port forward
After=network.target
[Service]
ExecStart=/usr/bin/ssh -C -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o IdentityFile=/home/{username}/.ssh/id_rsa -R 0.0.0.0:20000:localhost:22 sshtunnel@{cloud_server_ip}
User={username}
Restart=always
RestartSec=1min
[Install]
WantedBy=multi-user.target
Systemctrl Enable Start Status and Log
执行以下命令
systemctl enable ssh-tunnel
systemctl start ssh-tunnel
systemctl status ssh-tunnel
journalctl -u ssh-tunnel
If configuration modified, Reload and Restart
如果出现服务启动失败的情况,修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。
# 重新加载配置文件
$ sudo systemctl daemon-reload
# 重启相关服务
$ sudo systemctl ssh-tunnel
Reference
Systemd 入门教程:命令篇 - 阮一峰
Systemd 入门教程:实战篇 - 阮一峰
SSH 端口转发
玩转SSH端口转发