如何在Debian8上设置OpenVPN服务器
介绍
OpenVPN 是一个开源 VPN 应用程序,可让您通过公共 Internet 安全地创建和加入专用网络。 简而言之,这允许最终用户屏蔽连接并更安全地导航不受信任的网络。
话虽如此,本教程将教您如何在 Debian 8 上设置 OpenVPN,这是一种开源安全套接字层 (SSL) VPN 解决方案。
注意: 如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意,我们与许多托管服务提供商一样,会对带宽超额收费。 因此,请注意您的服务器正在处理多少流量。
有关详细信息,请参阅 本页。
先决条件
本教程假设您具备以下条件:
- 一个新鲜的 Debian 8.1 Droplet
- 一个根用户
- 可选:完成本教程后,使用启用 sudo 的非 root 帐户进行一般维护; 您可以按照本教程的步骤2和3进行设置
第 1 步 — 安装 OpenVPN
在安装任何软件包之前,请更新 apt 软件包索引。
apt-get update
现在,我们可以安装 OpenVPN 服务器和 easy-RSA 进行加密。
apt-get install openvpn easy-rsa
第 2 步 — 配置 OpenVPN
需要将示例 VPN 服务器配置文件解压缩到 /etc/openvpn
,以便我们可以将其合并到我们的设置中。 这可以通过一个命令来完成:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
解压后,使用 nano 或您喜欢的文本编辑器打开服务器配置文件。
nano /etc/openvpn/server.conf
在此文件中,我们将需要进行四项更改(将详细说明每一项):
- 具有更高级别加密的安全服务器
- 将网络流量转发到目的地
- 防止 DNS 请求泄漏到 VPN 连接之外
- 设置权限
首先,我们将生成服务器和客户端密钥时使用的 RSA 密钥长度加倍。 在主注释块和更多块之后,搜索如下行:
/etc/openvpn/server.conf
# Diffie hellman parameters. # Generate your own with: # openssl dhparam -out dh1024.pem 1024 # Substitute 2048 for 1024 if you are using # 2048 bit keys. dh dh1024.pem
将 dh1024.pem
更改为 dh2048.pem
,因此该行现在显示为:
/etc/openvpn/server.conf
dh dh2048.pem
其次,我们将确保将所有流量重定向到正确的位置。 仍然在 server.conf
中,滚动浏览更多评论块,然后查找以下部分:
/etc/openvpn/server.conf
# If enabled, this directive will configure # all clients to redirect their default # network gateway through the VPN, causing # all IP traffic such as web browsing and # and DNS lookups to go through the VPN # (The OpenVPN server machine may need to NAT # or bridge the TUN/TAP interface to the internet # in order for this to work properly). ;push "redirect-gateway def1 bypass-dhcp"
取消注释 push "redirect-gateway def1 bypass-dhcp"
以便 VPN 服务器将客户端的网络流量传递到其目的地。 完成后应该是这样的:
/etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp"
第三,我们将告诉服务器尽可能使用 OpenDNS 进行 DNS 解析。 这有助于防止 DNS 请求泄漏到 VPN 连接之外。 在先前修改的块之后,立即编辑以下内容:
/etc/openvpn/server.conf
# Certain Windows-specific network settings # can be pushed to clients, such as DNS # or WINS server addresses. CAVEAT: # http://openvpn.net/faq.html#dhcpcaveats # The addresses below refer to the public # DNS servers provided by opendns.com. ;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220"
取消注释 push "dhcp-option DNS 208.67.222.222"
和 push "dhcp-option DNS 208.67.220.220"
。 完成后应该是这样的:
/etc/openvpn/server.conf
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
四、我们将在server.conf
中定义权限:
/etc/openvpn/server.conf
# You can uncomment this out on # non-Windows systems. ;user nobody ;group nogroup
取消注释 user nobody
和 group nogroup
。 完成后应该是这样的:
/etc/openvpn/server.conf
user nobody group nogroup
默认情况下,OpenVPN 以 root 用户身份运行,因此具有系统的完全 root 访问权限。 我们将改为将 OpenVPN 限制为用户 nobody 和组 nogroup。 这是一个没有默认登录功能的非特权用户,通常保留用于运行不受信任的应用程序,例如面向 Web 的服务器。
现在保存您的更改并退出。
第 3 步 — 启用数据包转发
在本节中,我们将告诉服务器内核将流量从客户端服务转发到 Internet。 否则,流量将在服务器处停止。
通过输入以下命令在运行时启用数据包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
接下来,我们需要将此设置永久化,以便此设置在服务器重新启动后仍然存在。 使用 nano 或您喜欢的文本编辑器打开 sysctl
配置文件。
nano /etc/sysctl.conf
在 sysctl
文件的顶部附近,您将看到:
/etc/openvpn/server.conf
# Uncomment the next line to enable packet forwarding for IPv4 #net.ipv4.ip_forward=1
取消注释 net.ipv4.ip_forward
。 完成后应该是这样的:
/etc/openvpn/server.conf
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
保存更改并退出。
第 4 步 — 安装和配置 ufw
UFW 是 IPTables 的前端。 我们只需要进行一些规则和配置编辑。 然后我们将打开防火墙。 作为 UFW 更多用途的参考,请参阅 如何在 Ubuntu 和 Debian 云服务器上使用 UFW 设置防火墙 。
首先,安装ufw
包。
apt-get install ufw
二、设置UFW允许SSH:
ufw allow ssh
本教程将使用基于 UDP 的 OpenVPN,因此 UFW 还必须允许端口 1194
上的 UDP 流量。
ufw allow 1194/udp
还需要设置 UFW 转发策略。 我们将在主配置文件中执行此操作。
nano /etc/default/ufw
查找以下行:
/etc/default/ufw
DEFAULT_FORWARD_POLICY="DROP"
这必须从 DROP
更改为 ACCEPT
。 完成后应该是这样的:
/etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
保存并退出。
接下来,我们将为连接的客户端的网络地址转换和 IP 伪装添加额外的 UFW 规则。
nano /etc/ufw/before.rules
接下来,在 red 中为 OPENVPN RULES 添加区域:
/etc/ufw/before.rules
# # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # Don't delete these required lines, otherwise there will be errors *filter
保存并退出。
通过对 UFW 所做的更改,我们现在可以启用它。 进入命令提示符:
ufw enable
启用 UFW 将返回以下提示:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
回答 y
。 结果将是这个输出:
Firewall is active and enabled on system startup
要检查 UFW 的主要防火墙规则:
ufw status
status 命令应返回以下条目:
Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 1194/udp ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 1194/udp (v6) ALLOW Anywhere (v6)
第 5 步 — 配置和构建证书颁发机构
OpenVPN 使用证书来加密流量。
在本节中,我们将分两步设置我们自己的证书颁发机构 (CA):(1) 设置变量和 (2) 生成 CA。
OpenVPN 支持基于证书的双向认证,这意味着客户端必须对服务器证书进行认证,而服务器必须在建立相互信任之前对客户端证书进行认证。 我们将使用 Easy RSA 的脚本来执行此操作。
首先复制 Easy-RSA 生成脚本。
cp -r /usr/share/easy-rsa/ /etc/openvpn
然后,创建一个目录来存放密钥。
mkdir /etc/openvpn/easy-rsa/keys
接下来,我们将为我们的证书设置参数。 使用 nano 或您喜欢的文本编辑器打开变量文件。
nano /etc/openvpn/easy-rsa/vars
下面用red标记的变量应根据您的喜好进行更改。
/etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="US" export KEY_PROVINCE="TX" export KEY_CITY="Dallas" export KEY_ORG="My Company Name" export KEY_EMAIL="sammy@example.com" export KEY_OU="MYOrganizationalUnit"
在同一个 vars
文件中,也编辑如下所示的这一行。 为简单起见,我们将使用 server
作为键名。 如果您想使用不同的名称,您还需要更新引用 server.key
和 server.crt
的 OpenVPN 配置文件。
下面,在同一个文件中,我们将指定正确的证书。 在先前修改的块之后查找该行
/etc/openvpn/easy-rsa/vars
# X509 Subject Field export KEY_NAME="EasyRSA"
将 KEY_NAME
的默认值 EasyRSA
更改为您想要的服务器名称。 本教程将使用名称 server
。
/etc/openvpn/easy-rsa/vars
# X509 Subject Field export KEY_NAME="server"
保存并退出。
接下来,我们将使用名为 dhparam
的内置 OpenSSL 工具生成 Diffie-Helman 参数; 这可能会需要几分钟。
-out
标志指定保存新参数的位置。
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
我们的证书现在已生成,是时候生成密钥了。
首先,我们将切换到easy-rsa
目录。
cd /etc/openvpn/easy-rsa
现在,我们可以开始设置 CA 本身。 首先,初始化公钥基础设施(PKI)。
注意 ./vars
命令前面的 dot (.) 和 space。 这表示当前的工作目录(源)。
. ./vars
将打印以下警告。 不用担心,因为警告中指定的目录是空的。 NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
。
接下来,我们将清除所有其他可能干扰我们安装的键。
./clean-all
最后,我们将使用 OpenSSL 命令构建 CA。 此命令将提示您确认之前输入的“专有名称”变量。 按 ENTER
接受现有值。
./build-ca
按 ENTER
传递每个提示,因为您只是在 vars
文件中设置了它们的值。
证书颁发机构现已设置。
第 6 步 — 为服务器生成证书和密钥
在本节中,我们将设置并启动我们的 OpenVPN 服务器。
首先,仍然从 /etc/openvpn/easy-rsa
工作,使用服务器名称构建您的密钥。 这在您的配置文件中早先被指定为 KEY_NAME
。 本教程的默认值为 server
。
./build-key-server server
同样,输出将要求确认专有名称。 点击 ENTER
接受定义的默认值。 这一次,将有两个额外的提示。
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
两者都应该留空,所以只需按 ENTER 键通过每一个。
最后的两个额外查询需要一个肯定的 (y
) 响应:
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
然后将提示您以下内容,表明成功。
OutputWrite out database with 1 new entries Data Base Updated
第 7 步 — 移动服务器证书和密钥
我们现在将证书和密钥复制到 /etc/openvpn
,因为 OpenVPN 将在该目录中搜索服务器的 CA、证书和密钥。
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
您可以通过以下方式验证复制是否成功:
ls /etc/openvpn
您应该会看到服务器的证书和密钥文件。
此时,OpenVPN 服务器已准备就绪。 启动它并检查状态。
service openvpn start service openvpn status
status 命令将返回如下效果:
Output* openvpn.service - OpenVPN service Loaded: loaded (/lib/systemd/system/openvpn.service; enabled) Active: active (exited) since Thu 2015-06-25 02:20:18 EDT; 9s ago Process: 2505 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 2505 (code=exited, status=0/SUCCESS)
最重要的是,从上面的输出中,您应该找到 Active: active (exited) since...
而不是 Active: inactive (dead) since...
。
您的 OpenVPN 服务器现在可以运行了。 如果状态消息显示 VPN 未运行,请查看 /var/log/syslog
文件中的错误,例如:
Options error: --key fails with 'server.key': No such file or directory
该错误表明 server.key
未正确复制到 /etc/openvpn
。 重新复制文件并重试。
第 8 步 — 为客户生成证书和密钥
到目前为止,我们已经安装和配置了 OpenVPN 服务器,创建了证书颁发机构,并创建了服务器自己的证书和密钥。 在这一步中,我们使用服务器的 CA 为将连接到 VPN 的每个客户端设备生成证书和密钥。
密钥和证书建设
对于连接到 VPN 的每个客户端来说,拥有自己唯一的证书和密钥是理想的选择。 这优于生成一个通用证书和密钥以在所有客户端设备中使用。
注意: 默认情况下,OpenVPN 不允许使用相同证书和密钥的客户端同时连接到服务器。 (参见 /etc/openvpn/server.conf
中的 duplicate-cn
。)
要为您打算连接到 VPN 的每台设备创建单独的身份验证凭据,您应该为每台设备完成此步骤,但将下面的名称 client1
更改为不同的名称,例如 client2
或 [X223X ]。 每个设备都有单独的凭据,如果需要,以后可以在服务器上单独停用它们。 本教程中的其余示例将使用 client1
作为示例客户端设备的名称。
正如我们对服务器密钥所做的那样,现在我们为我们的 client1
示例构建一个。 您应该仍在使用 /etc/openvpn/easy-rsa
。
./build-key client1
再一次,您将被要求更改或确认专有名称变量以及这两个应留空的提示。 按 ENTER
接受默认值。
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
和以前一样,构建过程结束时的这两个确认需要 (y
) 响应:
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
然后,您将收到以下输出,确认密钥构建成功。
Write out database with 1 new entries. Data Base Updated
然后,我们将生成的密钥复制到我们之前创建的 Easy-RSA keys
目录中。 请注意,我们将扩展名从 .conf
更改为 .ovpn
。 这是为了符合约定。
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
您可以为每个客户端再次重复此部分,将 client1
替换为适当的客户端名称。
注意:你复制的client.ovpn
的名称不需要与客户端设备相关。 客户端 OpenVPN 应用程序将使用文件名作为 VPN 连接本身的标识符。 相反,您应该将 client.ovpn
复制到您希望 VPN 的名称标签出现在您的操作系统中的任何位置。 例如:work.ovpn会被识别为work,school.ovpn会被识别为school等。
我们需要修改每个客户端文件以包含 OpenVPN 服务器的 IP 地址,以便它知道要连接到什么。 使用 nano 或您喜欢的文本编辑器打开 client.ovpn
。
nano /etc/openvpn/easy-rsa/keys/client.ovpn
首先,编辑以 remote
开头的行。 将 my-server-1
更改为 your_server_ip
。
/etc/openvpn/easy-rsa/keys/client.ovpn
# The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote your_server_ip 1194
接下来,找到下图所示的区域并取消注释 user nobody
和 group nogroup
,就像我们在步骤 1 中的 server.conf
中所做的那样。 注意:这不适用于Windows,因此您可以跳过它。 完成后应该是这样的:
/etc/openvpn/easy-rsa/keys/client.ovpn
# Downgrade privileges after initialization (non-Windows only) user nobody group no group
将证书和密钥传输到客户端设备
回想上面的步骤,我们创建了客户端证书和密钥,它们存储在 OpenVPN 服务器上的 /etc/openvpn/easy-rsa/keys
目录中。
对于每个客户端,我们需要将客户端证书、密钥和配置文件模板文件传输到本地计算机或其他客户端设备上的文件夹中。
在此示例中,我们的 client1
设备需要其证书和密钥,位于服务器上:
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
ca.crt
和 client.ovpn
文件对于所有客户端都是相同的。 同时下载这两个文件; 请注意,ca.crt
文件与其他文件位于不同的目录中。
/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/ca.crt
虽然用于完成此传输的确切应用程序将取决于您的选择和设备的操作系统,但您希望应用程序在后端使用 SFTP(SSH 文件传输协议)或 SCP(安全复制)。 这将通过加密连接传输您客户端的 VPN 身份验证文件。
这是使用我们的 client1
示例的示例 SCP 命令。 它将文件 client1.key
放入本地计算机上的 Downloads 目录中。
scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
以下是一些用于将文件从服务器安全传输到本地计算机的工具和教程:
在本节结束时,确保您的 客户端 设备上有这四个文件:
- ``client1
.crt
- ``client1
.key
client.ovpn
ca.crt
第 9 步 — 为客户端设备创建统一的 OpenVPN 配置文件
管理客户端文件有多种方法,但最简单的方法是使用 unified 配置文件。 这是通过修改 client.ovpn
模板文件以包含服务器的证书颁发机构、客户端的证书及其密钥来创建的。 合并后,只需将单个 client.ovpn
配置文件导入客户端的 OpenVPN 应用程序。
下面给出的区域需要注释掉显示的三行,因此我们可以直接在 client.ovpn
文件中包含证书和密钥。 完成后应该是这样的:
/etc/openvpn/easy-rsa/keys/client.ovpn
# SSL/TLS parms. # . . . ;ca ca.crt ;cert client.crt ;key client.key
保存更改并退出。 我们将通过代码添加证书。
首先,添加证书颁发机构。
echo '<ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn echo '</ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
第二,添加证书。
echo '<cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn cat /etc/openvpn/easy-rsa/keys/client1.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn echo '</cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
第三也是最后,添加密钥。
echo '<key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn cat /etc/openvpn/easy-rsa/keys/client1.key >> /etc/openvpn/easy-rsa/keys/client.ovpn echo '</key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
我们现在有一个统一的客户档案。 使用 scp
,您可以将 client.ovpn
文件复制到您的第二个系统。
第 10 步 — 安装客户端配置文件
各种平台都有更多用户友好的应用程序可以连接到这个 OpenVPN 服务器。 有关特定平台的说明,请参阅 本教程 中的步骤 5。
结论
恭喜! 您现在有一个工作的 OpenVPN 服务器和客户端文件。
从您的 OpenVPN 客户端,您可以使用 Google 测试连接以显示您的公共 IP 。 在客户端上,在启动 OpenVPN 连接之前和之后加载一次。 IP 地址应该改变。