Debian/Ubuntu上的openvpn搭建
今天总算是把OpenVPN配置好了。在diahosting和myhost123测试通过。
因为之前用的iptables规则不正确,所以一直能连接到VPN但无法访问外部网络,于是就记录一下吧.
系统有现成的包,直接安装:
$ apt-get -y install openvpn
复制配置文件和生成证书的工具
$ cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn $ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ $ cd /etc/openvpn $ gzip -d server.conf.gz $ cd easy-rsa/2.0/
准备生成证书,如果不需要指定证书的信息,可以跳过编辑vars文件的步骤
$ vi vars $ . ./vars $ ./clean-all
生成ca证书,可以一路回车
$ ./build-ca
下面生成服务器和客户端的证书,每次生成到最后有2个提问必须回答y,才能真正生成证书,如果一路按回车,到最后可能发现一个空证书
$ ./build-key-server server $ ./build-key client1
再生成一个DH PARAMETERS,OpenVPN的服务器需要这个
$ ./build-dh
OpenVPN所需要的key就生成好了.
$ cd keys $ cp ca.crt dh1024.pem server.crt server.key /etc/openvpn/
然后就可以直接用工具把/etc/openvpn/easy-rsa/2.0/目录下的ca.crt client1.crt client1.key文件保存到本地,连接的时候要用。win平台下推荐使用winscp
之后就是修改配置文件了.先修改服务器端的/etc/openvpn/server.conf
port 1234 #连接端口 ;proto tcp proto udp #连接方式 ;dev tap dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key # This file should be kept secret dh /etc/openvpn/dh1024.pem server 10.8.0.0 255.255.255.0 #ip分配,不能跟本地冲突 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" #dns push "dhcp-option DNS 8.8.4.4" ;duplicate-cn #如果你要多人共用一个证书的话,请开启本项。 keepalive 10 120 #连接测试,意思是10秒ping一次,120秒没有返回就断开重连 comp-lzo #开启压缩传输 persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 3
然后需要在服务器端设置iptables,假设我的服务器ip是12.34.56.78
$ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 12.34.56.78
启动服务器端
$ /etc/init.d/openvpn start
再编辑一个本地的配置文件client.ovpn,大部分信息都跟上面的server.conf对应
client ;dev tap dev tun ;proto tcp proto udp remote 12.34.56.78 1234 #连接ip/域名 端口 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key ns-cert-type server comp-lzo verb 3
然后,下载客户端并安装
我用的是windows的客户端,安装完毕后如果安装目录下没有config和log目录,要手动建立它们
将刚刚保存的ca.crt client1.crt client1.key client.ovpn这几个文件复制到config目录下,运行桌面上的OpenVPN GUI就可以连接了.
如果出现无法连接的错误或者是连接后,不能访问外网的情况,可以尝试一下在服务器端开启一下相应的端口:
#TCP $ iptables -A INPUT -p tcp --dport 1234 -j ACCEPT $ iptables -A OUTPUT -p tcp --sport 1234 -j ACCEPT #UDP $ iptables -A INPUT -p udp --dport 1234 -j ACCEPT $ iptables -A OUTPUT -p udp --sport 1234 -j ACCEPT
