vpn技术原理详解
转载于:http://blog.csdn.net/quqi99/article/details/7334617
假设有这样一个需求,需要从家中访问公司内网机器,可以用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 [email protected] -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 [email protected] -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 [email protected] -g -N -C -o TCPKeepAlive=yes
/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 [email protected] -g -N -C -o TCPKeepAlive=yes (需先登录到9.123.100.152这个跳转机上执行)
上述的缺点就是,为每个端口都得开一个tunnel,所以可以通过ssh命令 -D 的参数( [地址:]端口 ),含义是在某个本地地址的某个端口上开SOCKS服务进行监听,把这个端口的数据通信以加密形式转发到ssh的另一端。例如:我们FQ的原理,要防墙必须国外有一台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
上面的FQ有个缺点,就是你访问国内的网站它也会用代理,这样就慢啊,所以你也可用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就是一个这样自动分发如上配置的工具
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。