OpenVPN搭建VPN实战

Linux, 安装配置 , , , ,

系统环境:CentOS 5.1(最小安装) * 4
网络拓朴:
network.JPG
达成目标:让处于外网VPN Client (PC1)以他的subnet能够访问服务器的内网段10.0.2.0/24。

一,安装Openvpn
下载OpenVPN源包:

[root@server ~]#wget http://openvpn.net/release/openvpn-2.0.9.tar.gz

解压并进行解压后目录:

[root@server ~]#tar -xvf openvpn-2.0.9.tar.gz
[root@server ~]#cd  openvpn-2.0.9
[root@server openvpn-2.0.9]#

安装一些编绎的依赖包(请确保你的yum能正常工作):

[root@server openvpn-2.0.9]#yum install -y gcc openssl-devel make

编绎,并安装:

[root@server openvpn-2.0.9]#./configure --disable-lzo --enable-iproute2
[root@server openvpn-2.0.9]#make
[root@server openvpn-2.0.9]#make install

二,生成OpenVPN证书文件
进入openvpn源码目录下面的easy-rsa目录:

[root@server openvpn-2.0.9]#pwd
/root/openvpn-2.0.9
[root@server openvpn-2.0.9]# cd easy-rsa/
[root@server easy-rsa]#

编辑vars文件,把所有的值改为你需要的,不要让任何值留空:

[root@server easy-rsa]# vi vars

设置变量:

[root@server easy-rsa]# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/openvpn-2.0.9/easy-rsa/keys

清除原来所有的配置(第一次时使用,或者需要全部重建时才使用):
[root@server easy-rsa]# ./clean-all

生成ca文件(第一次时使用,或者需要全部重建时才使用):

[root@server easy-rsa]# ./build-ca
Generating a 1024 bit RSA private key
................++++++
......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:VPN_Server
Common Name (eg, your name or your server's hostname) []:VPN_Server
Email Address [me@myhost.mydomain]:

这步时,如上所示,会提示一些输入信息,请尽量不要留空,特别是Organizational Unit Name与Common Name

生成dh文件(第一次时使用,或者需要全部重建时才使用):

[root@server easy-rsa]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
......................................................+......+................................................++*++*++*

这一步的时间可能会比较长,大家等等就可以了。

生成服务器端证书文件(一般程序下,只在第一次或者重建时使用)

[root@server easy-rsa]#./build-key-server server
Generating a 1024 bit RSA private key
................................++++++
..++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:Server
Common Name (eg, your name or your server's hostname) []:VPN_Server
Email Address [me@myhost.mydomain]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/openvpn-2.0.9/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’KG’
stateOrProvinceName :PRINTABLE:’NA’
localityName :PRINTABLE:’BISHKEK’
organizationName :PRINTABLE:’OpenVPN-TEST’
organizationalUnitName:PRINTABLE:’Server’
commonName :T61STRING:’VPN_Server’
emailAddress :IA5STRING:’me@myhost.mydomain’
Certificate is to be certified until Jun 29 04:05:54 2018 GMT (3650 days)
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

这步跟CA那步一样,除了challenge password与optional company name外,其他都不能为留空,特别是Organizational Unit Name与Common Name,下面的两步,请选择y(yes)。

生成客户端证书(与生成服务器端几乎一样,但Common Name请使用不同值)

[root@server easy-rsa]#./build-key vpn_client

Organizational Unit Name与Common Name的值,我们在这里都设置为与文件一样的vpn_client。

三、配置OpenVPN服务器端
设置服务器启动时自动加载服务

[root@server easy-rsa]# cd ..
[root@server openvpn-2.0.9]# cp sample-scripts/openvpn.init /etc/init.d/openvpn
[root@server openvpn-2.0.9]# chkconfig openvpn on

拷贝服务器端所需文件到/etc/openvpn:

[root@server openvpn-2.0.9]#mkdir /etc/openvpn
[root@server openvpn-2.0.9]#cp easy-rsa/keys/ca.crt easy-rsa/keys/server.crt easy-rsa/keys/server.key easy-rsa/keys/crl.pem /etc/openvpn
[root@server openvpn-2.0.9]#cp sample-config-files/server.conf /etc/openvpn/

按自己的要求来编辑server.conf文件

[root@server ~]# vi /etc/openvpn/server.conf

找到:

;local a.b.c.d

去掉前面的;(分号),把a.b.c.d改为你要监听的外网地址,也可以留空监听所有的地址

找到

port 1194

修改1194到你想要监听的端口。

找到

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem

修改上面文件到你的这四个个文件所在的位置,可以是绝对路径,如果在/etc/openvpn下则可以不标明路径
并在下面新加上一行:

crl-verify crl.pem

其中crl.pem的路径定义同上。

找到:

server 10.8.0.0 255.255.255.0

把10.8.0.0 255.255.255.0修改成你想要的VPN网段。
我这里修改成为

server 172.16.101.0 255.255.255.0

找到:

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

在后面加上:

push "route 10.0.1.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
route 10.0.1.0 255.255.255.0

找到:

;client-config-dir ccd

去掉前面的;(分号)

找到:

comp-lzo

将其注释

建立/etc/openvpn/ccd目录,并建立vpn_client的子网段文件

[root@server openvpn-2.0.9]#mkdir /etc/openvpn/ccd
[root@server openvpn-2.0.9]#echo 'iroute 10.0.1.0 255.255.255.0' > /etc/openvpn/ccd/vpn_client

四,启动OpenVPN

[root@server ~]# /etc/init.d/openvpn start
Starting openvpn:                                          [  OK  ]

然后查看路由表,应该可以看到内似下面的路由:

[root@server ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.101.2    *               255.255.255.255 UH    0      0        0 tun0
172.16.101.0    172.16.101.2    255.255.255.0   UG    0      0        0 tun0
192.168.21.0    *               255.255.255.0   U     0      0        0 eth0
10.0.1.0        172.16.101.2    255.255.255.0   UG    0      0        0 tun0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth2
222.243.159.0   *               255.255.255.0   U     0      0        0 eth1

五,设置转发

[root@server openvpn-2.0.9]# echo 1 >  /proc/sys/net/ipv4/ip_forward
[root@server openvpn-2.0.9]# iptables -A FORWARD -i tun0 -j ACCEPT
[root@server openvpn-2.0.9]# iptables -A INPUT -i tun0 -j ACCEPT

OK,服务器端到这里基本上配置完成了
接下到,我们要到vpn_client也就是我的PC1可进行配置了

首先,我们要我们当然要也在客户端上安装一个OpenVPN,过程与前面一样,如果你在客户端不想启用server的功能,在configure的时候,可以加上 –disable-server 这个选项。

同样要把OpenVPN设置成为自动启动,方法如上。

然后,从服务器上把开始生成在/root/openvpn-2.0.9/easy-rsa/keys/下面的三个文件copy到客户端上上的/etc/openvpn下,如果没有这个目录则手动建立一个。
这三个文件分别是:

ca.crt    vpn_client.crt     vpn_client.key

然后,从OpenVPN的源包里面copy一个client.conf到/etc/openvpn下面:

[root@PC1 openvpn-2.0.9]# cp sample-config-files/client.conf /etc/openvpn/

修改这个文件几个地方:

[root@PC1 ~]# vi /etc/openvpn/client.conf

找到:

remote my-server-1 1194

把my-server-1以及1194修改成为你OpenVPN服务器的地址以及所设置的端口
我这里修改成为

remote 222.243.159.1 1194

找到:

ca ca.crt
cert client.crt
key client.key

修改成为:

ca ca.crt
cert vpn_client.crt
key vpn_client.key

OK,启动OpenVPN

[root@PC1 openvpn-2.0.9]# /etc/init.d/openvpn start

路由表应类似下面情况:

[root@PC1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.101.5    0.0.0.0         255.255.255.255 UH    0      0        0 tun0
172.16.101.0    172.16.101.5    255.255.255.0   UG    0      0        0 tun0
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.0.2.0        172.16.101.5    255.255.255.0   UG    0      0        0 tun0
222.243.159.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth1
0.0.0.0         222.243.159.1   0.0.0.0         UG    0      0        0 eth0

设置IP转发

[root@PC1 openvpn-2.0.9]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@PC1 openvpn-2.0.9]# iptables -A FORWARD -i tun0 -j ACCEPT
[root@PC1 openvpn-2.0.9]# iptables -A INPUT -i tun0 -j ACCEPT

最后,我们到PC1的sub-machine(PC3)上看看,是不是能连接到Intranet Server(PC3)了

[root@PC2 ~]# ping 10.0.2.64 -c 4
PING 10.0.2.64 (10.0.2.64) 56(84) bytes of data.
64 bytes from 10.0.2.64: icmp_seq=1 ttl=62 time=7.36 ms
64 bytes from 10.0.2.64: icmp_seq=2 ttl=62 time=1.96 ms
64 bytes from 10.0.2.64: icmp_seq=3 ttl=62 time=1.98 ms
64 bytes from 10.0.2.64: icmp_seq=4 ttl=62 time=2.48 ms

— 10.0.2.64 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 1.965/3.450/7.363/2.268 ms

[root@PC2 ~]# traceroute 10.0.2.64
traceroute to 10.0.2.64 (10.0.2.64), 30 hops max, 40 byte packets
1  server (10.0.1.1)  0.873 ms  0.549 ms  1.273 ms
2   (172.16.101.1)  1.216 ms  2.636 ms  10.080 ms
3  client2 (10.0.2.64)  9.476 ms !X  9.650 ms !X  9.545 ms !X

注意看路由表的第二节点,走的是172.16.101.1,这是OpenVPN的虚拟地址,说明,现在由10.0.1.64到10.0.2.64是由VPN直接连接的了。

ping与traceroute都通过,说明成功了。


One Response to “OpenVPN搭建VPN实战”

  1. myhnet — July 15, 2008 @ 4:09 pm

    补充说明:
    由于我们禁用了lzo,
    所以,在客户端配置文件里面也要把lzo相关的配置注释掉
    上面忘记写了

Leave a Reply