介绍
Intranet 是组织创建的专用网络,用于简化通信和数据传输。 Intranet 是通过连接世界各地的多个网络以创建一个新的虚拟网络来构建的。 连接到 Intranet 的用户可以访问某些内部网站或访问 Intranet 上的其他网络服务和内容。 例如,如果异地员工想要访问位于其雇主主网络上的敏感信息,该员工将连接到位于办公室主网络上的 VPN 服务器。 此 VPN 连接将在员工和办公室之间创建安全隧道。 在网络上,员工的连接看起来好像他们在本地连接到主网络,而不是使用异地连接。
在本教程中,您将配置仅对连接到 VPN 的客户端可用的服务,包括文件共享和网站,并且您将学习如何管理对这些资源的访问。 完成后,您将拥有一个基本的 Intranet,您可以轻松扩展以满足您的需求。
先决条件
要完成本教程,您需要以下内容:
- 一个新的 Ubuntu 16.04 服务器。
- 具有
sudo
权限的标准用户帐户。 您可以按照 Initial Server Setup with Ubuntu 16.04 教程的步骤 2 和 3 设置标准帐户。
- 在您的服务器上安装和配置 OpenVPN。 在继续之前完成 如何在 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 安装了为您的域配置的两个虚拟主机。 按照教程 How to Set Up Apache Virtual Hosts on Ubuntu 16.04 设置两个虚拟主机
example.com
和intranet.example.com
,每个都有一个默认的 HTML 页面。
第 1 步 — 安装和配置 Samba 文件服务器
让我们从设置 Samba 开始,以便我们内部网上的人们可以共享文件。 Samba 与 Dropbox 等其他文件共享应用程序的不同之处在于它没有 Web 界面或任何存储限制。 相反,Samba 在服务器本身上共享目录和文件,因此您不必将数据上传到您无法控制的任何外部服务器。
我们将创建两个共享目录。 我们专用网络上的所有用户都可以访问第一个目录。 第二个目录只能由我们指定的用户访问。 我们将这些共享分别命名为 Allusers
和 Restricted
。
首先,使用以下命令安装 Samba 及其先决条件:
sudo apt-get install samba samba-common python-glade2 system-config-samba
接下来,对 Samba 配置文件进行备份,以防我们以后修改时出错。
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
Samba 还需要通过防火墙进行访问,因此为 Samba 流量添加一条规则:
sudo ufw allow samba
现在创建我们将共享的目录。 首先,创建allusers
目录:
sudo mkdir -p /samba/allusers
然后创建restricted
目录:
sudo mkdir -p /samba/restricted
现在,让我们编辑 Samba 配置文件来设置服务并定义共享。 打开 Samba 配置文件:
sudo nano /etc/samba/smb.conf
然后删除所有内容,因为我们将从头开始编写我们自己的配置。
首先,我们为 Samba 服务器指定一些全局设置。 将以下行添加到配置文件中:
/etc/samba/smb.conf
[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = ubuntu security = user map to guest = bad user dns proxy = no interfaces = 10.8.0.1/8 bind interfaces only = yes
让我们分解每个设置:
workgroup
设置指定服务器在被客户端查询时将出现的工作组。 对于 Windows,默认组为 WORKGROUP
,但如果您已经拥有正在使用的工作组名称,则可以更改它。
server string
和 netbios
行分别指定 Samba 服务器的名称及其平台。
security
设置指定这将是一个具有自己的用户帐户的独立文件服务器。 map to guest
设置将所有使用无效用户名或密码的登录视为访客用户,dns proxy
设置告诉 Samba 不要尝试解析域名,因为我们没有为此运行自己的 DNS内联网。
使用 interfaces
设置,我们指定我们仅使用 VPN 服务器的 IP 侦听连接,而不是可公开访问的 IP。 bind interface
告诉 Samba 只监听来自我们 VPN 的请求。
接下来,我们需要为 Samba 指定日志记录设置。 将此配置块添加到文件中的 [global]
部分:
/etc/samba/smb.conf
[global] ... ## Logging log level = 2 log file = /var/log/samba.log.%m max log size = 50 debug timestamp = yes
log level
设置决定了您希望在日志文件中的详细程度。 这些级别的范围从 1 到 10,但我们将坚持使用级别 2,因为它是一个相对较轻的调试级别。 log file
设置指定日志文件的文件路径和名称,max log size
限制日志文件的大小。 debug timestamp
设置包括日志中的时间戳。
这负责我们服务器的全局设置。 现在让我们创建实际的共享定义。 这些设置指定我们要共享的文件,以及允许谁访问这些文件。
我们想要两股; 一个称为 Allusers
,另一个称为 Restricted
。 让我们先定义 Allusers
共享。 对于此共享,用户可以浏览、写入和读取 /samba/allusers
目录中的文件。 将此配置添加到文件中:
/etc/samba/smb.conf
#============ Share Defenitions ================== [Allusers] path = /samba/allusers browsable = yes writable = yes guest ok = yes read only = no force user = nobody
[Allusers]
块表示后面的设置仅适用于 Allusers
共享。 它还定义了用户将看到的共享名称。 path
设置指定我们要在 Intranet 上共享的文件夹的文件目录。 将 browsable
和 writable
设置为 yes
可以让用户在该文件夹中浏览以及读取和写入文件。
我们希望所有用户都能访问此共享,即使他们在服务器上没有用户帐户。 请记住,在 global
部分中,我们指定了 map to guest
设置,这意味着没有帐户或有效登录凭据的用户仍然可以访问以访客身份共享的文件。 我们允许这些访客通过将 guest ok
设置为 yes
来访问此共享,然后我们强制该用户使用 force user = nobody
假设 nobody
的身份。
nobody
用户组是任何 Linux 系统上已知的默认用户组。 我们可以将 /samba/allusers
文件夹的所需权限设置为 nobody
用户。 然后,通过 Samba,我们允许多个客人使用该身份。 通过这种方式,我们可以轻松管理访客用户对我们系统的访问。
有关 nobody
用户的更多信息,请访问 Ubuntu wiki 和 StackExchange 上的此答案。
现在让我们创建 Restricted
文件共享,它应该只能由 smbrestricted
组的成员访问:
/etc/samba/smb.conf
[Restricted] path = /samba/restricted valid users = @smbrestricted guest ok = no writable = yes browsable = yes
我们再次从指定要共享的目录开始,并授予浏览和写入权限,就像我们对 allusers
共享所做的那样。 然后我们设置 valid users = @smbrestricted
,它告诉 Samba 只允许组 smbrestricted
的成员访问共享。 我们很快就会创建这个组。
这适用于 smb.conf
文件。 您的文件应类似于以下示例:
/etc/samba/smb.conf
[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = ubuntu security = user map to guest = bad user dns proxy = no interfaces = 10.8.0.1/8 bind interfaces only = yes ## Logging log level = 2 log file = /var/log/samba.log.%m max log size = 50 debug timestamp = yes #============ Share Defenitions ================== [Allusers] path = /samba/allusers browsable = yes writable = yes guest ok = yes read only = no force user = nobody [Restricted] path = /samba/restricted valid users = @smbrestricted guest ok = no writable = yes browsable = yes
有了 Samba 配置,我们可以创建 smbrestricted
组并创建我们的第一个用户。
第 2 步 — 配置对 Samba 共享的访问
要允许访问我们的共享,我们必须创建一个用户帐户并对我们计划共享的文件夹应用适当的权限。
首先,使用以下命令创建 smbrestricted
组:
sudo addgroup smbrestricted
现在在服务器上创建一个用户帐户并将其添加到 smbrestricted
组。 我们将为 client1
创建一个帐户,该帐户与先决条件教程中创建的 VPN 连接的名称相匹配:
sudo useradd client1 -G smbrestricted
最后,我们需要为 client1
分配一个 Samba 密码。 通过我们设置的配置,Samba 使用自己的凭据验证系统,该系统与普通 Linux 系统的验证系统不同。 这很好,因为我们可以创建可以使用 Samba 访问文件共享的用户,而无需授予他们登录机器本身的访问权限。
使用以下命令为 client1
用户创建 Samba 密码:
sudo smbpasswd -a client1
注意:如果您的系统上有用户也希望能够访问 Samba 共享,那么您还需要为这些用户创建 Samba 密码,因为登录系统是独立的有了这个配置。
接下来,我们为要共享的目录设置权限。 首先,我们将设置 allusers
目录的权限:
sudo chmod -R 766 /samba/allusers sudo chown -R nobody:nogroup /samba/allusers
这将授予目录的所有者完全权限,并且只授予组和其他所有人的读写权限,然后我们将共享目录的所有者和组更改为 nobody:nogroup
与 chown
命令。
但是,将所有者和组更改为 nobody:nogroup
存在一个小问题。 chmod -R 766
命令仅授予对 /samba/allusers
目录中当前和新文件/目录的读取和写入权限,无论这些文件或目录是谁创建的。 这意味着一旦您尝试在位于 内 /samba/allusers
目录的 文件夹中创建新文件,您就会收到权限不足错误。 请记住,当您在 Allusers
共享中工作时,您将假设 nobody
的身份,而 nobody
的权限非常有限。
为了克服这个问题,我们使用 访问控制列表 或 ACL。 ACL 规则允许我们自动为用户和/或组分配新创建的文件和目录的权限。
使用以下命令为 /samba/allusers
文件夹设置 ACL 规则:
sudo setfacl -dm g:nogroup:rw /samba/allusers/ sudo setfacl -dm u:nobody:rw /samba/allusers/
命令 setfacl -dm
表示我们正在为目录或文件定义新的权限规则,并且将来这些权限也应该应用于新创建的对象。 g:nogroup:rw
和 u:nobody:rw
是新的 ACL 规则,授予 nobody
用户和组 nogroup
的成员读取和写入权限。
您可以从 Ubuntu Wiki 了解有关 ACL 的更多信息。
这会照顾客人的份额。 现在我们可以为 restricted
目录设置权限:
sudo chmod -R 770 /samba/restricted sudo chown root:smbrestricted /samba/restricted
这次我们完全阻止了对这个目录的访问,除了 chmod 770
的 smbrestricted
组的所有者和成员之外。 我们不需要设置 ACL 规则,因为权限在此共享文件夹中正常运行,因为我们使用的是经过身份验证的用户帐户。
现在我们已经配置了共享,重新启动 Samba 服务器以便它使用新的配置文件:
sudo service smbd restart
我们现在可以连接到 Samba 服务器来上传或下载文件。
第 3 步 — 从客户端连接到 Samba 服务器
我们的 Intranet 的目标是在安全的环境中访问和共享文件,就像我们连接到主网络一样。 当客户端连接到 Samba 时,它会在该客户端的文件资源管理器中安装共享目录。 让我们测试一下。
从 Windows 连接
要从 Windows 连接,请打开 Windows 资源管理器。 在导航栏中,输入 Samba 服务器地址,\\10.8.0.1
并按 Enter
键。
Windows 可能需要一些时间才能连接。 连接成功后,您将看到托管在 Intranet 上的共享文件夹:
请注意,在快速访问工具栏的网络选项卡下创建了一个新的网络挂载点。 挂载点名称为10.8.0.1
,与VPN的IP相同。
您可以像访问任何其他文件夹一样访问 Allusers
共享,因为不需要凭据。 只需双击文件夹即可查看其内容:
要访问 Restricted
共享,请双击名为 Restricted
的文件夹。 将出现 Windows 安全 弹出窗口,说明需要网络凭据才能获得访问权限。
输入您创建的用户的用户名和密码,并可选择选中该框以记住您的凭据。 然后点击【X11X】确定【X17X】进行连接。
连接后,您可以创建新文件或文件夹,甚至可以将文件夹拖到您的服务器上以上传它们。
从 Ubuntu 连接
要从 Ubuntu 连接,请打开文件资源管理器并选择左侧边栏中的 连接到服务器 选项。 这将打开一个新屏幕,我们可以在其中输入服务器地址。
输入smb://10.8.0.1/
,点击右下角的连接按钮。 根据您的连接速度,您的 PC 可能需要几秒钟才能连接到服务器。 连接后,将出现一个显示服务器上所有共享目录的屏幕:
要访问 Allusers
共享,只需双击文件夹。 将出现一个登录屏幕,要求输入用户名和密码。 Allusers
共享不需要任何用户名和密码,因此您应该为 Connect As 选项选择 Anonymous。 点击Connect,它会为你打开共享目录。
请注意这些共享目录在您访问它们后是如何安装在您的文件系统中的。 Allusers
共享作为网络驱动器与其他本地驱动器一起安装。
驱动器将保持安装状态,直到系统重新启动或驱动器被卸载。
要访问 Restricted
共享,您需要有效的用户名和密码才能登录。 双击 Restricted
共享,将再次出现登录屏幕。 对于 Connect As 选项,选择 Registered User 并在相应字段中填写用户名和密码,保留 Domain 选项不变。 然后点击连接,就可以访问共享文件了。
从 Mac 连接
要从 Mac 连接,请打开 Finder,选择 Go 菜单,然后选择 Connect to Server...。 然后使用 smb://10.8.0.1/
作为 服务器地址 :
其余的连接过程与从 Linux 或 Windows 连接的过程相同。 系统将提示您输入用户名和密码,并且能够查看和连接到可用共享。
这负责我们的文件服务器。 现在让我们看看如何配置 Apache 以在同一服务器上托管内部和外部网站。
第 4 步 — 配置对 Apache 虚拟主机的访问
在本教程之前,您创建了两个虚拟主机,我们将对其进行配置以在我们的服务器上使用。 第一个主机 example.com
将可供公众访问。 这可能是您域的主要公共网站。 第二台主机 intranet.example.com
只能由连接到 Intranet 的客户端访问。
要限制对 intranet.example.com
的访问,我们将编辑该虚拟主机的配置文件。 打开文件 /etc/apache2/sites-available/intranet.example.com.conf
:
sudo nano /etc/apache2/sites-available/intranet.example.com.conf
然后从这里更改 VirtualHost
声明:
/etc/apache2/sites-available/intranet.<^>example.com<^>.conf
<VirtualHost *:80>
对此:
/etc/apache2/sites-available/intranet.<^>example.com<^>.conf
<VirtualHost 10.8.0.1:80>
在更改之前,Apache 将在所有网络接口上为 internal.example.com
的请求提供服务。 在此更改之后,它仅在我们的 Intranet 接口上提供请求。 这类似于我们用于 Samba 的配置。
保存文件并重新启动 Apache 服务:
sudo systemctl restart apache2
我们还需要允许通过 UFW 进行连接,以使 Apache 正常工作。 如果您还没有这样做,请执行此命令以允许流量通过 Apache 的防火墙:
sudo ufw allow http
如果您计划允许 HTTPS 流量,现在也允许,或者稍后配置:
sudo ufw allow https
现在让我们配置域名,以便我们可以更轻松地访问我们的资源。
第 5 步 — 配置域名
在这一步中,我们将配置我们的域名以重定向 Intranet 的流量,同时还为可公开访问的网站提供服务。 在开始本文之前,您应该已将您的域名指向 DigitalOcean 的名称服务器。
注意:如果您有自己的名称服务器,则需要在 DNS 提供商的控制面板中进行这些设置。
登录您的 DigitalOcean 帐户,然后单击顶部栏中的 Networking 选项卡。 然后,您将看到如下所示的屏幕:
要将域添加到您的 DigitalOcean 帐户,请在 添加域 标题下的第一个框中输入您的域名。 在第二个框中输入您的内网服务器的公共IP,然后单击创建记录按钮。
然后,您的新域名将出现在 Domains 子标题下,如第二张图片所示。 现在单击要使用的域旁边的更多,然后选择查看域。
这将打开该特定域的设置页面。
我们需要为这个域添加三个记录。 一个用于 Intranet,另外两个用于确保正确解决对我们公共网站的请求。
首先,为 Intranet 创建一条记录。
- 单击选择记录类型下的橙色“A”框。
- 在 输入名称 字段中输入
intranet
。 - 对于 IP 地址,输入服务器的 私有 IP 地址,应为
10.8.0.1
。
接下来,我们需要一条将非 Intranet 流量引导到正确位置的记录。 创建另一个'A'记录,将名称设置为@
并将IP设置为您服务器的公共IP。
最后,为 www
创建一条 CNAME 记录。 单击右上角的 CNAME 选项卡,将名称设置为 www
并输入您的域名(example.com
作为主机名:
完成后,您的域记录应如下图所示:
intranet
A 记录仅当请求来自 VPN 服务器时才会将请求定向到 intranet.example.com
。 这意味着只有连接到 VPN 的客户端才能访问托管在 intranet.example.com
上的 Web 内容。 第二个“A”记录和 CNAME 记录无法访问内网的直接流量到公开可用的网站。
注意:这些 DNS 更改可能需要长达 72 小时才能传播。
转到您的浏览器并访问 http://intranet.example.com
而不连接到 VPN。 您应该会看到您的浏览器尝试加载网页只是为了返回错误。 现在 连接到您的 VPN 并重新加载网页。 您现在可以访问网页,因为 DNS 条目将解析。
现在我们已经彻底配置和测试了我们的 Intranet,让我们看看我们如何管理对这个新创建的网络的访问。
第 6 步 — 管理对 Intranet 的访问
本教程的最后一步将处理管理对我们的 Intranet 及其共享文件的访问。 首先,我们将了解如何吊销 VPN 访问的客户端证书。 然后我们将看看如何从 smbrestricted 组中删除用户。 最后,我们将回顾添加其他用户并让他们获得所需的访问权限。
撤销 VPN 访问
要撤销对 VPN 的访问,我们将撤销客户的证书。 这使我们可以拒绝访问我们的 Intranet,而无需为任何其他客户端或服务器生成新证书。
首先,我们需要在 VPN 服务器的配置文件中添加额外的一行,以使我们能够在不更改原始 CA 证书或服务器证书的情况下撤销任何客户端证书。 这使得访问控制变得更加容易,因为您现在可以轻松地即时撤销单个证书,而不会中断任何其他客户端连接。
打开 VPN 配置文件:
sudo nano /etc/openvpn/server.conf
在文件末尾添加以下代码行:
/etc/openvpn/server.conf
crl-verify crl.pem
这告诉 VPN 服务器查找文件 crl.pem
,这是一个证书撤销列表。 它将包含不再允许访问我们的 VPN 的所有证书的列表。
保存并关闭配置文件,但先不要重启服务器; 我们需要创建我们的配置正在寻找的 crl.pem
文件。
要创建此文件,请切换到服务器上的 ~/openvpn-ca/
目录:
cd ~/openvpn-ca/
假设我们需要撤销 client1 的证书,因为它们不再为我们的组织工作。 为此,请运行以下命令:
source vars ./revoke-full client1
您将看到以下输出:
OutputUsing configuration from /home/intranetexapmle/openvpn-ca/openssl-1.0.0.cnf Revoking Certificate 02. Data Base Updated Using configuration from /home/intranetexample/openvpn-ca/openssl-1.0.0.cnf client1.crt: C = US, ST = NY, L = New-York City, error 23 at 0 depth lookup:certificate revoked
输出的最后一行应该 always 表示 错误 23。 此错误仅确认证书已被吊销。
这也会在 ~/openvpn-ca/keys/
目录中创建 crl.pem
。 要确认证书已被吊销,请使用任何文本编辑器打开 keys/index.txt
文件,或使用 cat
显示其内容:
cat keys/index.txt
我们撤销其证书的客户端旁边将有一个“R”:
OutputV 260904153313Z 01 unknown /C=US/ST=NY/L=New York/O=DigitalOcean/OU=Community/CN=server/name=server/emailAddress=me@example.com R 260904172539Z 160915150543Z 02 unknown /C=US/ST=NY/L=New York/O=DigitalOcean/OU=Community/CN=client1/name=server/emailAddress=me@example.com
现在将 crl.pem
文件复制到 /etc/openvpn/
目录,这是我们告诉我们的 OpenVPN 服务器查找文件的地方:
sudo cp keys/crl.pem /etc/openvpn/
然后重启 OpenVPN 服务器以使证书撤销选项生效。
sudo systemctl restart openvpn@server
每次与服务器建立新连接时,OpenVPN 服务器都会查询 crl.pem
文件。 每次您撤销客户的证书时,您都将旧的 crl.pem
文件替换为新文件。 您不需要重新启动服务器。
需要注意的是,一旦 VPN 证书被吊销,以后就不能再使用了。 如果我们希望他们能够再次连接到网络,VPN 证书已被吊销的客户端将需要一个新证书。
阻止用户访问受限共享。
我们创建了一个共享目录,该目录只能由 smbrestricted 组中的用户访问。 要拒绝该组中已有用户的访问,我们从该组中删除该用户。 例如,要删除 client1,请使用以下命令:
sudo deluser client1 -G smbrestricted
您将看到以下输出:
OutputRemoving user `client1' from group `smbrestricted' ... Done.
如果您不确定用户是否已包含在组中,或者您想仔细检查用户是否已被删除,您可以使用 members
命令:
sudo apt-get install members members smbrestricted
组中的任何用户都将显示在屏幕上。
将新用户添加到 Intranet
Intranet 的每个新用户都需要自己的 VPN 证书,因此您需要按照每个用户的先决条件中的 如何在 Ubuntu 16.04 教程上设置 OpenVPN 服务器中的步骤进行操作。 例如,要创建一个名为 client2
的用户,您需要执行以下操作:
首先,构建密钥:
cd ~/openvpn-ca ./build-key client2
然后生成客户端配置:
cd ~/client-configs ./make_config.sh client2
然后,在您的本地计算机上,下载客户端配置:
sftp sammy@openvpn_server_ip:client-configs/files/client2.ovpn ~/
要授予新用户访问受限文件的权限,请按照本教程 Samba 部分中用于 client1 的相同步骤进行操作:
- 创建用户并将其添加到
smbrestricted
组。 - 使用
smbpassword
为用户创建 Samba 密码。 - 测试连接。
然后为您需要添加的每个用户重复此过程。
结论
您已经使用 OpenVPN、Samba 和 Apache 成功创建并保护了自己的私有 Intranet。 您有一个内部网站和两个文件共享。
您接下来要去哪里取决于您将使用 Intranet 的目的。 由于大多数服务器应用程序使用网页来显示信息,您可以使用虚拟主机配置来限制对该页面的访问,就像我们在本教程中所做的那样。 您可以通过托管来自内部社交网络、Wiki 或电子邮件服务等多种服务来扩展您的网络。 为了更有效地管理共享文件,您可以下载并安装 Samba Web 管理工具 。 使用您在此处学到的知识,您应该能够配置任意数量的服务以用于您的新 Intranet。