通过VPS服务器创建VPN连接共享服务器网络访问外网
从05年使用Bluehost的虚拟主机开始,就知道可以通过服务器来达到翻山跃岭的目的,以前都是使用虚拟主机,然后配上主机服务器提供的Shell帐户在本地创建一个代理来达实现,记得那个时候用得最多的就是DreamHost的,当然,那还是一个流行着合租虚拟主机的时代。
从09年开始就慢慢地都转到VPS上面来了,到现在我已经只使用VPS了,以前最常使用的是CentOS作为服务器系统,后来慢慢地全部转到Ubuntu上面来了,现在又正准备转到openSUSE上面去,玩什么就转什么吧,毕竟我不是一个IT行业中人了,什么东西精不精对我来说没有太大的影响了,完全是自己的兴趣了。
时代不同,山还是那座山,岭还是那道岭,有些时间走不过还是得借一些工具,以致于本身因为安全考虑的VPN产品现在成了跳出牢笼的工具,一直以来我也是那种过不过都无所谓的人,所以,虽然我的服务器都在国外,我也从来都没有做过什么不符合政策的事情来,只是现在还是感觉,多走出去看看对自己的个人成长还是有好处的,所以,我还是想着,哪天还是整整这个吧,哪知一整,整去了我半条命。
闲话多说无益,解决不了的问题还是要解决,所以,还是回到正题来吧,不过首先申明,我这不是什么教程,纯粹只是记录,有可能我今天真的解决了我应该要解决的问题,但是并不一定就能成为你们的参考。
操作平台的选择
我是准备在openSUSE上面架设的,可是因为我还有两台Ubuntu的VPS。所以我还得解决Ubuntu的问题(好像这个更好解决一些?也许是因为可参考的资料多得多吧),软件的话我也就没啥选择了的,大家都在说openvpn,就这个了,其实我自己个人是没法儿去选择什么的,因为我对这一块是完全不通,所以只能随大流,而这里面的道道也就只能硬着头皮去学了。
使用openvpn
这个安装在两种系统里面都不难,比如下面这样的:
yast2 -i openvpn或者在 Ubuntu 下面:
apt-get install openvpn(*题外话*:我一朋友安装这个东西安装了一天,使用的是源码安装,唉,我还是没那么有勇气去玩源码安装,还是使用这种最简单的办法吧!)
配置openVPN
就是这个东西整死我了,尤其是对于我这种什么基础知识都没有的人来说就更是难上加难了啊,从昨天晚上8点多到现在,我还是没有搞定,现在也只能再继续去摸索了。
openSUSE下面的安装与配置
我还是先使用 openSUSE 吧,因为我更喜欢这个破东西一点。
安装 openVPN
我们可以先通过*zypper se*命令来查找一下下我们的软件源里面是否已经有openvpn了,运行下面这样的命令:
cox:~ # zypper se openvpn这将会得到一个结果集,它在终端里面是一个表格,我们可以很轻松地看到 openvpn 这七个字母在那里啊,所以,我再直接安装了:
cox:~ # yast2 -i openvpn包构建安装工具能为我们解决很多事情,比如包的依赖关系等。
复制需要的目录
我们现在需要把 */usr/share/openvpn* 复制到 */etc/* 目录下面,yast2 安装在安装 openvpn 是会创建一个 */etc/init.d/openvpn* 的启动脚本,该脚本会自动的搜索 */etc/openvpn* 中的配置文件:
cox:~ # cp -r /usr/share/openvpn /etc/
cox:~ # cd /etc/openvpn/
cox:/etc/openvpn # ls
easy-rsa
cox:/etc/openvpn #创建主CA与KEY文件
现在我们修改工作目录到 */etc/openvpn/easy-rsa/2.0/* 下,修改 *./vars* 文件:
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="CN"
export KEY_PROVINCE="HN"
export KEY_CITY="ChangSha"
export KEY_ORG="AntuSoftInc"
export KEY_EMAIL="cox@antusoft.com"
export KEY_EMAIL=cox@antusoft.com
export KEY_CN=antusoft
export KEY_NAME=cox
export KEY_OU=antusoft
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234保存之后执行下面这样的命令:
cox:/etc/openvpn/easy-rsa/2.0 # . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys
cox:/etc/openvpn/easy-rsa/2.0 # ./clean-all
cox:/etc/openvpn/easy-rsa/2.0 # ./build-ca
Generating a 1024 bit RSA private key
.................................................++++++
..++++++
[......]
cox:/etc/openvpn/easy-rsa/2.0 #创建服务器证书与key文件
在 */etc/openvpn/easy-rsa/2.0* 目录中执行下面这条命令来创建服务器端的证书与 key 文件:
cox:/etc/openvpn/easy-rsa/2.0 # ./build-key-server server
Generating a 1024 bit RSA private key
[,,,]
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
cox:/etc/openvpn/easy-rsa/2.0 #创建客户端证书与key文件
与服务器证书创建在同样的一个目录中,运行下面这样的命令:
cox:/etc/openvpn/easy-rsa/2.0 # ./build-key-server server
Generating a 1024 bit RSA private key
[......]
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
cox:/etc/openvpn/easy-rsa/2.0 #创建Diffie-Hellman (DH) 文件
使用下面这样的命令创建Diffie-Hellman文件:
cox:/etc/openvpn/easy-rsa/2.0 # ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
....................+...++*++*++*
cox:/etc/openvpn/easy-rsa/2.0 #现在我们可以进入 *./vars* 目录,可以看到刚才生成的所有这些证书文件与密钥文件了:
cox:/etc/openvpn/easy-rsa/2.0 # cd ./keys/
cox:/etc/openvpn/easy-rsa/2.0/keys # ls
01.pem ca.key client.key index.txt.attr serial server.csr
02.pem client.crt dh1024.pem index.txt.attr.old serial.old server.key
ca.crt client.csr index.txt index.txt.old server.crt
cox:/etc/openvpn/easy-rsa/2.0/keys #这些文件分别是:
- *ca.crt*-服务端与客户端的根证书
- *ca.key*-登陆机器专用的CA密钥文件
- dh1024.pem*-服务器端DH文件,格式为*dh.pem
- *server.crt*与*server.key*-服务器端证书与密钥文件(名称就是我们生成它时输入的)
- *client.crt*与*client.key*-客户端证书与密钥文件(名称也是我们创建时指定的)
服务器端配置文件
安装了 openvpn 之后,会自动创建一个示例配置文件,它被保存在 */usr/share/docs/packages/openvpn/sample-config-files/* 目录中,我们为了简单,就不再自己全新的创建配置文件了,而是把这个示例配置文件复制到 */etc/openvpn* 目录稍作修改即可:
cox:/etc/openvpv # cp /usr/share/doc/packages/openvpn/sample-config-files/server.conf ./编辑该文件,作如下所示的修改:
- port 1194
- proto udp
- ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
- cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
- key /etc/openvpn/easy-rsa/2.0/keys/server.key
- dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
- dev tun
- server 10.8.0.0 255.255.255.0
修改完成之后,运行服务器端:
cox:/etc/openvpn # /etc/init.d/openvpn start
redirecting to systemctl
cox:/etc/openvpn #客户端配置文件
与服务器端配置文件一样,客户端也有一个示例文件被保存在 server.conf 示例文件同一个目录下面,我们现在进入我现在的系统中,并且将前面生成的这些文件都保存到本地客户端电脑中的:*/home/cox/vpnconf*目录中。
需要创建一个地方:
remote 50.116.15.100 1194上面的IP地址为无端服务器地址,如果你的和我不一样,那么就改成你的即可,商品是我们的服务器的配置文件里面定义,默认是1194我没有做任何修改,如果你做了什么修改,也需要改成你自己设置的端口号。
测试是否能成功连接上
root@Cox:/home/cox/vpnconf# openvpn ./client.conf
[...]
Fri Nov 9 11:16:37 2012 Initialization Sequence Completed
.当出现了 *Initialization Sequence Completed*的时候,使用 *ifconfig* 查看到下面这样的信息:
tun0 Link encap:未指定 硬件地址 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet 地址:10.8.0.6 点对点:10.8.0.5 掩码:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 跃点数:1
接收数据包:1 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:100
接收字节:52 (52.0 B) 发送字节:104 (104.0 B)再用一个更加直观的办法来检测一下,我的服务器IP地址是 50.116.15.100,我在服务器上面安装Nginx服务器,直接使用这个服务器IP地址是可以访问的,而现在我使用 http://10.8.0.1/也能访问到这个服务器了,因为对于我的桌面电脑与服务器来说,他们现在已经是点对点处在同一个网里面了。
Mac用户的客户端解决办法
不用多说了吧,就使用TunnelBlick即可,这个使用方法其实很简单,只需要把上面我们的 vpnconf目录成为一个特别的名称,比如:
AhaInsight.tblk然后,把*client.crt*与*client.key*两个文件的名称都改为*AhaInsight*即可。
在你安装了TunnelBlick软件之后,以 .tblk 后缀结尾的目录会被视为一个TunnelBlick包文件,直接双击它即可把这个配置添加到TunnelBlick中去。
Ubuntu中OpenVPN的安装与
其实与在 OpenSUSE中是一样的,只是好像就easy-rsa/server.conf/client.conf这几个目录和文件的保存位置不一样,其它的都是一样的,自己玩吧。
通过openVPN共享服务器上网
其实我前面整那么多,发现对于我来说是没有任何用处的,我真正的需求在本文的最前面就已经说得很清楚了:
我要翻山跃岭,跃过长江大河,飘洋过海去看看外面的世界
而现在,我只是从黄花机场飞到了New York,但是却没签证,出不了机场的大门,啊,这不算去外面的世界看了,所以,我还需要做更多的事情,一些能真正让我《自由地飞翔》的事情,也让《我飞得更高》的事情,什么事?我现在还不知道,只能继续来摸索了。
我的一点点理解是这样的,要实现我所想实现的目标,那么可能需要满足下面这两个条件:
- 服务器端允许客户通过它访问外网
- 客户端要自己知道它是要通过服务器访问外网
把这样的想法转换成具体的实现,那么可能是这样的:
- 我打开某个网站
- 客户端告诉服务器哥要访问这个网站了
- 服务器把这些请求发送出去(这个时候服务器就像我们的TP-Link了吧)
- 服务器再把回复过来的东西发到客户端这里
啊,这些个都只是我的想法,不过也没有去看过相关的资料,还不知道是不是按着这样的思路下面,有时间再找找一些资料再来好好整整这个东西,至少现在VPN已经是连上了,至少,哥现在已经坐上灰机了。饿,想想不对,我只是买到机票了而已……
使用PPTP
实然之间,把脑子里面的水给掉跳了,发现原来还有PPTP这等东西,对于我们这种电脑白痴来讲,这东西应该简单得多吧,所以,我就又试了试使用PPTP,于是乎,我把VPS又重新给安装了,现在回到一个空白的系统中来。
安装PPTP
在 Ubuntu 下面的话,像下面这样的安装PPTP的服务端程序:
root@ubuntu:~# apt-get install pptpd在SuSE中的话,这种事情还是交给 yast吧:
suse:~ # yast2 -i pptpd哦,对了,这个是服务器端,如果要安装客户端的话,请使用:
suse:~ # yast2 -i pptp而对于 Ubuntu,pptp客户端的名称应该是 pptp-linux
安装好了之后,又回到让人头痛的事情上面来了。
配制PPTP服务器端
PPTP我看了看说明,好像比OpenVPN简单得多啊。
创建用户及密码
用来登陆 PPTPD 服务器的用户与其登陆密码是保存在 */etc/ppp/chap-secrets* 文件中的,我们先进入到这个 */etc/ppp* 目录来,再修改这个文件:
root@ubuntu:~# cd /etc/ppp
root@ubuntu:/etc/ppp# ls
chap-secrets ip-up ipv6-down.d options pppoe_on_boot
ip-down ip-up.d ipv6-up pap-secrets resolv
ip-down.d ipv6-down ipv6-up.d peers
root@ubuntu:/etc/ppp# emacs chap-secrets看上面列出的第一个文件,就是我们需要修改的文件,打开它之后会发现,其实这个文件里面除了被注释掉的各种各样的说明之外,什么配置都没有,就当这里是一个空数据库吧,用来存储用户帐户与密码的空数据库,但是可以看到最后的一行标明了我们应该怎么写这个文件,如下所示:
#client hostname <password> 192.168.1.1
cox pptpd iamcox *对于上面我添加的这一行的意思是这样的:
- cox : 用户名
- iamcox : 登陆使用的密码明文
其它的就暂时不去管吧,如果要改也就只需要改这两样就成了。
添加DNS配置
我想使用Google的“死吧!”DNS服务,它的服务器IP地址是:*8.8.8.8*,在我的系统(openSUSE 12.2)里面需要修改 */etc/ppp/options* 文件,你的可能不一样,但是位置是一样的,有可能叫作:*pptpd-options*吧:
root@ubuntu:/etc/ppp# emacs options
[...]
ms-dns 8.8.8.8
[...]
netmask 255.255.255.0
[...]修改PPTP的配置
PPTP的配置文件一般都是保存在 */etc* 这个目录的 *pptpd.conf* 文件中,打开并像下面这样的编辑它:
root@ubuntu:/etc/ppp# emacs /etc/pptpd.conf
localip 10.8.0.1
remoteip 10.8.1.100-199修改完成之后启动 PPTPD:
root@ubuntu:/etc/ppp# /etc/init.d/pptpd start配制并测试PPTP客户端
在客户端,我们需要先安装PPTP,安装方法在上面已经介绍了,这里又不再说了。
手工添加 /etc/ppp/peers/pptpd 文件
注意啦,注意啦,*/etc/ppp/peers/pptpd* 是一个文件,而不是一个目录,使用 *touch*命令也行,或者使用 *vi /etc/ppp/peers/pptpd* 或 *emacs /etc/ppp/peers/pptpd* 即可,其内容如下:
pty "pptp 50.116.15.100 -nolaunchpppd"
name cox
remotename pptpd
require-mppe-128
file /etc/ppp/options.pptp
ipparam pptpd修改 *chap-secrets*(同服务器)
如果你本地电脑和我一样,与服务器用的是一样的话,那么这里和服务器上面是一样的。
测试连接
我们使用下面这种Debug方式来测试连接:
root@Cox:/etc/ppp# pon pptpd debug dump logfd 2 nodetach
[...]
rcvd [IPCP ConfAck id=0x2 <compress VJ 0f 01> <addr 10.8.0.100>]
local IP address 10.8.0.1
remote IP address 10.8.0.100
Script /etc/ppp/ip-up started (pid 15997)
Script /etc/ppp/ip-up finished (pid 15997), status = 0x0出现上面这样的信息,就证明我的客户端已经成功的连接上服务器了。现在使用 *ifconfig* 来查看一下下:
ppp0 Link encap:点对点协议
inet 地址:192.168.1.234 点对点:192.168.0.234 掩码:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1496 跃点数:1
接收数据包:5 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:5 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:3
接收字节:62 (62.0 B) 发送字节:68 (68.0 B)配置IP转发
修改 */etc/sysctl.conf*文件,即去掉下面这一行前面的注释即可:
net.ivp4.ip_forward=1修改完成之后重新加载IP转发配置:
root@ubuntu:/var/log# sysctl -p设置网络地址翻译
修改 iptables :
root@ubuntu:/var/log# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE上述设置在重起后会丢失,因此需要修改 */etc/rc.local*,在 exit 0之前添加以下语句:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE一些小问题
- 修改了 */etc/pptpd.conf* 文件之后出现:*Long config file line ignored.*错误
这个问题整死我了,一直找不到原因,后来,无意之间发现,*/etc/pptpd.conf* 文件内容最后面必须保留有至少一个空行,否则就会出现这个问题,而这个问题的结果就是, */etc/init.d/pptpd start*无法成功执行。 - 连上VPN之后,但是却没法打开网站
这个一般是因为服务器没有开启 53 DNS 查询端口,使用下面命令开启即可:
iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
评论已关闭