ssh tunnel与从家中访问内网机器

原创 2012年03月08日 22:27:00

                                                                                      ssh tunnel与从家中访问公司内网机器

                                                                                                                    

作者:张华  发表于:2012-03-08
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

( http://blog.csdn.net/quqi99 )

             

            假设有这样一个需求,需要从家中访问公司内网机器,可以用ssh遂道技术来作转发,遂道分正向遂道和反向遂道两种,如果数据流向与ssh的顺序(从 ssh client -> ssh server )相同即为正向遂道(用-L标识),如果数据流向与  ssh的顺序相反即为反向遂道。下面直接上两张图来说明:

上面第一张图是正向遂道,数据流向与ssh的顺序(指ssh client -> ssh server)相同,即从192.168.1.1:80处监听到请求数据之后,通过ssh遂道,最后转发给了ssh server端6300端口去处理。

6300:192.168.1.1:80 都是前部分是ssh server, 后端分是ssh client



上面第二张图是反向遂道,数据流向与ssh的顺序(指ssh client -> ssh server)相反,即从ssh server端的6300端口监听到数据之后,通过ssh遂道,最后转给了192.168.1.1:8080


仔细想想上面两张图吧,下面直接上代码,从家中访问公司内网的机器,必须在公司有一台可以从家中访问得到的跳转机(例IP:10.10.10.10),要访问的内网机IP为192.168.1.1 。

1)如果用反向遂道实现的话,先修改ssh server的/etc/ssh/sshd_config中的GatewayPorts  yes, 重启sshd,  /etc/init.d/sshd restart
ssh -R 8422:192.168.1.1:8422 -R 61616:192.168.1.1:61616  root@10.10.10.10 -g -N -C -o TCPKeepAlive=yes

2) 如果用正向遂道的话,先修改ssh server的/etc/ssh/sshd_config中的AllowTcpForwarding true, 重启sshd,  /etc/init.d/sshd restart
    接着要 ssh 登录到跳转机上执行下列命令:
   ssh -L 8422:localhost:8422 -L 61616:localhost:61616  root@9.125.13.30 -g -N -C -o TCPKeepAlive=yes

   如果报错“open failed: administratively prohibited: open failed”,那是因为上面的localhost处应该是ssh client的IP



example:

https://9.123.100.152:8422/ibm/console/login.do?action=secure
/etc/ssh/sshd_config中修改GatewayPorts no为GatewayPorts yes  /etc/init.d/sshd restart
ssh -R 8422:9.125.13.30:8422 -R 61616:9.125.13.30:61616 -R 61617:9.125.13.30:61617 root@9.123.100.152 -g -N -C -o TCPKeepAlive=yes -o GatewayPorts=yes -vvv

/etc/ssh/sshd_config, AllowTcpForwarding=true
open failed: administratively prohibited: open failed,如果出现这个错误是因为下面的没有用localhost
ssh -L 8422:localhost:8422 -L 61616:localhost:61616 -L 61617:localhost:61617 root@9.125.13.30 -g -N -C -o TCPKeepAlive=yes (需先登录到9.123.100.152这个跳转机上执行)


上述的缺点就是,为每个端口都得开一个tunnel,所以可以通过ssh命令 -D 的参数( [地址:]端口 ),含义是在某个本地地址的某个端口上开SOCKS服务进行监听,把这个端口的数据通信以加密形式转发到ssh的另一端。例如:我们翻墙的原理,要防墙必须国外有一台ssh server

1) 首先,通过 ssh -lquqissh -N -D 7070 root@yourForeignSSHhost , 如 s20.flyssh.net

2)在firefox中设置使用socket v5的端口代理,端口为7070 (选项菜单里的“高级”选项卡的“Network"子选项卡中设置Connection)

3)  如何仍然有问题,可在firefox的地址栏输入about:config 配置使用远程DNS:network.proxy.socks_remote_dns=true

上面的翻墙有个缺点,就是你访问国内的网站它也会用代理,这样就慢啊,所以你也可用autoproxy插件选择仅在访问某些站点的使用指定代理,哪些不用代理

原理如下:比如firefox现在要访问www.163.com,firefox先将请求数据转给socket代理端口7070, 然后通过ssh遂道,最后由国外的ssh server主机去根据远程的DNS访问www.163.com


但上述需要应用程序支持socket代理,但有的程序不支持怎么办,可以用透明tsocks, 它能让普通程序也走sock代理,在yum install tsocks安装后,修改配置文件/etc/tsocks.conf,可以在样本文件tsocks.conf.sample的基础上修改,通常只要配置server = 127.0.0.1即可,其他都可以默认。例如svn服务,再用ssh -D 1080 -f -N 用户名@公司服务器的公网地址 在本机的1080端口开启SOCKS服务;然后按照你平时使用svn的习惯,只是在命令前加上tsocks,类似这样: tsocks svn up 或者 tsocks svn ci -m 'aaaa' 等等即可。



如果是http代理,用squid,安装后修改配置

sudo vim /etc/squid/squid.conf
http_access allow localnet
http_access allow all

# And finally deny all other access to this proxy
#http_access deny all

# Squid normally listens to port 3128
http_port 21


sudo service squid start

使用时,

1)在shell中,导入http_proxy=http://<httpproxyIP>:21环境变量,然后wget www.g.cn
2)yum源中使用代理,vim /etc/yum.conf
     proxy=http://<httpproxyIP>:21
     然后 sudo yum install git



2014-08-05添加:

要实现ssh自动跳转非常简单,在  ~/.ssh/config

Host server-*
    User ubuntu
    IdentityFile ~/.stack/myssh.key
    ProxyCommand ssh hua@<forward-machine> nc -q0 %h.stack %p

SSHebang就是一个这样自动分发如上配置的工具


2016-01-17

反向代理还有妙用,这周家里的宽带换成了联通的宽带,路由器那儿没有了公用IP,取而代之的是运营商私网IP,这样经过家中路由器的DNAT均会失效(因为运营商那儿有状态防火墙)。但花生壳会有效,因为花生壳客户端会创建一个从家里到花生壳服务器(有公网IP)的TCP连接,这样运营商那儿便会做一个DNAT连接。我现在虽然家里的路由器没有了公网IP,但我在美国仍然有有公网IP的虚机。那么可以这样:

ssh -R 2222:192.168.99.124:22 -R 8080:192.168.99.122:8080 -i ~/zhhuabj_lcy01.pem ubuntu@<public-ip>  -g -N -C -o TCPKeepAlive=yes -o GatewayPorts=yes -vvv
ssh -i ~/zhhuabj_lcy01.pem ubuntu@<public-ip>  && ssh -p 2222 hua@localhost

但上面只能通过locahost访问,如果想不用localhost访问,我们可以:

ubuntu@joshua-vpn:~$ cat /etc/ssh/sshd_config |grep GatewayPorts
GatewayPorts yes
ubuntu@joshua-vpn:~$ sudo restart ssh
ssh start/running, process 3072

然后使用:

ssh -R 0.0.0.0:2222:192.168.99.124:22 -R 0.0.0.0:8081:192.168.99.1:80 -R 0.0.0.0:8080:192.168.99.122:8080 -i ~/zhhuabj_lcy01.pem ubuntu@<public-ip> -g -N -C -o TCPKeepAlive=yes  -vvv

别忘了将公网IP的相应端口的防火墙规则打开。

一个autossh的脚本如下:

root@OpenWrt:~# cat /etc/init.d/iautossh 
#!/bin/sh
START=99
start() {
    autossh -M20000 -f -q -N -D 0.0.0.0:8082 ubuntu@public
    autossh -M20002 -R 0.0.0.0:2222:192.168.99.124:22 -R 0.0.0.0:8081:192.168.99.1:80 -R 0.0.0.0:8080:192.168.99.122:8080 ubuntu@public -g -N -C -o TCPKeepAlive=yes -f
}
stop() {
    killall autossh
}

版权声明:本文为博主原创文章,如需转载,请注明出处!

穿透内网--实现从外网远程桌面或ssh到内网x

本人读研中,妹纸在工作。和妹纸在外面租房住,此时遇到一个大问题,我现在学习压力大,常常回到家也要远程到实验室,或者git取实验室的项目。但是,实验室的平台在内网,又没有外网ip,于是乎,苦思良久,终于...

JDBC通过SSH Tunnel连接MySQL数据库

时间:2013-04-26 18:04来源:Internet 作者:Internet 点击:599次 有时候我们无法直接访问某台数据库,因为没有授权或者ip限制,但是可以通过登陆...

java jdbc使用SSH隧道连接mysql数据库demo

package com.yws.echo_socket; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import ...
  • earbao
  • earbao
  • 2015年12月08日 12:16
  • 9078

通过SSH 实现穿透内网

废话不多说,直接代码。。。内网:$ ssh -R -N -f 10020:0.0.0.0:10022 root@110.110.110.110外网$ ssh -p 10020 localhost $ ...

putty+vps搭建ssh tunnel访问google

下班和小海一起坐班车到西二旗,路上谈起我之前nginx反向代理google,小海说不用这么麻烦,直接浏览器设置代理就行,恍然大悟,自己竟然忘了最简单的办法! 记录下过程: 一、首先,要有一枚海外v...

putty + vpn利用ssh tunnel访问google

关于putty登录服务器(能访问google)的配置这里已经介绍,这次就只描述putty中Tunnel的配置,如下图所示: Source port是随意定义的一个端口,我这里写的是8086,然后...

SSH Tunnel 一般场景用法

SSH TunnelSSH Tunnel 顾名思义就是 SSH 安全隧道,平时看别人的相关帖子的时候很多时候可能看不太明白讲的是几个意思,这里我们约定一下说法的含义: “ HostA 可以访问 Hos...
  • wxqee
  • wxqee
  • 2015年10月19日 00:19
  • 4319

Xshell 4 SSH隧道跳转访问局域网服务器

在我们日常工作中通常会遇到以下情况:        1、想通过公网访问局域网中的服务器;        2、局域网中某些服务器或阵列提供Web管理界面,需要通过公网打开该管理界面;       通过X...
  • jw2522
  • jw2522
  • 2015年07月26日 09:25
  • 8216

使用免费的类似于花生壳的动态DNS服务访问家中内网机器(by quqi99)

家里的ip是内网地址,adsl路由器上的公网ip是变化的,所以有花生壳之类的程序来提供动态dns解析功能(它提供一个二级域名,同时硬件路由器在公网ip变动之后向它的dns解析器更新,同时硬件路由器应该...
  • quqi99
  • quqi99
  • 2014年05月05日 22:27
  • 7612

ssh 反向隧道访问内网机器

有时候我们需要从公网访问内网的机器。现在一般家里都会有个路由器,路由器一般都会带防火墙,所以从墙外要访问内部的机器,都需要设置防火墙,做端口映射。今天我看到ssh有一个有趣的功能,可以在不设置端口影射...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ssh tunnel与从家中访问内网机器
举报原因:
原因补充:

(最多只允许输入30个字)