OpenVPN使用TLS加密是通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Public key,另一个是Private key)对数据进行加密的,对于TLS传输的工作原理,大家可以去Google一下,资料一大堆。对于OpenVPN使用TLS mode,首先Server和Client要有相同CA签发的证书,双方通过交换证书验证双方的合法性以决定是否建立VPN连接,然后使用对方CA把自己目前使用的数据加密方法(类似于密钥)加密后发送给对方,由于使用对方CA加密的,所以只有对方CA对应的Private key才能解密该字串,保证了此密钥的安全性,并且此密钥定期改变,对于窃听者来说,可能还没有破解出密钥,通信双方已经更换密钥了。
OpenVPN的NAT穿透力特强,支持HTTP代理,对动态地址支持很好,可配置性强,配置安全,开源便于二次开发…其他没有想好:)。关于OpenVPN的相关内容可以在http://openvpn.net上找到。
首选到ports里面安装OpenVPN
代码:
cd /usr/ports/security/openvpn
make install clean
安装完毕,开始进行配置
代码:
cd /usr/local/share/doc/openvpn/easy-rsa
默认的vars文件在FreeBSD下是用不了的,不要运行它,直接在csh下面执行以下格式的语句.
代码:
setenv D `pwd`
setenv KEY_CONFIG /usr/local/share/doc/openvpn/easy-rsa/openssl.cnf
setenv KEY_DIR /usr/local/etc/openvpn/keys
setenv KEY_SIZE 1024
setenv KEY_COUNTRY CN
setenv KEY_PROVINCE ZJ
setenv KEY_CITY HANZHOU
setenv KEY_ORG “hacker-piao’s VPN”
setenv KEY_EMAIL “hacker-piao@163.com”
建立openvpn的配置文件目录
代码:
mkdir /usr/local/etc/openvpn
现在来生成根证书
初始化keys目录生产根证书以及key
代码:
./clean-all
./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.
—–
跟着就提示你输入国家/省份/城市等信息,不用管它,都是默认,只有
Common Name (eg, your name or your server’s hostname) []:
这个要设置,可以设置成你的主机名或者你的组织名什么的,例如 YEKE-VPN
生成服务器使用的证书.
代码:
./build-key-server server
跟刚才的步骤一样,Common Name这个填写server,
代码:
Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]
上面这两项填写y,其他的全部默认.
生成客户端使用的证书
代码:
./build-key client1
./build-key client2
….
你可以为各个客户端生成各自的证书.
接着生成dh1024.pem
代码:
./build-dh
证书生成完毕,现在开始设置配置文件.
先复制配置文件到配置文件目录里面
代码:
cp /usr/local/share/doc/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn
代码:
cp /usr/local/share/doc/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/openvpn.conf
编辑配置文件server.conf和openvpn.conf,这里只说明一下需要修改的地方,其他的不另解析.
port 1194
这是openvpn监听的端口,如果你认为默认端口不安全,可以改成你想要的端口,跟客户端配置文件要一致
;proto tcp
proto udp
使用什么方式的连接,默认是udp
;dev tap
dev tun
这是网络设置选项,一般来说,官方推荐使用tun接口,如果你要使用桥接,则需要改成tap接口
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/server.crt
key /usr/local/etc/openvpn/keys/server.key
这三个是设置证书具体路径,填写绝对路径.
dh /usr/local/etc/openvpn/keys/dh1024.pem
同上
server 10.8.0.0 255.255.255.0
这个选项是设置VPN控制的子网,10.*.*.*属于内部网络的IP地址,像192.168.*.*那样,适合做VPN,一般来说,一个/24网段足够VPN使用的了,如果你用数百个人同时连接VPN的话你可能需要更多IP地址,可以改成
server 10.8.0.0 255.255.0.0
;client-to-client
这个选项是设置客户端之间可以相互通信的
duplicate-cn
这个是设置同一个客户证书可以同时多个连接
配置完毕,差最后一步就可以启动OpenVPN了.现在要编译一下它的启动脚本
代码:
ee /usr/local/etc/rc.d/openvpn
找到下面选项
代码:
openvpn_enable
加入到/etc/rc.conf
代码:
openvpn_enable=”YES”
服务端配置完毕,启动OpenVPN
/usr/local/etc/rc.d/openvpn start
启动成功的话一般会看到
Starting openvpn.
add net 10.8.0.0: gateway 10.8.0.2
有一个更复杂实例参见http://bbs.chinaunix.net/thread-830695-1-1.html
附:修改Windows的VPN默认端口的方法
通过修改注册表达到自定义端口的目的:首先在服务端注册表里面找到这个项[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}],这个项里面设置的是和网络适配器有关的键值,这个项下面可以看到诸如0000、0001、0002等命名的分支,这些分支设置的是各个接口的信息,然后我们找到里面含有字符串DriverDesc并且数值是WAN 微型端口 (PPTP)的那个分支,这个分支可能是上述0000、0001、0002等命名分支中的一个,我们继续找到该分支下面的TcpPortNumber键,可以看到它默认的十进制值为1723,这个1723就是VPN服务所开的默认端口号,我们把它修改为其他任意端口号即可。
通过上面的设置,我们重启服务器后在服务端CMD下输入netstat -an会发现这时VPN服务器已经开始侦听我们修改以后的端口号了,说明服务端已经成功更换了默认的端口号1723。
接下来是客户端的设置。VPN服务修改端口号和终端服务修改3389端口号不同,后者只需服务端修改后客户端直接在目标IP后面加冒号加端口号就能连接。通过实验发现,VPN的客户端电脑同样需要做上述在服务端上面的注册表键值修改操作才能连接服务端,并且修改后客户端系统自带的防火墙还必须关闭才能成功连接(仅开放该端口还不行),否则就要提示错误691:不能建立到远程计算机的连接,因此用于此连接的端口已关闭。而使用默认的1723就不需要防火墙的端口开放。
总结:采用Windows Server自带的路由和远程访问(RRAS)构建的VPN服务器要修改默认端口号,必须服务器和客户端同时修改注册表中TcpPortNumber的键值;客户端除了修改注册表,还必须关闭系统自带的防火墙。