如何在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 either tcp or udp; the default is fine
  • 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。 这是在 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_enablenet.inet.ip.forwarding 设置为 1 允许系统上的 IPv4 路由
  • natd_enable 启用实际的 NAT 路由器
  • natd_interface是外网接口; vtnet0 用于 DigitalOcean
  • natd_flags 使 NAT 动态化, -m 保留端口号

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

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.88.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

注意:如果你修改了服务器的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

确保一直滚动到右侧,因为这是一个长命令。

nanocat 查看完成的 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 服务器。