如何配置和连接到专用OpenVPN服务器在FreeBSD 10.1

OpenVPN是一个开放源码的虚拟专用网络(VPN)服务器/客户端应用程序,它可以让你安全地加入虚拟网络(类似于LAN)。本教程将介绍如何安装和一台FreeBSD 10.1机器的IPv4 NAT以及路由的配置OpenVPN服务器。截至去年底,你将运行自己的OpenVPN服务器,并有准备好下载到连接到该网络的客户端配置文件。

介绍

OpenVPN是一个开源虚拟专用网(VPN)服务器/客户端应用程序,它允许您安全地加入虚拟网络(类似于LAN)。

本教程将解释如何在FreeBSD 10.1机器上使用IPv4 NAT和路由安装和配置OpenVPN服务器。 它包括各种配置选项的简短说明。

在本教程结束时,您将运行您自己的OpenVPN服务器,并有一个客户端配置文件准备下载以连接到此网络。

先决条件

  • 一个FreeBSD 10.1 Droplet。 Droplet大小取决于您打算连接到VPN的客户端数量; 519 MB适用于少数客户
  • 根访问。 sudo是预装在DigitalOcean上的,所以没有什么额外的事情

本教程需要root访问权限。 在DigitalOcean,访问服务器作为默认的FreeBSD用户,然后访问root的shell:

sudo tcsh

第1步 - 安装OpenVPN

与安装OpenVPN的pkg系统是相当简单的。 只需运行这些命令即可更新软件包列表并安装VPN软件:

pkg update
pkg install openvpn

这也应该安装easy-rsa包,这将被用于产生SSL密钥对。

第2步 - 配置OpenVPN服务器

对于本教程,我们将基于OpenVPN提供的示例提供配置文件。 我们将为OpenVPN创建一个配置文件夹:

mkdir /usr/local/etc/openvpn

这个例子复制server.conf文件复制到新目录中。

cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/server.conf

安装nano或者你喜欢的文本编辑器:

pkg install nano

打开配置文件进行编辑:

nano /usr/local/etc/openvpn/server.conf

注:OpenVPN的配置文件格式前缀使用分号注释( ; )或散列( # )。 在示例中,分号用于注释(禁用)配置选项,散列用于注释。

如果您知道要修改的配置选项,可以在此时执行此操作。

  • 可选 port :默认端口为1194,但你可以改变这个你喜欢什么
  • 可选 proto :选择使用tcpudp ; 默认是罚款
  • usergroup :这些设置为nobody通过取消注释行。 这将使OpenVPN运行的权限较少,为了安全
user nobody
group nobody

注意:每个配置可以一次运行只有一个端口和协议。

最后,请务必保存您的更改。

第3步 - 生成服务器证书和密钥

easy-rsa使生成的证书和密钥简单。

首先,将程序复制到您的配置目录,因为您将修改值。

cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa

打开vars文件进行编辑:

nano /usr/local/etc/openvpn/easy-rsa/vars

通过修改此行更改键大小:

export KEY_SIZE=2048

这些天,标准是2048位的密钥,虽然你也可以使用4096位,这是更安全,但减慢谈判。

如果您喜欢,您还可以在此文件中设置默认证书和密钥值,以便您以后不必输入。

由于我们使用的shell是tcsh ,在export线需要被替换setenv 这与做sed的前source 移动到我们的easy-rsa目录(必需)。

cd /usr/local/etc/openvpn/easy-rsa/

替换行:

cat ./vars | sed -e 's/export /setenv /g' -e 's/=/ /g' | source /dev/stdin

尽管如此,从我们/usr/local/etc/openvpn/easy-rsa/目录下,先清洁的目录,然后构建证书颁发机构(CA)。

./clean-all
./build-ca

系统将提示您设置CA选项。 填写您的详细信息:

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [changeme]:vpn.example.com
Name [changeme]:Callum's VPN CA
Email Address [mail@host.domain]:callum@example.com

现在构建服务器密钥:

./build-key-server server

再次,设置选项。 您不需要密码或可选的公司名称。

输入y签署并提交键:

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [server]:vpn.example.com
Name [changeme]:Callum's VPN Server
Email Address [mail@host.domain]:callum@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ENTER
An optional company name []: ENTER

Certificate is to be certified until Feb  5 14:40:15 2025 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

最后,必须生成Diffie-Hellman密钥。 这可能需要一些时间,具体取决于密钥大小:

./build-dh

现在所有的服务器密钥和证书都生成了,它们应该被复制到我们的OpenVPN配置目录。

cd /usr/local/etc/openvpn/easy-rsa/keys/
cp dh*.pem ca.crt server.crt server.key /usr/local/etc/openvpn/

您已完成服务器证书! 现在到客户端证书。

第4步 - 生成客户端证书

每个客户端还将需要一个证书和密钥,以便验证和连接到VPN。 请确保您在是/usr/local/etc/openvpn/easy-rsa/目录下。

cd /usr/local/etc/openvpn/easy-rsa/

运行以下命令,其中clientName是您要使用该特定客户端证书的名称。

./build-key clientName

系统将提示您再次输入国家名称,城市名称等。 该过程与服务器密钥生成的过程相同。 这是为客户的信息,但没有一件真的很重要。

您不需要密码或公司名称。 输入y签署并提交证书。

注意:这是用于每个客户端不同的证书良好的实践中,这是由OpenVPN的默认执行。 但是,如果需要,可以在OpenVPN配置中禁用此功能(稍后解释)。

如果从使用不同的密钥大小2048 ,您将需要修改OpenVPN的配置以匹配您使用的密钥大小的文件名。 如果你不记得,你可以查看的正确的文件名dh与此命令文件:

ls /usr/local/etc/openvpn/easy-rsa/keys/dh*.pem

编辑server.conf

nano /usr/local/etc/openvpn/server.conf

替换行dh dh2048.pem有:

dh dhSIZE.pem

如果您之前遵循了我们对2048位密钥的建议,则不必进行任何更改。

对要创建的每个单独的客户端证书重复此部分。

第5步 - 配置IPv4 NAT路由

FreeBSD包含natd作为一部分ipfw防火墙其允许NAT路由和可用于OpenVPN的。 为了使用它,编辑/etc/rc.conf

nano /etc/rc.conf

在底部添加以下内容:

firewall_enable="YES"
firewall_type="open"

gateway_enable="YES"
natd_enable="YES"
natd_interface="vtnet0"
natd_flags="-dynamic -m"
  • firewall_enable使ipfw这是需要防火墙natd
  • firewall_type="open" ,使防火墙允许流量为默认
  • gateway_enablenet.inet.ip.forwarding1 ,它允许在系统上的IPv4路由
  • natd_enable使实际的NAT路由器
  • natd_interface朝向因特网的外部接口; vtnet0用于DigitalOcean
  • natd_flags使得NAT动态和-m保留端口号

现在,重新启动服务器加载ipfwnatd

reboot

再次登录。 重新启动后,请记住运行sudo tcsh再次成为root如果你没有的话。

第6步 - 配置OpenVPN路由配置和DNS

默认情况下,OpenVPN没有配置为告诉客户端通过VPN路由Internet流量。 我们将通过制作OpenVPN的肯定它路由流量通过取消注释在某些线路/usr/local/etc/openvpn/server.conf

nano /usr/local/etc/openvpn/server.conf

找到并取消注释这三行:

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

预置DNS服务器是OpenDNS的,但你可以将其设置为你喜欢的(如与谷歌DNS任何DNS 8.8.8.88.8.4.4 )。

可选设置:

您也可以允许客户端通过取消注释直接与对方的IP通信:

client-to-client

如果,如前所述,您想要为多个客户端使用相同的密钥和证书(这稍微不安全),请取消注释此行:

duplicate-cn

可以使用此行启用和禁用压缩:

comp-lzo

您可以通过取消注释以下行之一来手动设置密码:

cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
cipher DES-EDE3-CBC  # Triple-DES

注意:无论使用哪种密码还必须在客户端配置文件,我们将在稍后创建定义。

额外的密码也可用,如aes-256-cbc

第7步 - 启动OpenVPN

启用OpenVPN的开机和负载与加载service通过添加以下行命令/etc/rc.conf

nano /etc/rc.conf

在文件的底部添加以下行:

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"

OpenVPN服务器现在已完全配置,将在引导时加载。

使用以下命令手动启动服务器:

service openvpn start

预期输出:

add net 10.8.0.0: gateway 10.8.0.2

您的OpenVPN服务器现在正在运行。

第8步 - 配置客户端文件

服务器上,我们会为每个客户端的配置文件。

首先,创建要在其中工作的文件夹:

mkdir -p /usr/local/etc/openvpn/clients/clientName

clientName我们之前设置而产生的证书的客户名称。 (这并不重要,你是如何设置的,因为它只是一个工作目录。)

移动到新目录:

cd /usr/local/etc/openvpn/clients/clientName/

拷贝中的客户端密钥和我们与生成的证书easy-rsa和样本client.conf文件。 确保您更换clientName与先前的使用的名称.key.crt文件:

cp /usr/local/etc/openvpn/easy-rsa/keys/clientName.crt /usr/local/etc/openvpn/easy-rsa/keys/clientName.key ./
cp /usr/local/share/examples/openvpn/sample-config-files/client.conf ./client.conf
cp /usr/local/etc/openvpn/ca.crt ./

再次, clientName就是我们前面使用。

编辑client.conf文件:

nano ./client.conf

更新remote线,其中包括你的Droplet的IP地址(可以用获得ifconfig )和端口号; 1194是默认的:

remote your_server_ip 1194

注意:如果你修改了服务器的ciphercomp-lzo设置,那么必须在反射client.conf文件。 使用与以前相同的设置; 例如:

cipher aes-256-cbc
;comp-lzo

此设置使用aes-256-cbc加密和禁用压缩。

如果更改了proto在服务器配置线,那么这也需要在客户端中反映出来。

确保这些线路匹配你先前设置; 如果您在服务器端没有更改任何内容,请不要在此处更改。

现在有点家务; 我们将在单个配置文件中嵌入证书和密钥。 这使得更容易转移到个别客户端。 或者,您可以分别将配置文件,密钥和两个证书文件下载到客户端。

在同一个client.conf文件,注释掉证书和密钥的文件名:

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

保存更改。

最后,我们需要嵌入ca.crtclientName .crtclientName .key文件配置文件英寸 您可以复制并粘贴到使用内容catnano或任何你最舒服的,和适当的变量OpenVPN的,也可以使用如下所示的行脚本。

运行此脚本,并输入您clientName提示时。 该脚本追加证书和密钥文件到client.conf文件,用适当的变量名和换行符的OpenVPN的期待:

echo "Enter clientName:" && set CLIENTNAME = $< && printf "\n<ca>\n" >> ./client.conf && cat ./ca.crt >> ./client.conf && printf "</ca>\n" >> ./client.conf && printf "\n<cert>" >> ./client.conf && grep -v '^ ' ./$CLIENTNAME.crt | grep -v 'Certificate' >> ./client.conf && printf "</cert>\n" >> ./client.conf && printf "\n<key>\n" >> ./client.conf && cat ./$CLIENTNAME.key >> ./client.conf && printf "</key>\n" >> ./client.conf

确保你向右滚动,因为这是一个长命令。

看看成品client.conf与文件nanocat 您应该看到在底部的文件中添加的密钥和证书。

你完成了! 所有这一切现在需要做的是在分发client.conf文件到您的客户端。 大多数客户更愿意扩展.ovpn.conf ,所以你要重命名的文件在本地以my_digitalocean_vpn.ovpn或类似的东西。

对每个客户端重复此部分。 默认情况下使用单独的证书,或者如果您愿意,可以在每个客户端上使用相同的客户端证书。

结论和客户端安装

你现在应该有一个工作的OpenVPN服务器!

下载您在上一步中创建的客户端配置文件( /usr/local/etc/openvpn/clients/ clientName /client.conf )到本地机器 使用安全的方法来下载文件,如SCP或SFTP

同时在本地计算机上,安装一个OpenVPN客户端。 的Tunnelblick效果很好在Mac OS X和OpenVPN的有一个Windows客户端。

确保您的客户端配置文件按预期命名; 这通常是像一个名字my_digitalocean_vpn.ovpn

双击文件或将其移动到客户端的预期目录。

启动您的客户端并连接到相应的OpenVPN服务器。

为了确保您的VPN正常工作,使用一个IP地址检查,如http://www.whatismyip.com/ 您显示的IP应该与您的OpenVPN服务器的IP匹配。

恭喜! 您已连接到新的OpenVPN服务器。