[Configure Intranet penetration service] - ssh port foward & ssh tunnel & systemd

Configure Intranet penetration service

Introduction

ssh是我们常用的工具,然而借助ssh的端口转发的特性,我们可以

  • 动态端口转发,基于国内的服务器,搭建简易的Sock5代理来改变网络路由
  • 远程端口转发,实现内网穿透,并将其配置成linux系统服务
  • 本地端口转发,借助ssh访问防火墙限制的端口

Symbol

主机ip定位
A1192.168.0.1本地主机
A2192.168.0.2本地主机
B1222.201.187.247云服务器
B2192.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端口转发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值