4. 配置服务器

我们需要设置服务器以响应客户端建立隧道的请求。

4.1. 创建 VPN 用户

传入的 SSH VPN 请求必须定向到服务器上的特定用户。为了安全和可追溯性,我建议您使用专用用户来处理 VPN 请求。以下步骤将设置一个名为“vpn”的系统用户来执行此操作。

  1. 首先,我们创建用户帐户。帐户分为两个范围:系统范围(通常为 100-999)和常规用户范围(1000+)。“--system”告诉 adduser 在系统范围内添加用户,并为其提供 /bin/false 作为登录 shell。“--group”告诉 adduser 同时创建一个与用户同名的组,并将用户添加到该组。

    server# adduser --sytem --group vpn
  2. 由于 vpn 用户需要通过 ssh 登录,请将 vpn 的 shell 从 /bin/false 更改为 /etc/passwd 文件中的 /bin/bash。您可以使用 vi 或任何其他合适的文本编辑器简单地编辑 /etc/passwd。

  3. 为 vpn 用户创建密码。它可以(并且应该)非常复杂,因为您在设置 VPN 时只会输入几次。之后,您将永远不会再次输入它。

    server# passwd vpn
    Enter new UNIX password: 
    Retype new UNIX password: 
    passwd: password updated successfully
  4. 现在,尝试连接到服务器以确保您已正确创建帐户。

    client% ssh eldivino.domain.com -l vpn
    vpn@eldivino's password: 
    Linux eldivino 2.2.19 #6 Mon Jun 4 10:32:19 PDT 2001 i686 unknown
    No mail.
    vpn@eldivino:~$

    如果您没有正确设置反向 DNS,ssh 可能需要一段时间才能连接。您可以随时修复它。它只会延迟 VPN 的建立,但不会阻止其工作。

    如果它只是停滞不前,那么 ssh 协议可能被两台机器之间的防火墙阻止了。请再次查看 第 3.5 节

4.2. 设置身份验证登录

每次您想要建立 VPN 连接时都必须输入密码,这将非常糟糕,因此我们将设置 SSH 的 RSA 身份验证。如果您真的不介意每次都输入密码,请跳过本节。

  1. 确保客户端机器上的 root 帐户在 root 的主目录(~/root/.ssh/identity.pub)中有一个公钥。如果此文件不存在,则必须创建它。以 root 身份运行 ssh-keygen

    # ssh-keygen
    Generating public/private rsa1 key pair.
    Enter file in which to save the key (/root/.ssh/identity): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/identity.
    Your public key has been saved in /root/.ssh/identity.pub.
    The key fingerprint is:
    15:61:57:7e:5c:26:91:09:5c:e6:10:b7:a1:74:bd:25 root@paradis
  2. 现在,将 identity.pub 复制到服务器上 vpn 帐户的 authorized_keys 文件中。您几乎肯定需要创建此文件。以 root 身份,在服务器上执行以下命令

    server# cd ~vpn
    server# mkdir .ssh
    server# chown root.vpn .ssh
    server# chmod 755 .ssh
    server# cd .ssh

    现在,将客户端的 /root/.ssh/identity.pub 文件(只有一行)复制到服务器的 ~vpn/.ssh/authorized_keys 文件中。如果您想允许多个客户端连接,则可以向 authorized_keys 添加更多行,每个客户端一行。

    server# chown root.vpn authorized_keys
    server# chmod 644 authorized_keys
  3. 现在,成为客户端上的 root 用户,并尝试 SSH 连接到服务器。您可能需要也可能不需要使用 -P 选项,具体取决于您的客户端防火墙的设置方式。如果您的客户端上端口 22 被阻止(如果它没有运行 SSH 服务器,这不是一个坏主意),那么 -P 会告诉 ssh 使用非特权端口,即使它以特权用户身份运行。

    client# ssh -P eldivino.domain.com -l vpn
    Linux eldivino 2.2.19 #6 Mon Jun 4 11:03:22 PDT 2001 i686 unknown
    No mail.
    vpn@eldivino:~$

    好了,我们刚刚通过 RSA 身份验证。请务必保护您的私钥(客户端的 ~root/.ssh/identity 文件)!任何有权访问此文件的人都可以登录到服务器上的 VPN 帐户。

4.3. 设置 sudo

pppd 需要以 root 身份运行。但是,在服务器上,我们以“vpn”用户身份运行所有内容。vpn 用户如何运行 pppd?

有很多方法可以解决这个问题。一种是使用 suid 位,并按组安排权限。但是,这可能会很快变得混乱且难以管理,从而导致意外的安全漏洞。就我个人而言,我发现 sudo 实用程序是一个更好的解决方案。

sudo 赋予普通用户超级用户权限,但仅限于非常有限的一组命令。系统管理员可以决定允许哪些命令以及执行多少日志记录。在本例中,我们希望允许用户“vpn”以超级用户权限运行 pppd,但不允许执行任何其他操作。

  1. 我们需要编辑 sudo 的配置文件 /etc/sudoers。为了使用适当的锁定,希望防止意外和竞争条件,请使用 visudo 命令来编辑 /etc/sudoers。如果您不熟悉 vi,请参阅 VIM HOWTO

    server# visudo

    将以下两行添加到文件底部

    Cmnd_Alias VPN=/usr/sbin/pppd
    vpn ALL=NOPASSWD: VPN
  2. 现在,验证 sudo 是否设置正确。以服务器上的“vpn”用户身份,尝试使用 sudo 运行 pppd

    server# su - vpn
    server$ sudo /usr/sbin/pppd noauth
    ~9}#�Z}!}!} }9}"}k} }r} }'}%}zt2-�}'}"}

    如果您在屏幕上看到一堆 PPP 乱码(如上面的最后一行),这是好的。这意味着 vpn 用户被允许运行 pppd。您现在可以切换到另一个终端来终止它,或者您可以让 pppd 自行完成。它应该在大约 30 秒后放弃尝试连接。

    但是,如果您收到“bash: /usr/sbin/pppd: Permission denied”或其他类型的错误,或者它要求输入密码,则 sudo 可能无法正常工作。您需要尝试找出问题所在。验证 pppd 是否在 /usr/sbin 中,以及您是否正确设置了 sudoers 文件。