我们需要设置服务器以响应客户端建立隧道的请求。
传入的 SSH VPN 请求必须定向到服务器上的特定用户。为了安全和可追溯性,我建议您使用专用用户来处理 VPN 请求。以下步骤将设置一个名为“vpn”的系统用户来执行此操作。
首先,我们创建用户帐户。帐户分为两个范围:系统范围(通常为 100-999)和常规用户范围(1000+)。“--system”告诉 adduser 在系统范围内添加用户,并为其提供 /bin/false 作为登录 shell。“--group”告诉 adduser 同时创建一个与用户同名的组,并将用户添加到该组。
server# adduser --sytem --group vpn |
由于 vpn 用户需要通过 ssh 登录,请将 vpn 的 shell 从 /bin/false 更改为 /etc/passwd 文件中的 /bin/bash。您可以使用 vi 或任何其他合适的文本编辑器简单地编辑 /etc/passwd。
为 vpn 用户创建密码。它可以(并且应该)非常复杂,因为您在设置 VPN 时只会输入几次。之后,您将永远不会再次输入它。
server# passwd vpn Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully |
现在,尝试连接到服务器以确保您已正确创建帐户。
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 节。
每次您想要建立 VPN 连接时都必须输入密码,这将非常糟糕,因此我们将设置 SSH 的 RSA 身份验证。如果您真的不介意每次都输入密码,请跳过本节。
确保客户端机器上的 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 |
现在,将 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 |
现在,成为客户端上的 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 帐户。
pppd 需要以 root 身份运行。但是,在服务器上,我们以“vpn”用户身份运行所有内容。vpn 用户如何运行 pppd?
有很多方法可以解决这个问题。一种是使用 suid 位,并按组安排权限。但是,这可能会很快变得混乱且难以管理,从而导致意外的安全漏洞。就我个人而言,我发现 sudo 实用程序是一个更好的解决方案。
sudo 赋予普通用户超级用户权限,但仅限于非常有限的一组命令。系统管理员可以决定允许哪些命令以及执行多少日志记录。在本例中,我们希望允许用户“vpn”以超级用户权限运行 pppd,但不允许执行任何其他操作。
我们需要编辑 sudo 的配置文件 /etc/sudoers。为了使用适当的锁定,希望防止意外和竞争条件,请使用 visudo 命令来编辑 /etc/sudoers。如果您不熟悉 vi,请参阅 VIM HOWTO。
server# visudo |
将以下两行添加到文件底部
Cmnd_Alias VPN=/usr/sbin/pppd vpn ALL=NOPASSWD: VPN |
现在,验证 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 文件。