如何在FreeBSD10.1上配置和连接到私有OpenVPN服务器
介绍
OpenVPN 是一个开源虚拟专用网络 (VPN) 服务器/客户端应用程序,它允许您安全地加入虚拟网络(类似于 LAN)。
本教程将解释如何在具有 IPv4 NAT 和路由的 FreeBSD 10.1 机器上安装和配置 OpenVPN 服务器。 它包括各种配置选项的简短说明。
在本教程结束时,您将运行自己的 OpenVPN 服务器,并准备好下载客户端配置文件以连接到该网络。
先决条件
- FreeBSD 10.1 Droplet。 液滴大小取决于您打算连接到 VPN 的客户端数量; 519 MB 适合少数客户
- 根访问权限。 sudo 已预先安装在 DigitalOcean 上,因此无需额外操作
本教程需要 root 访问权限。 在 DigitalOcean 上,以默认的 freebsd 用户身份访问服务器,然后访问 root shell:
sudo tcsh
第 1 步 — 安装 OpenVPN
使用 pkg
系统安装 OpenVPN 非常简单。 只需运行以下命令即可更新软件包列表并安装 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
: The default port is 1194, but you can change this to anything you like - 选修的
proto
: Choose eithertcp
orudp
; the default is fine user
和group
:通过取消注释将这些设置为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
。 这是在 source
之前使用 sed
完成的。 移动到我们的 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
启用natd
所需的ipfw
防火墙firewall_type="open"
使防火墙默认允许流量gateway_enable
将net.inet.ip.forwarding
设置为1
允许系统上的 IPv4 路由natd_enable
启用实际的 NAT 路由器natd_interface
是外网接口;vtnet0
用于 DigitalOceannatd_flags
使 NAT 动态化,-m
保留端口号
现在重新启动服务器以加载 ipfw
和 natd
:
reboot
重新登录。 重启后,记得再次运行 sudo tcsh
以成为 root(如果您还没有的话)。
第 6 步 - 配置 OpenVPN 路由配置和 DNS
默认情况下,OpenVPN 未配置为告诉客户端通过 VPN 路由 Internet 流量。 我们将通过取消注释 /usr/local/etc/openvpn/server.conf
中的某些行来确保它确实通过 OpenVPN 路由流量:
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(例如带有 8.8.8.8
和 8.8.4.4
的 Google DNS)。
可选设置:
您还可以通过取消注释来允许客户端直接与彼此的 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
通过将以下行添加到 /etc/rc.conf
,启用 OpenVPN 以在启动时加载并使用 service
命令加载:
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
注意:如果你修改了服务器的
cipher
或comp-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.crt
、clientName.crt
和clientName.key
文件。 您可以使用 cat
或 nano
或任何您最熟悉的方式复制并粘贴内容,以及适用于 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
确保一直滚动到右侧,因为这是一个长命令。
用 nano
或 cat
查看完成的 client.conf
文件。 您应该会在底部看到添加到文件中的密钥和证书。
你完成了! 现在需要做的就是将 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 服务器。