2012年6月4日星期一

在Amazon的EC2上搭建pptp-vpn和openvpn

        首先要去申请一个amazon的账户,这个阶段你可能需要一个visa信用卡来激活你的帐号,另外会有一个印度的呼叫中心用蹩脚的英语来核实你的基本信息。
        好,假设我们认为你已经有了个amazon的帐号,你需要登录到amazon的后台console,选择上边的EC2的tab,然后注意选择左上角的大区,这取决于你的server位于哪个大陆,我们这里选择的是tokyo东京。
        我们要申请一个EC2的实例,这里推荐的是ubuntu11.04 32位的系统(RHEL5.x,6.x的tiny instance也是收费的,慎用)。这里面有一系列的步骤,之需要选择最低配置即可,中间会有一个生成安全私钥的过程,会直接下载的本地电脑中,假设这个密钥是sec.pem。我们保存好这个文件,之后的ssh,scp等操作都需要用这个文件。
        启动你的console。并设置安全拦截(Security groups)放行443,1194(openvpn)和1723(pptp)
-----------------------------
22 (SSH)0.0.0.0/0
443 (HTTPS)0.0.0.0/0
1194 0.0.0.0/0
1723 0.0.0.0/0
-----------------------------
        ssh:ssh -i sec.pem ubuntu@{dynamic_Dns_name}连接到你启动的ubuntu实例。
        ssh成功后,查看一下虚拟主机的配置,是613M内存,8G硬盘空间;
        安装pptpd,apt-get install pptpd;
        修改一下/etc/pptpd.conf 打开localip和remoteip选项;
        修改/etc/ppp/pptpd-options, 设置dns ms-dns 8.8.8.8 ms-dns 8.8.4.4;
        修改/etc/ppp/chap-secrets 设置客户端的用户名密码 pptpd * pptpd *;
        重启pptpd:pptpd restart;
        修改/etc/sysctl.conf,打开注释的net.ipve.ip_forward=1,然后运行sudo sysctl -p
        修改iptables,设置网络地址翻译:sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;/sbin/iptables -A INPUT -p gre -j ACCEPT
        设置到/etc/rc.local避免重启丢失:在exit 0之前添加:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;iptables –table nat –append POSTROUTING –jump MASQUERADE;
        好,上面的一系列步骤帮助 你设置好了一个pptp的server,下面要在ubuntu的环境下设置client。
        首先create一个pptp连接,pptpsetup --create pptpd --server ec2_dynamic_DNS --username [帐号] --password [密码] --encypt,以后连接和取消vpn执行pon pptpd和poff pptpd即可;
ppp/peers/下建立了一个vpn_name的连接,info如下:
----------vpn_name--------
# written by pptpsetup
pty "pptp xxx.xxx.xx.xxx --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name xxx
remotename pptpd
ipparam pptpd
require-mppe-128
--------------------------------
最后一行表示使用mppe128位加密;(即--encypt)
        执行sudo pon即可拨号,这里有一个debug模式,命令是:pon xxx debug dump logfd 2 nodetach (xxx为你设置的vpn名称)
拨号成功后,可以通过增加路由策略实现有选择的翻墙;
增加一个路由策略:route add -net 199.59.0.0/16 dev ppp0,即可把twitter加入到vpn策略中。
错误分析:
如果在debug模式下出现多行sent [LCP ConfReq ...] 这时说明你的GRE协议穿透有问题;你需要重点关注协议在哪一方被拦截了;
可以通过抓包来判断,分别在server和client对1723端口抓包,可以轻易的判别是server拦截了GRE还是client端的环境拦截了GRE。server你需要配置好防火墙规则,client你需要检查你的网络防火墙设置。
====PPTP结束====


        下面配置openvpn, open vpn比想象中容易配置很多,只是在client端需要安装,没有pptp通用。pptp比较适用于手机翻墙;
        首先,安装openvpn:sudo apt-get install openvpn
        拷贝配置文件:cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn
        设置转发规则:iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ppp0 -j MASQUERADE
        . ./vars
        ./clean-all
        ./pkitool --initca
        ./build-dh
        ./pkitool --server myserver
        ./pkitool client
        以上命令生成service的证书和client证书,设置一个server.conf
--------------server.conf--------------
port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/myserver.crt
key /etc/openvpn/easy-rsa/2.0/keys/myserver.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
#表示多人可以使用同一个key
duplicate-cn
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
------------------------
        注意:push "redirect-gateway def1" 可以将openvpn设置为默认路由,如果去掉这个配置,即使拨号成功,也需要设置路由策略才能使用openvpn的网络。
        启动openvpn:openvpn --config server.conf &
        如果报group nobody 找不到,就增加一个group,groupadd nobody
        上述就是server端的配置;client端要使用openvpn服务,需要下载ca.crt,client.crt,client.key并配置一个conf文件;
        conf文件样例:
-----client.conf----
client
dev tun
proto tcp
remote x.x.x.x 1194
resolv-retry infinite
nobind
mute-replay-warnings
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 4
status openvpn-status.log
-------------------------------------------
如果你是ubuntu,恭喜你,拷贝证书和配置文件到/etc/openvpn可以直接执行service openvpn start即可。

==补充Ubuntu14.04上设置数据转发的方法==
执行:
$ sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
然后保存到iptable配置文件:
$ sudo iptables-save > /etc/iptables-rules
最后执行:
$ sudo vi  /etc/network/interfaces
在文件末尾加入:
pre-up iptables-restore < /etc/iptables-rules

1 条评论: