利用OpenVPN实现局域网内多台机器共享上网

时间:2023-03-09 09:39:12
利用OpenVPN实现局域网内多台机器共享上网
本文转载自

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04

----------------------------------------------------------------------------------------------

介绍

想要在连接到不受信任的网络(例如酒店的WiFi或咖啡店)时,通过智能手机或笔记本电脑安全可靠地访问互联网?一个  虚拟专用网络  (VPN)允许,如果你是一个安全的专用网络上你私下和安全地穿越不受信任的网络到您的DigitalOcean滴。交通从Droplet出现并继续前往目的地。

HTTPS连接结合使用时  ,此设置可让您保护无线登录和交易。您可以绕过地理限制和审查,并保护您的位置和未加密的HTTP流量来自不受信任的网络。

OpenVPN  是一个功能齐全的开源安全套接字层(SSL)VPN解决方案,适用于各种配置。在本教程中,我们将在Droplet上设置OpenVPN服务器,然后从Windows,OS X,iOS和Android配置对它的访问。本教程将使这些设置的安装和配置步骤尽可能简单。

注意:  OpenVPN可以通过 在启动时将此脚本添加到其用户数据中自动安装在Droplet上  。查看  本教程  以了解有关Droplet用户数据的更多信息。

先决条件

唯一的先决条件是建立并运行Ubuntu 14.04 Droplet。您将需要  root  访问权限才能完成本指南。

  • 可选:完成本教程后,最好创建一个具有sudo  权限的标准用户帐户,  以便在服务器上执行常规维护。

步骤1 - 安装和配置OpenVPN的服务器环境

完成服务器端设置的这些步骤。

OpenVPN配置

在我们安装任何软件包之前,首先我们将更新Ubuntu的存储库列表。

apt-get update

然后我们可以安装OpenVPN和Easy-RSA。

apt-get install openvpn easy-rsa

需要提取示例VPN服务器配置文件,  /etc/openvpn 以便我们将其合并到我们的设置中。这可以通过一个命令完成:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

提取后,server.conf 在文本编辑器中打开  。本教程将使用Vim,但您可以使用您喜欢的任何编辑器。

vim /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

这将使生成服务器和客户端密钥时使用的RSA密钥长度加倍。

还在  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服务器将客户端的Web流量传递到其目标。完成后应该如下所示:

push "redirect-gateway def1 bypass-dhcp"

下一个编辑是在这个区域:

# 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"。完成后应该如下所示:

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

这告诉服务器尽可能将OpenDNS推   送到连接的客户端以进行DNS解析。这有助于防止DNS请求泄漏到VPN连接之外。但是,在客户端设备中指定所需的DNS解析器也很重要。虽然OpenVPN是OpenVPN使用的默认设置,但您可以使用您喜欢的任何DNS服务。

要改变的最后一个方面  server.conf 是:

# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup

取消注释  user nobody 和  group nogroup。完成后应该如下所示:

user nobody
group nogroup

默认情况下,OpenVPN以root  用户身份运行  ,因此具有对系统的完全root访问权限。我们将OpenVPN限制为用户  nobody  和group  nogroup。这是一个没有默认登录功能的非特权用户,通常保留用于运行不受信任的应用程序,如面向Web的服务器。

现在保存更改并退出Vim。

数据包转发

这是一个  sysctl  设置,它告诉服务器的内核将客户端设备的流量转发到Internet。否则,流量将停在服务器上。通过输入以下命令在运行时启用数据包转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

我们需要使其永久化,以便服务器在重新启动后仍然转发流量。

vim /etc/sysctl.conf

在sysctl文件的顶部附近,您将看到:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

取消注释  net.ipv4.ip_forward。完成后应该如下所示:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

保存更改并退出。

简单的防火墙(ufw)

ufw是iptables的前端,设置ufw并不难。它默认包含在Ubuntu 14.04中,因此我们只需要进行一些规则和配置编辑,然后打开防火墙。有关ufw的更多用途的参考,请参阅  如何在Ubuntu和Debian云服务器上使用UFW设置防火墙

首先设置ufw以允许SSH。在命令提示符中,  ENTER

ufw allow ssh

本教程将使用OpenVPN over UDP,因此ufw还必须允许通过端口的UDP流量  1194

ufw allow 1194/udp

还需要设置ufw转发策略。我们将在ufw的主配置文件中执行此操作。

vim /etc/default/ufw

寻找  DEFAULT_FORWARD_POLICY="DROP"。必须将其从DROP更改   为  ACCEPT。完成后应该如下所示:

DEFAULT_FORWARD_POLICY="ACCEPT"

接下来,我们将为网络地址转换和连接客户端的IP伪装添加其他ufw规则。

vim /etc/ufw/before.rules

使before.rules 文件的顶部  如下所示。 必须添加OPENVPN 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)

第2步 - 创建证书颁发机构和服务器端证书和密钥

OpenVPN使用证书来加密流量。

配置和构建证书颁发机构

现在是时候设置我们自己的证书颁发机构(CA)并为OpenVPN服务器生成证书和密钥。OpenVPN支持基于证书的双向身份验证,这意味着客户端必须对服务器证书进行身份验证,并且服务器必须在建立相互信任之前对客户端证书进行身份验证。我们将使用我们之前复制的Easy RSA脚本来执行此操作。

首先复制Easy-RSA生成脚本。

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

然后制作密钥存储目录。

mkdir /etc/openvpn/easy-rsa/keys

Easy-RSA有一个变量文件,我们可以编辑这些文件来创建专属于我们的个人,企业或我们选择的任何实体的证书。此信息将复制到证书和密钥,稍后将帮助识别密钥。

vim /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 和  的OpenVPN配置文件  server.crt

export KEY_NAME="server"

我们需要生成Diffie-Hellman参数; 这可能需要几分钟。

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

现在让我们更改目录,以便我们直接在Easy-RSA的脚本移动到第2步之前的位置。

cd /etc/openvpn/easy-rsa

初始化PKI(公钥基础结构)。注意命令 前面  的  点(。)  和  空格./vars。这表示当前的工作目录(源)。

. ./vars

上述命令的输出如下所示。由于我们keys尚未在目录中生成任何内容  ,因此警告无需担心。

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

现在我们将清除任何可能的旧密钥或示例密钥的工作目录,以便为我们的新密钥让路。

./clean-all

此最终命令通过调用交互式OpenSSL命令来构建证书颁发机构(CA)。输出将提示您确认先前在Easy-RSA的变量文件(国家/地区名称,组织等)中输入的专有名称变量。

./build-ca

只需按  ENTER 即可通过每个提示。如果必须更改某些内容,则可以在提示中执行此操作。

为服务器生成证书和密钥

仍在工作  /etc/openvpn/easy-rsa,现在输入命令来构建服务器的密钥。您看到  server 红色标记的位置是export KEY_NAME 我们vars 在步骤2之前的Easy-RSA 文件中设置的  变量  。

./build-key-server server

我们运行时会生成类似的输出  ./build-ca,您可以再次按下  ENTER 以确认专有名称的每一行。但是,这次还有两个额外的提示:

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

两者都应留空,所以只需按下  ENTER 即可通过每一个。

最后两个额外的查询需要positive(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

移动服务器证书和密钥

OpenVPN希望看到服务器的CA,证书和密钥  /etc/openvpn。让我们将它们复制到正确的位置。

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命令应该返回:

VPN 'server' is running

恭喜!您的OpenVPN服务器正常运行。如果状态消息显示VPN未运行,请查看该  /var/log/syslog 文件是否存在错误,例如:

Options error: --key fails with 'server.key': No such file or directory

该错误表示  server.key 未/etc/openvpn 正确复制  。重新复制文件,然后重试。

第3步 - 为客户生成证书和密钥

到目前为止,我们已经安装并配置了OpenVPN服务器,创建了一个证书颁发机构,并创建了服务器自己的证书和密钥。在此步骤中,我们使用服务器的CA为将连接到VPN的每个客户端设备生成证书和密钥。这些文件稍后将安装到客户端设备上,如笔记本电脑或智能手机。

密钥和证书建设

它是连接到VPN的每个客户端的理想选择,具有自己独特的证书和密钥。这比在所有客户端设备中生成一个通用证书和密钥更好。

注意:  默认情况下,OpenVPN不允许使用相同证书和密钥从客户端同时连接到服务器。(参见  duplicate-cn 在  /etc/openvpn/server.conf)。

要为要连接到VPN的每个设备创建单独的身份验证凭据,您应该为每个设备完成此步骤,但将下面的名称client1更改为不同的名称,例如client2或iphone2。如果需要,每个设备使用单独的凭证,以后可以单独在服务器上停用它们。本教程中的其余示例将使用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密钥目录。我们将其用作模板,将其下载到客户端设备进行编辑。在复制过程中,我们从改变示例文件名  client.conf 来  client.ovpn ,因为  .ovpn 文件扩展名是什么,客户会希望使用。

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

您可以为每个客户端重复此部分,将client1替换为相应的客户端名称。

将证书和密钥传输到客户端设备

回想一下上面的步骤,我们创建了客户端证书和密钥,并将它们存储在/etc/openvpn/easy-rsa/keys 目录中的OpenVPN服务器上  。

对于每个客户端,我们需要将客户端证书,密钥和配置文件模板文件传输到本地计算机或其他客户端设备上的文件夹。

在此示例中,我们的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 到  下载  在本地计算机上的目录。

scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/

以下是一些用于将文件从服务器安全地传输到本地计算机的工具和教程:

在本节结束时,请确保您的客户端  设备上有以下四个文件  :

  • client1.crt
  • client1.key
  • client.ovpn
  • ca.crt

步骤4 - 为客户端设备创建统一的OpenVPN配置文件

有几种方法可以管理客户端文件,但最简单的方法是使用  统一的  配置文件。这是通过修改  client.ovpn 模板文件以包括服务器的证书颁发机构以及客户端的证书及其密钥来创建的。合并后,只需将单个  client.ovpn 配置文件导入客户端的OpenVPN应用程序。

我们将在 我们下载所有客户端文件的本地计算机上为我们的client1设备创建一个配置  文件。此本地计算机本身可以是目标客户端,也可以只是合并身份验证文件的临时工作区。client.ovpn 应复制并重命名原始  模板文件。如何执行此操作取决于本地计算机的操作系统。

注意:  复制的名称  client.ovpn 不需要与客户端设备相关。客户端OpenVPN应用程序将使用文件名作为VPN连接本身的标识符。相反,您应该复制  client.ovpn 到您希望VPN名称标签在您的操作系统中的任何内容。例如:  work.ovpn  将被识别为work,  school.ovpn将被识别   为  学校等。

在本教程中,我们将VPN连接命名为DigitalOcean,因此  DigitalOcean.ovpn 将是此时引用的文件名。一旦命名,我们就必须DigitalOcean.ovpn 在文本编辑器中打开  ; 你可以使用你喜欢的编辑器。

第一个注意事项是Droplet的IP地址。在文件顶部附近,更改  my-server-1  以反映您的VPN的IP。

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server-1 1194

接下来,找到区域如下图所示并取消  user nobody 和  group nogroup,就像我们在  server.conf 第1步  注:  这并不适用于Windows,那么可以跳过它。完成后应该如下所示:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

下面给出的区域需要显示三行显示,因此我们可以将证书和密钥直接包含在  DigitalOcean.ovpn 文件中。完成后应该如下所示:

# SSL/TLS parms.
# . . .
#ca ca.crt
#cert client.crt
#key client.key

要将单个文件合并到一个统一的配置文件中,可以 使用类似XML的基本语法将ca.crt,  client1.crt  和  client1.key 文件的内容  直接粘贴到  .ovpn配置文件中。文件末尾的XML应采用以下形式:

<ca>
(insert ca.crt here)
</ca>
<cert>
(insert client1.crt here)
</cert>
<key>
(insert client1.key here)
</key>

完成后,文件的结尾应与此缩写示例类似:

<ca>
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</ca>

<cert>
Certificate:
. . .
-----END CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
. . .
-----END PRIVATE KEY-----
</key>

该  client1.crt 文件中包含一些额外信息; 只包含整个文件就可以了。

保存更改并退出。我们现在有一个统一的OpenVPN客户端配置文件来配置我们的client1。

第5步 - 安装客户端配置文件

现在我们将讨论在Windows,OS X,iOS和Android上安装客户端VPN配置文件。这些客户端指令都不相互依赖,因此您可以跳到适用于您的任何一个。

请记住,无论您将.ovpn 文件命名为什么,都会调用该连接  。在我们的示例中,由于文件已命名  DigitalOcean.ovpn,因此连接将命名为  DigitalOcean。

视窗

安装

适用于Windows的OpenVPN客户端应用程序可以在OpenVPN的下载页面上找到  。为您的Windows版本选择适当的安装程序版本。

注意:  OpenVPN需要管理权限才能安装。

安装OpenVPN后,将统一DigitalOcean.ovpn 配置文件复制  到:

C:\Program Files\OpenVPN\config

当您启动OpenVPN时,它将自动查看配置文件并使其可用。

OpenVPN每次使用时都必须以管理员身份运行,即使是管理帐户也是如此。要在不必右键单击并选择“  每次使用VPN时以管理员身份运行”的情况下执行此操作  ,您可以预设此项,但必须从管理帐户进行预设。这也意味着标准用户需要输入管理员密码才能使用OpenVPN。另一方面,除非客户端上的OpenVPN具有管理员权限,否则标准用户无法正确连接到服务器,因此需要提升权限。

要将OpenVPN应用程序设置为始终以管理员身份运行,请右键单击其快捷方式图标,然后转到“  属性”。在“ 兼容性” 选项卡的底部  ,单击“ 更改所有用户的设置 ”按钮  。在新窗口中,选中  以管理员身份运行此程序。

每次启动OpenVPN GUI时,Windows都会询问您是否允许程序对您的计算机进行更改。单击  是。启动OpenVPN客户端应用程序只会将applet放入系统托盘中,以便根据需要连接和断开VPN; 它实际上并没有建立VPN连接。

启动OpenVPN后,进入系统托盘小程序并右键单击OpenVPN小程序图标启动连接。这将打开上下文菜单。选择   菜单顶部的DigitalOcean(这是我们的  DigitalOcean.ovpn 个人资料),然后选择  Connect。

将建立一个状态窗口,显示连接建立时的日志输出,并在客户端连接后显示一条消息。

以相同方式断开与VPN的连接:进入系统托盘小程序,右键单击OpenVPN小程序图标,选择客户端配置文件,然后单击“  断开连接”。

OS X.

安装

Tunnelblick  是适用于Mac OS X的免费开源OpenVPN客户端。您可以从Tunnelblick下载页面下载最新的磁盘映像  。双击下载的  .dmg 文件,然后按照提示进行安装。

在安装过程即将结束时,Tunnelblick会询问您是否有任何配置文件。可以更容易回答  否  并让Tunnelblick完成。打开Finder窗口并双击  DigitalOcean.ovpn。Tunnelblick将安装客户端配置文件。需要管理权限。

双击Applications  文件夹中的Tunnelblick启动Tunnelblick  。启动Tunnelblick后,屏幕右上角的菜单栏中将出现一个Tunnelblick图标,用于控制连接。单击图标,然后单击“  连接”  菜单项以启动VPN连接。选择  DigitalOcean  连接。

iOS版

安装

从iTunes App Store中搜索并安装  官方iOS OpenVPN客户端应用程序OpenVPN Connect。要将iOS客户端配置文件传输到设备,请将其直接连接到计算机。

此处将概述使用iTunes完成传输。在计算机上打开iTunes,然后单击  iPhone  >  apps。向下滚动到文件共享  部分的底部  ,然后单击OpenVPN应用程序。右侧的空白窗口  OpenVPN文档用于共享文件。将  .ovpn 文件拖到OpenVPN文档窗口。

利用OpenVPN实现局域网内多台机器共享上网

现在在iPhone上启动OpenVPN应用程序。将通知新的配置文件已准备好导入。点按绿色加号以将其导入。

利用OpenVPN实现局域网内多台机器共享上网

OpenVPN现在可以使用新的配置文件了。通过将“ 连接”  按钮滑动到“ 打开”  位置来  启动连接  。通过将相同按钮滑动到关闭来断开连接  。

注意:  “ 设置”下的VPN交换机   不能用于连接VPN。如果您尝试,您将收到通知,仅使用OpenVPN应用程序进行连接。

利用OpenVPN实现局域网内多台机器共享上网

Android的

安装

打开Goog​​le Play商店。搜索并安装  官方Android OpenVPN客户端应用程序Android OpenVPN Connect

该  .ovpn 配置文件可以通过USB将Android设备连接到您的计算机并复制了文件传输。或者,如果您有SD卡读卡器,则可以移除设备的SD卡,将配置文件复制到其上,然后将卡重新插入Android设备。

启动OpenVPN应用程序并点击菜单以导入配置文件。

利用OpenVPN实现局域网内多台机器共享上网

然后导航到保存的配置文件的位置(屏幕截图使用  /sdcard/Download/)并选择文件。该应用程序将记下该配置文件已导入。

利用OpenVPN实现局域网内多台机器共享上网

要进行连接,只需点击“  连接”  按钮。系统会询问您是否信任OpenVPN应用程序。选择  确定  以启动连接。要断开与VPN的连接,请返回OpenVPN应用程序并选择  断开连接。

利用OpenVPN实现局域网内多台机器共享上网

第6步 - 测试您的VPN连接

安装完所有内容后,只需进行简单检查即可确认一切正常。如果未启用VPN连接,请打开浏览器并转至  DNSLeakTest

该网站将返回您的互联网服务提供商分配的IP地址,以及您在世界其他地方看到的IP地址。要通过同一网站检查DNS设置,请单击“  扩展测试”  ,它将告诉您正在使用的DNS服务器。

现在将OpenVPN客户端连接到Droplet的VPN并刷新浏览器。现在应该显示VPN服务器的完全不同的IP地址。现在就是你向世界展示的方式。同样,  DNSLeakTest的 扩展测试  将检查您的DNS设置并确认您现在正在使用VPN推送的DNS解析器。

恭喜!您现在可以安全地穿越互联网,保护您的身份,位置和来自窥探者和审查员的流量。

本文转载自:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04