如何在 Ubuntu 16.04 上使用 OpenVPN 创建内联网

介绍

_Intranets_是由组织为方便通信和数据传输而创建的私人网络. 通过连接世界各地的多个网络来构建一个内联网,以创建一个新的虚拟网络。 与内联网相连接的用户可以访问某些内部网站,也可以访问内联网上的其他网络服务和内容. 例如,如果一个场外雇员想访问其雇主主网络上的敏感信息,该雇员将连接到办公室主网络上的VPN服务器。 这种VPN连接将在雇员和办公室之间建立安全通道. 在网络上,员工的连接会显得好像他们在当地连接到主网络,而不是使用站外连接.

在本教程中,您将配置仅可用于连接到VPN的客户端的服务,包括文件共享和网站,并学习如何管理访问这些资源。

前提条件

要完成本教程,您将需要以下内容:

  • 一个新的 Ubuntu 16.04 服务器. * 一个具有)教程的步骤 2 和 3 来设置一个标准帐户。

  • 在您的服务器上安装和配置了 OpenVPN 。 在继续前完成 [如何在 Ubuntu 16.04 (https://andsky.com/tech/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04 ) 上设置 OpenVPN 服务器 。 我们将假设VPN服务器位于VPN上的IP地址`10.8.0.1',这是OpenVPN教程中使用的地址,您可以从本地机器连接到VPN.

  • 一个注册域名和访问权限来添加DNS条目. 在整个教程中使用"example.com",使用DigitalOcean的DNS服务. 要使用DigitalOcean与您域名的DNS服务,请遵循我们如何用DigitalOcean设置主机名教程中的步骤1和2,在DigitalOcean的名称服务器上指出您的域名.

  • Apache 安装了为您域配置的两个虚拟主机。 遵循教程如何在Ubuntu 16.04上设置Apache虚拟主机设置两个虚拟主机,称为example.com'和intranet.example.com',每个主机都有默认的HTML页面. .

步骤 1 — 安装和配置 Samba 文件服务器

讓我們先設定 Samba 以便我們的內網上的人們可以共享檔案。 Samba 與 Dropbox 等其他檔案共享應用程式不同,因為它沒有 Web 接口或任何儲存空間限制。

我们将创建两个共享目录. 第一目目录将可访问我们私人网络上的所有用户. 第二目录只可访问我们指定的用户. 我们将分别命名这些共享AllusersRestricted

首先,使用以下命令安装 Samba 及其先决条件:

1sudo apt-get install samba samba-common python-glade2 system-config-samba

接下来,仅在我们稍后修改时犯了一个错误的情况下,即可备份 Samba 配置文件。

1sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

Samba 还需要通过防火墙访问,所以为 Samba 流量添加一个规则:

1sudo ufw allow samba

现在创建我们将共享的目录. 首先,创建allusers目录:

1sudo mkdir -p /samba/allusers

然后创建限制目录:

1sudo mkdir -p /samba/restricted

现在,让我们编辑 Samba 配置文件来设置服务并定义共享。

1sudo nano /etc/samba/smb.conf

然后 删除所有内容 ,因为我们将从零写出我们自己的配置。

首先,我们为 Samba 服务器指定一些全球设置. 将下列行添加到配置文件中:

 1[label /etc/samba/smb.conf]
 2[global]
 3        workgroup = WORKGROUP
 4        server string = Samba Server %v
 5        netbios name = ubuntu
 6        security = user
 7        map to guest = bad user
 8        dns proxy = no
 9        interfaces = 10.8.0.1/8
10        bind interfaces only = yes

让我们分解每个设置:

默认组为WORKGROUP用于 Windows,但您可以更改它,如果您已经使用了工作组名称。

服务器字符串netbios字符串分别指定 Samba 服务器和其平台的名称。

安全设置规定这将是一个独立的文件服务器,拥有自己的用户帐户。地图到客人设置将所有具有无效用户名或密码的登录者视为客人用户,而DNS代理设置告诉Samba不要尝试解决域名,因为我们没有为这个内网运行自己的DNS。

通过接口设置,我们指定我们只使用VPN服务器的IP来收听连接,而不是公开访问的IP。

接下来,我们需要指定 Samba 的日志设置,在[全球]部分中将此配置块添加到文件中:

1[label /etc/samba/smb.conf]
2[global]
3        ...
4
5        ## Logging
6        log level = 2
7        log file = /var/log/samba.log.%m
8        max log size = 50
9        debug timestamp = yes

日志级别设置决定了你想要的日志文件的细节级别。这些级别从1到10之间,但我们会坚持2级别,因为它是一个相对轻松的调试级别。 日志文件设置指定了日志文件的文件路径和名称,而最大日志大小限制了日志文件的大小。

这关心我们的服务器的全球设置,现在让我们创建实际的共享定义,这些设置指定了我们想要共享的文件,以及谁可以访问这些文件。

我们需要两个份额,一个叫Allusers,另一个叫Restricted。让我们先定义Allusers份额。 对于这个份额,用户可以浏览、写和阅读在/samba/allusers目录中的文件。 将此配置添加到文件中:

1[label /etc/samba/smb.conf]
2#============ Share Defenitions ==================
3[Allusers]
4        path = /samba/allusers
5        browsable = yes
6        writable = yes
7        guest ok = yes
8        read only = no
9        force user = nobody

Allusers区块表示下列设置仅适用于Allusers共享. 它还定义了用户将看到的共享的名称。 path设置指定了我们希望在我们的内网上共享的文件目录的文件目录。 将可浏览可写设置为允许用户浏览该文件夹以及阅读和写文件。

我们希望所有用户都能访问此共享,即使他们在服务器上没有用户帐户。请记住,在全球部分中,我们指定了地图到客人设置,这意味着没有帐户或有效登录凭证的用户仍然可以访问作为客人共享的文件。

Nobody用户组是任何Linux系统上已知的默认用户组,我们可以将nobody用户的samba/allusers文件夹中所需的权限设置为nobody

有关)和 StackExchange 上的这个答案(http://askubuntu.com/questions/329714/what-is-the-purpose-of-the-nobody-user)。

现在,让我们创建限制文件共享,只有smbrestricted组成员才能访问:

1[label /etc/samba/smb.conf]
2[Restricted]
3        path = /samba/restricted
4        valid users = @smbrestricted
5        guest ok = no
6        writable = yes
7        browsable = yes

再次,我们开始通过指定我们想要共享的目录,并授予浏览和写入权限,就像我们与allusers共享一样。

对于 smb.conf 文件,它是这样做的. 您的文件应该看起来像以下示例:

 1[global]
 2[label /etc/samba/smb.conf]
 3        workgroup = WORKGROUP
 4        server string = Samba Server %v
 5        netbios name = ubuntu
 6        security = user
 7        map to guest = bad user
 8        dns proxy = no
 9        interfaces = 10.8.0.1/8
10        bind interfaces only = yes
11
12        ## Logging
13        log level = 2
14        log file = /var/log/samba.log.%m
15        max log size = 50
16        debug timestamp = yes
17
18#============ Share Defenitions ==================
19
20[Allusers]
21        path = /samba/allusers
22        browsable = yes
23        writable = yes
24        guest ok = yes
25        read only = no
26        force user = nobody
27
28[Restricted]
29        path = /samba/restricted
30        valid users = @smbrestricted
31        guest ok = no
32        writable = yes
33        browsable = yes

有了 Samba 配置,我们可以创建smbrestricted组并创建我们的第一个用户。

步骤 2 — 配置访问 Samba 份额

为了允许访问我们的共享,我们必须创建用户帐户,并将适当的权限应用到我们计划共享的文件夹中。

首先,用以下命令创建smbrestricted组:

1sudo addgroup smbrestricted

现在在服务器上创建一个用户帐户,并将其添加到smbrestricted组中,我们将为client1创建一个帐户,该帐户与前提教程中创建的VPN连接的名称相匹配:

1sudo useradd client1 -G smbrestricted

最后,我们需要为client1分配一个Samba密码. 通过我们设置的配置,Samba使用自己的身份验证系统,它与正常的Linux系统的验证系统分开。

用以下命令为client1用户创建 Samba 密码:

1sudo smbpasswd -a client1

注:如果您的系统上有用户,您希望能够访问 Samba 共享,您也需要为这些用户创建 Samba 密码,因为登录系统与此配置分开。

接下来,我们将为我们想要共享的目录设置权限,首先,我们将为allusers目录设置权限:

1sudo chmod -R 766 /samba/allusers
2sudo chown -R nobody:nogroup /samba/allusers

这授予目录所有者完整的权限,并仅授予读取和写入权限为组和所有其他人,然后我们将共享目录的所有者和组更改为nobody:nogroupchown命令。

然而,将所有人和团体改为无:无团体是一个小问题。 chmod-R 766 ' 命令只允许读取和撰写/Samba/所有用户 ' 目录内现有和新的文件/目录,而不论是谁创建了这些文件或目录。 这意味着,一旦你试图在一个位于****的文件夹内创建一个新文件,/samba/所有用户目录内,你就会获得不充分的权限错误。 记住,当你在所有用户 ' 共享范围内工作时,你正在冒充无人 ' 的身份,而`无人 ' 的许可非常有限.

为了克服此问题,我们使用 Access Control Lists 或 ACLs. ACL 规则允许我们自动为新创建的文件和目录分配用户和/或组的权限。

使用以下命令为 `/samba/allusers' 文件夹设置 ACL 规则:

1sudo setfacl -dm g:nogroup:rw /samba/allusers/
2sudo setfacl -dm u:nobody:rw /samba/allusers/

命令 setfacl -dm 表示我们正在为一个目录或文件定义新的权限规则,将来这些权限也应该应用于新创建的对象。

您可以从 [Ubuntu Wiki] 了解更多有关 ACLs 的信息(https://help.ubuntu.com/community/FilePermissionsACLs)。

现在我们可以为限制目录设置权限:

1sudo chmod -R 770 /samba/restricted
2sudo chown root:smbrestricted /samba/restricted

这一次,我们完全阻止了对该目录的访问,除了使用chmod 770smbrestricted组的所有者和成员,我们不需要设置ACL规则,因为允许功能通常在这个共享文件夹中,因为我们正在使用身份验证的用户帐户。

现在我们已经配置了共享,重新启动 Samba 服务器,以便它使用新的配置文件:

1sudo service smbd restart

我们现在可以连接到Samba服务器上传或下载文件。

步骤 3 — 从客户端连接到 Samba 服务器

我们的内网的目的是在一个安全的环境中访问和共享文件,就像我们连接到主网络一样。当客户端连接到Samba时,它将共享目录安装在该客户端的文件探索器中。

从 Windows 连接

在导航栏中,在 Samba 服务器地址中键入 \\10.8.0.1,然后按一下 Enter 键。

Windows explore connection through the navbar

Windows 可能需要几秒钟才能连接。当连接成功时,您将看到在内网上托管的共享文件夹:

Available shares

请注意,在快速访问工具栏中的网络标签下创建了一个新的网络安装点,安装点的名称是10.8.0.1,与VPN的IP相同。

您可以像任何其他文件夹一样访问Allusers共享,因为不需要任何身份证件,只需双击文件夹以查看其内容:

The Allusers share contents

若要访问限制部分,请双击名为限制的文件夹. 将出现一个 Windows 安全性 的弹出窗口,表示需要获得访问的网络凭证。

Restricted share permissions prompt

输入您创建的用户的用户名和密码,并可选地检查框以记住您的身份证。

The contents of the restricted share

一旦连接,您可以创建新的文件或文件夹,甚至将文件夹拖到您的服务器上传。

从Ubuntu连接

要从Ubuntu连接,打开文件探索器,并在左侧的侧面栏中选择 连接到服务器 选项. 这将打开一个新的屏幕,我们可以输入服务器地址。

The Connect To Server option

输入 smb://10.8.0.1/ 然后点击右下角的 连接 按钮. 根据您的连接速度,您的 PC 可能需要几秒钟才能连接到服务器。 连接后,会显示服务器上所有共享目录的屏幕:

Available shares

要访问Allusers共享,只需双击文件夹。 会出现一个登录屏幕,要求用户名和密码。 Allusers共享不需要任何用户名和密码,所以您应该选择Anonymous选项Connect As选项。

Connecting anonymously

注意这些共享目录在您访问它们后如何安装在文件系统中。

Samba-6

驱动器将保持安装,直到系统重新启动或驱动器卸载。

要访问限制部分,您需要一个有效的用户名和密码来登录。双击限制部分,登录屏幕将再次显示。对于作为连接选项,选择注册用户并在相应的字段中填写用户名和密码,留下选项。然后单击连接选项,您将能够访问共享文件。

Connecting as the client1 user

从 Mac 连接

若要从 Mac 上连接,请打开 Finder,选择 Go 菜单,然后选择** 连接到服务器...** .然后使用 smb://10.8.0.1/为** 服务器地址** :

Connecting from a Mac

其余的连接过程与从 Linux 或 Windows 连接的过程相同,您将被要求提供用户名和密码,并能够查看和连接到可用的共享。

现在让我们看看如何配置Apache以在同一服务器上内部和外部托管网站。

步骤 4 — 配置访问 Apache 虚拟主机

在本教程之前,您创建了两个虚拟主机,我们将将其配置为在我们的服务器上使用。第一个主机,‘example.com’,将被公众访问。这可能是您的域的主要公共网站。第二个主机,‘intranet.example.com’,只会被连接到内网的客户端访问。

若要限制访问intranet.example.com,我们将编辑该虚拟主机的配置文件. 打开文件 /etc/apache2/sites-available/intranet.example.com.conf:

1sudo nano /etc/apache2/sites-available/intranet.example.com.conf

然后从此更改VirtualHost声明:

1[label /etc/apache2/sites-available/intranet.example.com.conf]
2<VirtualHost *:80>

至此:

1[label /etc/apache2/sites-available/intranet.example.com.conf]
2<VirtualHost 10.8.0.1:80>

在更改之前,Apache 会在所有网络接口上服务于internal.example.com的请求。

保存文件并重新启动 Apache 服务:

1sudo systemctl restart apache2

我们还需要允许通过 UFW for Apache 的连接正常工作. 如果您尚未这样做,请执行此命令以允许通过 Apache 防火墙的流量:

1sudo ufw allow http

如果您打算允许 HTTPS 流量,现在也可以允许,或者稍后配置:

1sudo ufw allow https

现在,让我们配置域名,以便我们更容易访问我们的资源。

步骤5:设置域名

在此步骤中,我们将配置我们的域名以重定向对内网的流量,同时还服务于公开访问的网站. 在开始本文之前,您应该将您的域名指向DigitalOcean的名称服务器。

注意:如果您有自己的名称服务器,您将希望在 DNS 提供商的控制面板中进行这些设置。

登录你的DigitalOcean帐户,然后点击顶部栏中的网络选项卡,然后你会看到如下这样的屏幕:

Domain-screen-1

若要将域名添加到您的 DigitalOcean 帐户中,请在第一个框中键入您的域名,然后在第二个框中键入您的 intranet 服务器的公共 IP,然后单击创建记录按钮。

Domain-screen-2

然后,你的新域名将出现在 Domains 的子标题下,就像在第二张图中一样。

View-domain

这将打开该特定域的设置页面。

Domain-settings

我们需要为这个域添加三个记录,一个用于内网,另两个用于确保对我们的公共网站的请求得到正确的解决。

首先,为 intranet 创建一个记录。

  1. 选择记录类型下单击橙色A框中。2.在输入名称字段中输入内网。3.对于 IP 地址,请输入您的服务器的私人 IP 地址,该地址应该是10.8.0.1

Creating the Intranet subdomain record

接下来,我们需要一个记录,将非内网流量引导到正确的地方。创建另一个A记录,将名称设置为@,并将IP设置为您的服务器的公共IP

Creating the @ A record

最后,为www创建一个CNAME记录. 点击顶部角落的CNAME卡,将名称设置为www,然后输入您的域名(example.com作为主机名:

Creating the www CNAME record

完成后,您的域记录应该看起来像下面的图像:

Reviewing All records

intranet A 记录只会将请求发送到 intranet.example.com 如果它来自 VPN 服务器,这意味着只有连接到 VPN 的客户端才能访问在 intranet.example.com 上托管的网页内容。

注意:这些 DNS 更改可能需要 72 小时才能传播。

进入您的浏览器并访问http://intranet.example.com 没有连接到VPN . 您应该看到您的浏览器试图加载网页只返回错误。 现在** 连接到您的VPN** 并重新加载网页。 您现在可以访问网页,因为DNS输入将解决问题。

Successful connection to the internal web site

现在,我们已经彻底配置和测试了我们的内网,让我们看看我们如何管理访问这个新创建的网络。

步骤 6 – 管理对内网的访问

本教程的最后一步将是管理访问我们的内网及其共享文件。 首先,我们将看看如何取消VPN访问的客户端证书,然后我们将看看如何从 smbrestricted 组中删除用户。

取消VPN访问

为了取消访问VPN,我们会取消客户端的证书,这使我们能够拒绝访问我们的内网,而不会为其他客户端或服务器生成新的证书。

首先,我们需要在我们的VPN服务器配置文件中添加一个额外的行,以便我们可以撤销任何客户端证书,而不改变原始CA证书或服务器证书。

打开 VPN 配置文件:

1sudo nano /etc/openvpn/server.conf

添加下列代码行到文件的末尾:

1[label /etc/openvpn/server.conf]
2crl-verify crl.pem

这告诉VPN服务器搜索文件crl.pem,这是一个证书撤销列表,它将包含所有不再允许访问我们的VPN的证书列表。

保存并关闭配置文件,但尚未重新启动服务器;我们需要创建我们的配置正在寻找的crl.pem文件。

要创建此文件,请转到您的服务器上的 ~/openvpn-ca/ 目录:

1cd ~/openvpn-ca/

假设我们需要撤销客户端1的证书,因为它们不再适用于我们的组织。

1source vars
2./revoke-full client1

您将看到以下输出:

1[secondary_label Output]
2Using configuration from /home/intranetexapmle/openvpn-ca/openssl-1.0.0.cnf
3Revoking Certificate 02.
4Data Base Updated
5Using configuration from /home/intranetexample/openvpn-ca/openssl-1.0.0.cnf
6client1.crt: C = US, ST = NY, L = New-York City,
7error 23 at 0 depth lookup:certificate revoked

输出的最后一行应 始终 表示** 错误 23** . 此错误只证实证书已被撤销。

这还会在~/openvpn-ca/keys/目录中创建crl.pem。 若要确认证书已被撤销,请使用任何文本编辑器打开keys/index.txt文件,或以cat显示其内容:

1cat keys/index.txt

将有一个R旁边的客户,其证书我们撤销:

1[secondary_label Output]
2V 260904153313Z 01 unknown /C=US/ST=NY/L=New York/O=DigitalOcean/OU=Community/CN=server/name=server/[email protected]
3R 260904172539Z 160915150543Z 02 unknown /C=US/ST=NY/L=New York/O=DigitalOcean/OU=Community/CN=client1/name=server/[email protected]

现在将crl.pem 文件复制到 /etc/openvpn/ 目录中,这就是我们告诉我们的 OpenVPN 服务器寻找该文件的地方:

1sudo cp keys/crl.pem /etc/openvpn/

然后重新启动OpenVPN服务器,以便证书撤销选项生效。

1sudo systemctl restart openvpn@server

OpenVPN服务器每次连接到服务器时都会查阅crl.pem文件,每次你撤销客户端的证书时,都会用新的文件取代旧的crl.pem文件,无需重新启动服务器。

重要的是要注意,一旦VPN证书被撤销,它将无法在未来再次使用。如果我们希望他们能够再次连接到网络,如果VPN证书被撤销的客户端需要新的证书。

阻止用户访问受限共享。

我们创建了一个共享目录,仅可用于 smbrestricted 组中的用户。 若要阻止已经在该组中的用户访问,我们会将该用户从该组中删除。

1sudo deluser client1 -G smbrestricted

您将看到以下输出:

1[secondary_label Output]
2Removing user `client1' from group `smbrestricted' ...
3Done.

如果您不确定用户是否已经包含在该组中,或者想要双重检查用户是否已被删除,则可以使用会员命令:

1sudo apt-get install members
2members smbrestricted

组中的任何用户都将显示在屏幕上。

将新用户添加到内网

每个新的 intranet 用户都需要自己的 VPN 证书,所以你会遵循 如何在 Ubuntu 16.04 上设置一个 OpenVPN 服务器教程中的步骤,从每个用户的先决条件开始。例如,要创建一个名为 client2的用户,你会做以下操作:

首先,创建一个钥匙:

1cd ~/openvpn-ca
2./build-key client2

然后生成客户端配置:

1cd ~/client-configs
2./make_config.sh client2

然后,在本地机器上,下载客户端配置:

1sftp sammy@openvpn_server_ip:client-configs/files/client2.ovpn ~/

若要授予新用户访问受限制的文件,请按照本教程的 Samba 部分中的 client1 所使用的相同步骤:

  • 创建用户并将其添加到smbrestricted组中。 * 使用smbpassword为用户创建 Samba 密码。 * 测试连接。

然后对您需要添加的每个用户重复此过程。

结论

您已成功创建并使用 OpenVPN、Samba 和 Apache 保护自己的私人内网,您有内部网站和两个文件共享。

下一个你要去哪里取决于你会使用什么 你的内联网。 由于大多数服务器应用程序都使用网页来显示信息,您可以使用一个虚拟主机配置来限制访问该页面,就像我们在这个教程中所做的那样. 您可以通过托管来自内部社交网络,维基或电子邮件服务的多个服务来扩展您的网络,仅举几个例子. 为了更有效地管理共享文件,您可以下载和安装Samba Web 管理工具。 使用您在此学到的知识, 您应该能够配置任何数量的服务, 以便使用您的新内联网 .

Published At
Categories with 技术
comments powered by Disqus