SSH与VPN客户端配置完全手册&给VPN添加路由表+自动替换DNS服务器

2011年8月13日 | 分类: 翻墙相关 | 标签: , , , , , , , , , , ,

SSH与VPN客户端配置完全手册

一、导言

很多时候在公用网络(如公共场所开放式的Wifi)或者传输关键数据时,我们需要加密的信道来保证数据的安全,SSHVPN是现在很常用的两套传输方式,现在以Windows和Linux系统为例给出SSHVPN的客户端配置。

二、SSH配置

SSH是什么?SSHSecure Shell)是一种建立在应用层和传输层基础上、专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。 SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。 如果你有一个国外的ssh账号的话,则可以使用SSH隧道作为一个安全上网代理。

1.SSH在Windows 客户端配置

Windows下常用的SSH客户端有开源的Putty以及在其基础上的加上GUI外壳的MyEntunnel。使用MyEntunnel可以避免记忆复杂的命令行,还可以安全的保存密码。但是有个问题,通过MyEnTunnel或者plink下载或者看视频速度很慢,最高不超过35KB/s。(由于Release版的Putty限速于40KB/s,Dev版的Putty无此问题,详情参考此文。)

推荐另一款SSH客户端Tunnelier,相比MyEntunnel有两点优势:1.不限速2.更方便的使用公钥/私钥系统做SSH认证。

前者的重要性毋庸置疑,而后者使用生成的公钥而非密码认证在安全上有更多的优势,详情在此文有 更多的探讨。 软件设置比较简单: Login选项卡,输入ssh服务器的登录信息。 Options选项卡,On Login部分把几个勾都去掉,很多时候你的SSH提供商并没有给你Shell Access权限。 Services选项卡,SOCKS/HTTP Proxy Forwarding部分 Enabled,修改本地监听端口,形成Socket v5 代理。 公钥配置使用Keypair Manager,如下图,Generate一对密钥,Export出公钥Public Key, Import进服务器。登陆时用自己的私钥,每次输入口令Passphrase,即可。

然后Save Profile As另存配置。

Tips:
可以从命令行运行
Tunnelier:tunnelier -profile=profilename.tlp -loginOnStartup

2.SSH在Linux客户端配置

Linuxer不用GUI,因而这里以Ubuntu 10.04 Lucid为例。

1
ssh -fnN -D localport -p hostport 'username@hostname'

其中 hostname是SSH主机名或者IP地址 hostport是远程主机的SSH服务端口,当其非默认端口22时需要在这里设置。 localport即Socket v5 Proxy监听端口,一般SSH设定为7070. 剩下参数意义如下

-q :- be very quite, we are acting only as a tunnel.
-f :- move the ssh process to background, as we don’t want to interact with this ssh session directly.
-N :- Do not execute remote command.
-n :- redirect standard input to /dev/null.

其中-N很重要,有的时候,主机商没有给你SSH Shell Access权限时,必须要开启,否则有可能自动关闭这个SSH连接。

  • 自动重连

Linux系统中不像Windows有非常好用的GUI,但是却又异常强大的bash,利用它,我们可以完成SSH自动重连。 要使用重连的机制,需要先建立远程服务器公钥对本机的私钥配对形成信任关系,使用ssh-copy-id这个小工具,这样才可以免输密码。

 

(1)先生成一对密钥。

1
ssh-keygen -t rsa

这个命令生成一个密钥对:id_rsa(私钥文件)和id_rsa.pub(公钥文件)。默认被保存在~/.ssh/目录下。

(2)建立信任关系

通过CPanel将公钥import进SSH服务器或者scp到服务器,或者最最简单方便的ssh-copy-id这个脚本。

1
2
3
4
5
6
7
8
$ ssh-copy-id -i ~/.ssh/id_rsa.pub  username@hostname
If you need shell access please contact support.
Now try logging into the machine, with "ssh -p XXXX 'user@host'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

如果你和我一样,使用的SSH服务非默认的22端口,你需要使用这个修改版的ssh-copy-id(引自此文)。

如此调用即可~

1
ssh-copy-id -p local -i ~/.ssh/id_rsa.pub username@hostname

3.自动重连脚本(来自Blogkid大大)

1
2
curl -s -I http://www.google.com/ –socks5 localhost:7070 > /dev/null
[ $? -gt 0 ] && ssh -fN username@hostname -D 7070

脚本很简单,就是使用curl通代理访问一下google(这里也可以是任意别的网站)。如果访问失败了,就重开一个ssh进程监听7070端口。

3.浏览器配置

众所周知由于IE对SOCKET5代理不好,大家一般都是用 FireFox/Chrome。直接将FireFox/Chrome设置Socket5代理就是可以正常使用的。但是这样,上国内网站也会绕道国外,影响 速度。好在FireFox/Chrome有大量优秀的插件,FoxyProxy和Switchy!是很常用的通过URL筛选决定是否通过代理访问网站的插 件,配合对应的pac脚本,非常好用。

三、VPN配置

目前被广泛应用的VPN实现中有三个主流:SSL、IPSec及PPTPPPTP协议最早由MS推出,优点在于其在Windows平台预装了客户端,在新版的Linux中(如9.04版以后的Ubuntu)也给与了客户端和GUI的支持,密码分析专家已经透露了其安全弱点。
OpenVPN是一免费开源软件,属于SSL VPN,比PPTP更加安全。OpenVPN的安装比PPTP要复杂一点,但是其开源的特性给了其广泛的移植性,对Linux服务器也更加友好,在运营商ISP阻止PPTP连接时,OpenVPN也能够保持不受影响。

1.OpenVPNWindows下配置

将*.ovpn *.ca 拷贝到X:/Programme Files/OpenVPN/config即可。

OpenVPN此番在Windows下配置颇具一番周折。开始使用了VPN提供商给的OpenVPN 2.0.9版,但是在使用中,频频报错,首先是 TAP-WIN32 开启中出现Permission Denied/权限不够,给了X:/Programme Files/OpenVPN/bin 的所有exe管理员权限才过去,接着出现了一下错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
Fri May 08 13:14:24 2009 route ADD 67.228.223.13 MASK 255.255.255.255 192.168.1.1
Fri May 08 13:14:24 2009 ROUTE: route addition failed using CreateIpForwardEntry: One or more arguments are not correct.   [if_index=9]
Fri May 08 13:14:24 2009 Route addition via IPAPI failed
Fri May 08 13:14:24 2009 route ADD 0.0.0.0 MASK 128.0.0.0 192.168.4.65
Fri May 08 13:14:24 2009 ROUTE: route addition failed using CreateIpForwardEntry: One or more arguments are not correct.   [if_index=23]
Fri May 08 13:14:24 2009 Route addition via IPAPI failed
Fri May 08 13:14:24 2009 route ADD 128.0.0.0 MASK 128.0.0.0 192.168.4.65
Fri May 08 13:14:24 2009 ROUTE: route addition failed using CreateIpForwardEntry: One or more arguments are not correct.   [if_index=23]
Fri May 08 13:14:24 2009 Route addition via IPAPI failed
Fri May 08 13:14:24 2009 route ADD 192.168.4.0 MASK 255.255.255.0 192.168.4.65
Fri May 08 13:14:24 2009 ROUTE: route addition failed using CreateIpForwardEntry: One or more arguments are not correct.   [if_index=23]
Fri May 08 13:14:24 2009 Route addition via IPAPI failed
Fri May 08 13:14:24 2009 Initialization Sequence Completed with errors

网上Google了很久,有人建议添加

ip-win32 netsh

或者

route-method exe route-delay 2

据没有得到解决,后来Google到这篇帖子提到到

OpenVPN 2.1_rc2 (just released) has a fix for the “route addition failed using CreateIpForwardEntry” error on Vista.

于是去http://openvpn.net/download.html 中最新的Release,2.1.1才干掉这个错误。

但是此时,依然无法打开任何网页,但却可以ping通IP地址,于是在找到OpenVPN 适配器TAP-Win32 Adapter V9 对应的本地连接4的TCP/IP设置中添加Google DNS 8.8.8.8/8.8.4.4,全部解决。 给出OpenVPN在Windows下的使用建议:

1.要开启DHCP服务
2.当OpenVPN无错时,可以试试添加DNS。

2.OpenVPN在Linux的配置

OpenVPN在Linux下配置相对容易

1
2
3
4
wget http://openvpn.net/release/openvpn-2.1.1.tar.gz
tar -xvf openvpn-2.1.1.tar.gz
cd openvpn-2.1.1
./configure

提示缺少实时压缩lzo库,故安装lzo库

1
2
3
4
5
6
7
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
tar -xvf lzo-2.03
cd lzo-2.03
./configure && make && sudo make install
#继续安装OpenVPN
cd ../openvpn-2.1.1
./configure && make && sudo make install

使用时调用一下命令即可。

1
sudo openvpn --config ~/client/client.ovpn --ca ~/client/ca.crt

四、VPN与SSH的区别

VPN其实也是在本地与远程服务器之间建立了一个加密的通道,但是,与SSH不同的是,VPN客户端会虚拟一个网卡出来(这个虚拟的网卡连接的就是 刚才说的那个加密通道),然后修改路由,使流量从加密通道走。当然,VPN也存在跟SSH相同的问题,如果访问国内网站,会绕道国外,速度很慢。聪明的人 们又想出了办法:连接了VPN的电脑相当于有两块网卡,只要让国内流量从真实网卡走而国际流量从虚拟网卡走,这个问题就解决了。实际的操作就是手工加入国 内IP的路由,让这部分流量直接走本地连接来搞定。

在解决绕道的问题上,大家可以看出SSH方式和VPN方式的不同了,SSH方式可以在URL的级别上筛选网址走加密通道,而VPN方式只能筛选IP。

举个例子,SSH代理+Swithy!+PAC可以做到使http://www.abc.com/xxx走代理,而http: //www.abc.com/yyy不走代理,这是VPN方式力所不及的,因为前者和后者的IP是完全相同的。当然,VPN方式也有它得天独厚的好处,就 是不用对应用软件进行任何设置即可使用,这对一些根本没法设置Socket v5代理的应用软件是莫大的福音,这也是SSH方式力所不及的。
(引用自Kangzj.net

===========================================================================================

给VPN添加路由表+自动替换DNS服务器

VPN(Virtual Private Network)是通过一个公用网络建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。使用这条隧道可以对数据进行几倍加密达到安全使用互联网的目的。

 

一、给VPN添加路由表

然而,在VPN流量的有限的情况下,一来我们希望部分特定的IP走VPN线路,访问其他IP时候依然走公网网关;二来,对于海外VPN,访问国内IP走公网线路也有利于访问速度的保证;再者,也可以消除一些中国内部的资源也限制海外的ip访问情况;要实现这一目的,我们需要给VPN添加路由表。以OpenVPN为例。

1.Windows

Windows用户最好使用最新OpenVPN 2.1以上的版本,因为openvpn v2.1比之前版本增加了一个名为max-routes的新参数, 通过设置该参数, 我们可以在配置文件里(服务端, 客户端)直接添加超过100条以上的路由信息.
chnroutes上给出的脚本

教育网同学可以考虑使用这个添加教育网IP的路由表版本(修改自 @Felixonmars 的脚本)

cernet_ovpn.py
1
2
3
4
5
6
7
8
9
10
11
12
13
import re
import urllib
b=re.compile("([\d\.]+)\s+[\d\.]+\s+([\d\.]+)")
c=b.findall(a)
line_count=0
m=["#iptable for CERNET"]
for d in c:
    m.append("route "+d[0]+" "+d[1]+" net_gateway 5")
    line_count=line_count+1
e=open('routes_cernet.txt',"w")
e.write("\n".join(m))
e.close()

具体设置步骤如下:

  1. 在命令行里执行 python chnroutes_openvpn_v2.1/cernet_ovpn, 这将生成一个名为 routes.txt/routes_cernet.txt 的文本文件.
  2. 使用你喜欢的文本编辑器打开上述文件, 并把内容复制粘贴到openvpn配置文件的末尾
  3. 同时在openvpn配置文件的头部添加一句 max-routes num, 其中num是一个不小于文件routes.txt的行数的数字, 实际上因为还有一些服务器端push过来的路由信息, 所以保险起见可以用 routes.txt的行数加上50, 比如目前得到的routes.txt的行数是940, 你可以把数字设置为1000: max-routes 1000

2.Linux

Linux平台不建议使用opvn中添加路由表(本人Ubuntu 10.10系统采用此方法时在退出OpenVPN时删除路由表时出现权限问题),而是采用一个脚本文件。Windows平台也不建议使用脚本,因为Windows平台创建进程的开销非常大,具体表现出来为route程序执行过慢,导致整个脚本执行的时间太长;Linux平台基本不算问题,因为Linux创建进程是非常快的,所以脚本执行时间非常短。基本在5秒左右就完成,5秒后网络立马就稳定下来了。
chnroutes上给出的脚本

教育网同学可以考虑使用这个添加教育网IP的路由表版本(修改自 @Felixonmars 的脚本)

chnroutes_ovpn_linux_cernet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
import re
import urllib
VPNUPBASE="""#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
OLDGW=`ip route show | grep '^default' | sed -e 's/default via \\([^ ]*\\).*/\\1/'`
if [ $OLDGW == '' ]; then
    exit 0
fi
if [ ! -e /tmp/openvpn_oldgw ]; then
    echo $OLDGW > /tmp/openvpn_oldgw
fi
"""
VPNDOWNBASE="""#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
OLDGW=`cat /tmp/openvpn_oldgw`
"""
b=re.compile("([\d\.]+)\s+[\d\.]+\s+([\d\.]+)")
c=b.findall(a)
upfile=open('vpnup_cernet','w')
downfile=open('vpndown_cernet','w')
upfile.write(VPNUPBASE)
upfile.write('\n')
downfile.write(VPNDOWNBASE)
downfile.write('\n')
for d in c:
    upfile.write("route add -net "+d[0]+" netmask "+d[1]+" gw $OLDGW\n")
    downfile.write("sudo route delete -net "+d[0]+" netmask "+d[1]+"\n")
downfile.write('rm /tmp/openvpn_oldgw\n')
upfile.close()
downfile.close()

具体设置步骤如下:

  1. 下载 chnroutes_ovpn_linux/chnroutes_ovpn_linux_cernet
  2. 从终端进入下载目录, 执行python chnroutes_ovpn_linux/chnroutes_ovpn_linux_cernet, 执行完毕之后同一目录下将生成两个新文件’vpnup/vpnup_cernet’和’vpndown/vpndown_cernet’
  3. 在终端里运行命令 chmod a+x vpnup vpndown 把这两个文件设置为可执行
  4. 把这两个文件copy到openvpn的配置目录并修过openvpn配置文件, 在末尾加上两句
script-security 2 up vpnup down vpndown

二、自动替换DNS服务器

一般在OpenVPN的server端都会写上类似于

push "dhcp-option DNS 10.8.0.1" push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"

这样的语句将DNS设置push给客户端,但实际上,这个只对Win32平台下的OpenVPN有效,对于Linux平台下,无路是server端的push或者是client端配置文件中手动加上–dhcp-option都没有用。DNS服务器依然是连接OpenVPN前的DNS服务器,遭到DNS污染的网站依旧会遭到DNS污染,只能考虑执行自定义脚本来完成:

vpnup
3
4
5
6
7
8
9
10
RESOLVE=/etc/resolv.conf
FOREIGNDNS1='4.2.2.1'
FOREIGNDNS2='4.2.2.2'
DNSMARK='_MK'
sed "s/^nameserver/#$DNSMARK nameserver/" -i $RESOLVE
echo "nameserver $FOREIGNDNS1" >> $RESOLVE
echo "nameserver $FOREIGNDNS2" >> $RESOLVE
vpndown
3
4
5
RESOLVE=/etc/resolv.conf
DNSMARK='_MK'
sed -e '/^nameserver/d' -e "s/^#$DNSMARK //" -i $RESOLVE

很简单,就是使用sed来完成/etc/resolv.conf文件的内容替换。

嗯,就这样。

参考文献:

原文http://logicmd.net/2010/08/config-handbook-for-ssh-and-vpn/

http://logicmd.net/2010/10/add-route-table-and-auto-replace-dns-while-connecting-to-vpn/

  1. 2011年8月13日22:19

    博主你好
    本人新作《Google+ Games 社交游戏推出,附hosts与介绍》
    地址:http://wuxiao.info/485
    欢迎采纳,谢谢

    作者:Changer
    邮箱:wuxiao0715@gmail.com
    更多信息,请关注:www.wuxiao.info

    • iGFW
      2011年8月13日22:39

      感谢支持,已发布。