前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ssh代理

ssh代理

作者头像
小小科
发布2018-05-02 15:33:04
2.6K0
发布2018-05-02 15:33:04
举报
文章被收录于专栏:北京马哥教育

ssh隧道技术

1. 用ssh做正向连接

啥叫正向连接?就是client连上server,然后把server能访问的机器地址和端口(当然也包括server自己)镜像到client的端口上。

代码语言:javascript
复制
ssh -L [客户端IP或省略]:[客户端端口]:[服务器侧能访问的IP]:[服务器侧能访问的IP的端口] [登陆服务器的用户名@服务器IP] -p [服务器ssh服务端口(默认22)]

其中,客户端IP可以省略,省略的话就是127.0.0.1了,也就是说只能在客户端本地访问。服务器IP都可以用域名来代替。 举例说明: 你的IP是192.168.1.2,你可以ssh到某台服务器8.8.8.8,8.8.8.8可以访问8.8.4.4,你内网里还有一台机器可以访问你。 如果你想让内网里的另外一台电脑访问8.8.4.4的80端口的http服务,那么可以执行:

代码语言:javascript
复制
ssh -L 192.168.1.2:8080:8.8.4.4:80 test@8.8.8.8

也就是说,ssh到8.8.8.8上,然后让8.8.8.8把8.8.4.4的80端口映射到本地的8080端口上,而且和本地192.168.1.2这个IP绑定。 内网里的另外一台机器可以通过IE浏览器中输入http://192.168.1.2:8080查看8.8.4.4的网页。 当然,如果是其他服务,比如ftp、ssh、远程桌面也是可以的。不过,V**貌似是不行的,可能是因为GRE协议无法通过。

2. 用ssh做反向连接

啥叫反向连接?就是client连上server,然后把client能访问的机器地址和端口(也包括client自己)镜像到server的端口上。 反向连接用得可能更多一些。比如你的客户端在内网,在外网是无法直接访问到的,这时用反向连接打通一条隧道,就可以从外网通过这条隧道进来了。 命令:

代码语言:javascript
复制
ssh -R [服务器IP或省略]:[服务器端口]:[客户端侧能访问的IP]:[客户端侧能访问的IP的端口] [登陆服务器的用户名@服务器IP] -p [服务器ssh服务端口(默认22)]

其中,服务器IP如果省略,则默认为127.0.0.1,只有服务器自身可以访问。指定服务器外网IP的话,任何人都可以通过[服务器IP:端口]来访问服务。当然,这个时候服务器本机也要输入外网IP:端口来访问。 举例说明: 你的IP是192.168.1.2,你可以ssh到外网某台服务器8.8.8.8,你内网里有一台机器192.168.1.3。 如果你想让外网所有的能访问8.8.8.8的IP都能访问192.168.1.3的http服务,那么可以执行:

代码语言:javascript
复制
ssh -R 8.8.8.8:8080:192.168.1.3:80 test@8.8.8.8

也就是说,ssh到8.8.8.8上,然后把本地局域网内192.168.1.3的80端口映射到8.8.8.8的8080端口上,这样外网任何一台可以访问8.8.8.8的机器都可以通过8080端口访问到内网192.168.1.3机器的80端口了。 反向连接同样支持各种服务。

3. 用ssh做socks代理

假设你内网里某台机器可以上网,但是你不能上网,如果你有ssh到那台机器的权限,那么就可以利用ssh方式建立一个代理socks5,通过代理来上网。 命令:

代码语言:javascript
复制
ssh -D [本地IP或省略]:[本地端口] [登陆服务器的用户名@服务器IP] -p [服务器ssh服务端口(默认22)]

道理和上面是一样的,执行这个命令之后,本地会监听指定的端口等待连接。 网上好多文章说Firefox和Chrome要下载什么插件才能支持,其实都是扯淡。 在配置代理的时候直接选择Sock5就可以了,不需要用户名和密码验证。另外,IE也是支持Sock5的,具体配置方法是:勾选为LAN使用代理服务器,然后任何字段都不要填,点“高级”按钮,在套接字里面填好相应的配置,其他都留空。 Chrome默认采用IE的配置,所以如果IE配置好了,Chrome也是可以上网的。 另外,可以使用一个叫做Sockscap的软件,把应用扔进去就能以代理的方式上网了。(部分需要调用多个进程的应用可能不行) 说句题外话,QQ2012版目前的Socks5代理上网功能貌似不支持本地Socks5代理,不过可以选择“浏览器配置”方式来规避。

把socks代理转换成http代理 如果你想把socks代理转换成http代理,可以用privoxy这个东东。去官网下载个.zip的文件包,然后解压到任意目录,执行可执行文件。 在主界面点击Options菜单->Edit Main Configuration,在弹出的文本文件中搜索forward-socks5,找到的章节就是讲socks5转换的。 回车新建一行,输入forward-socks5 / [本地IP]:[本地端口] . 注意后面还有个“.”,然后保存。 这样就可以实现把socks5代理转换成127.0.0.1:8118的http代理了。程序可以通过127.0.0.1:8118这个http代理上网。 如果你想让局域网内其他IP也能通过你的机器上网,需要修改配置文件中的listen-address部分,搜索一下相信你就会看明白了。

4. Windows下的ssh和ssh server

不要以为只有Linux下才能用ssh,Windows下一样有强大的ssh命令行工具和ssh服务器。并且对以上功能支持的都很好。 那就是伟大的PuTTY!去官方网站下载吧! ssh命令行客户端对应的是plink.exe,命令稍微有一点不同(比如指定端口是大写的P),具体看帮助文件稍作修改就好了。 ssh服务器端是WinSSHD,傻瓜式安装,默认配置支持windows用户认证。

5.自动连接和防断线脚本

如果你想让连接长期保持,可以写个脚本来保证因为网络原因断线的话可以自动重连。 先说Windows平台,用plink -pw参数可以指定密码,所以只要写个批处理:

代码语言:javascript
复制
:1
plink -pw “password” -D 7070 user@serverip
goto 1

这样应该就可以解决大多数问题造成的断线。 Linux平台ssh默认不支持把密码作为参数,不过有sshpass可以搞定

代码语言:javascript
复制
sshpass -p 密码 ssh -o StrictHostKeyChecking=no  -o UserKnownHostsFile=/dev/null -l root -R 10002:127.0.0.1:12580 -N 66.160.159.139 -p 56789

然后写脚本autossh.sh,内容如下

代码语言:javascript
复制
#!/bin/bash

while [ '' == '' ]
do
ssh_d_process_num=`ps aux|grep -E 'ssh \-' |grep -v grep |wc -l`
if [ "$ssh_d_process_num" == "0" ]; then
/home/user/sshpass -p "password" ssh -D 7070 user@ServerIP &
fi

sleep 300
done

6. SSH反向连接及Autossh

接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞)。稍懂一点网络的童鞋会明白,Internet上去主动连接一台内网是不可能的,一般的解决方案分两种,一种是端口映射(Port Forwarding),将内网主机的某个端口Open出防火墙,相当于两个外网主机通信;另一种是内网主机主动连接到外网主机,又被称作反向连接(Reverse Connection),这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射,自然可以相互通信了。但是,这种映射是NAT路由自动维持的,不会持续下去,如果连接断开或者网络不稳定都会导致通信失败,这时内网主机需要再次主动连接到外网主机,建立连接。

1.理论的介绍完了,下面实际操作:

公司里的机器 A 是内网机器,我们不能在公司外直接访问机器 A。但如果,在 A 和某台公网机器 C 之间建立一条加密隧道,便可以用任何一台机器 SSH 登录 A,就如同在 A 机器所处内网的防火墙上凿穿了一个洞。用下面的图来表达这个想法更直观一些。

A 192.168.1.100 SSH 12580 C 66.160.123.11 SSH 56789

A C 机已经有相同的key

代码语言:javascript
复制
A <-|-> C <--- B
    |
内  防   公      任
网  火   网      何
机  墙   机      机
器       器      器

在A机上执行

代码语言:javascript
复制
ssh -g -N -f -R 10001:localhost:12580 root@66.160.123.11 -p 56789

在C机上执行 执行会看到监听的端口

代码语言:javascript
复制
[root@localhost ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name            
tcp        0      127.0.0.1:10001               0.0.0.0:*                   LISTEN      22158/sshd

修改sshd_config选项 GatewayPorts yes 重启ssh 在A机重新连接后监听的端口是0.0.0.0:10001

这样做 ssh断线了 就需要在A机再次执行最终修改为

代码语言:javascript
复制
autossh -M 2222 -f -NR 10001:localhost:12580 root@66.160.123.11 -p 56789

-M 2222 负责通过2222端口监视连接状态,连接有问题时就会自动重连

代理A机上的web网站也是一样的方法

代码语言:javascript
复制
autossh -M 2222 -f -NR 88:localhost:80 root@66.160.123.11 -p 56789
将A机80端口映射到C机上的88端口(A机上已经运行了网站www.test.com)
在C机上配置web反向代理
server
{
  listen 80;
        server_name www.test.com;


        location / {
                proxy_pass http://127.0.0.1:88;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        access_log  /data/logs/test.com.log  access;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2014-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 用ssh做正向连接
  • 2. 用ssh做反向连接
  • 3. 用ssh做socks代理
  • 4. Windows下的ssh和ssh server
  • 5.自动连接和防断线脚本
  • 6. SSH反向连接及Autossh
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档