由于 VPN 的设置与客户端-服务器事务非常相似,我将借用该术语来命名隧道两端的计算机
这是被动等待传入 VPN 连接请求的计算机。它完全无人值守地运行。
这是发起连接请求的计算机,请求服务器启动 VPN。
您的内核必须内置对 TCP/IP 和 PPP 的支持。几乎所有发行版都开箱即用地附带 PPP 支持。如果您的发行版没有,或者您正在使用自定义内核,我将在第 3.4 节中提供更多详细信息。
您必须安装 pppd 守护程序。您的发行版很可能已附带此程序。我正在使用 ppp-2.3.11。更高版本应该可以正常工作,只要它们支持“pty”选项,早期版本也应该可以工作。您不需要安装 chat 或任何其他旨在与 PPP 配合使用的工具——您只需要 pppd。
客户端机器需要安装 ssh 客户端。有许多不同版本的 ssh 在流通,但它们都应该可以工作。我正在使用 OpenBSD 的 OpenSSH 软件包版本 2.2.0p1。
服务器机器需要 sshd 守护程序来处理来自客户端的 ssh 请求。OpenSSH 包含一个非常好的 ssh 守护程序。
最后,您需要在服务器上安装 sudo 工具。您可以在Linux 管理员安全指南的“管理工具”部分和Linux 安全 HOWTO 的“Root 安全”部分中找到有关 sudo 的更多信息。您可能还想查看 sudo 的主页。
要设置 PPP-SSH 链接,您需要指定以下参数
您的 VPN 服务器的主机名或 IP 地址是什么?
在您的服务器上,VPN 软件将以哪个用户名运行?本教程包含有关如何专门为此创建一个名为“vpn”的用户的说明。这不应该是 root 用户!为了安全和日志记录,这应该是一个专用帐户。
PPP-SSH VPN 在客户端和服务器上都设置了专用网络接口。该接口将是 pppN,其中 N 是第一个未使用的 ppp 接口的编号(即,如果您已经使用 ppp0 通过调制解调器拨号,它将是 ppp1)。
您需要为服务器上的接口指定 IP 地址。此地址仅对客户端和服务器可见(以及对客户端和服务器可能为其转发未伪装数据包的子网上的任何计算机可见)。
如果您不知道选择哪个 IP 地址,请阅读Linux 网络管理员指南中的第 2.2 章,尤其要查看表 2-1。例如,192.168.0.1 是一个不错的选择。
您需要为客户端上的接口选择 IP 地址。当然,它必须与服务器的 IP 地址位于同一网络上。它不得与客户端上的任何其他网络冲突,也不能与服务器的网络接口 IP 地址相同。如果您为上一个问题选择了 192.168.0.1,那么您可能在此处使用 192.168.0.2。
我的设置如下所示
SERVER_HOSTNAME = eldivino.domain.com SERVER_USERNAME = vpn SERVER_IFIPADDR = 192.168.3.1 CLIENT_IFIPADDR = 192.168.3.2 |
内核的 PPP 代码可以编译到内核本身中,也可以放入可加载的内核模块中。如果您将其编译到内核中,则可以跳到下一步——您在这里就完成了。但是,如果您将 PPP 作为模块加载,则需要确保模块已正确加载。
当您运行 lsmod 时,您可以检查 ppp 是否与所有其他当前加载的模块一起列出。请记住检查客户端和服务器上是否都加载了 PPP 模块。
server$ /sbin/lsmod Module Size Used by ppp 20780 0 (unused) slhc 4376 0 [ppp] 3c59x 21636 1 client$ lsmod Module Size Used by ppp_deflate 40308 0 (autoclean) bsd_comp 4076 0 (autoclean) ppp 20844 2 [ppp_deflate bsd_comp] slhc 4376 1 [ppp] |
如果您确定 ppp 已编译为模块,但未加载到内核中,请尝试使用 modprobe 加载它
# modprobe ppp |
如果 modprobe 没有返回任何错误,请再次检查 lsmod——这次应该列出它了。如果是这样,则您的 ppp 模块未在启动时加载。如果您正在运行内核守护程序,则这没问题,因为 PPP 模块将按需加载。但是,如果您没有运行内核守护程序,则需要在启动时手动加载模块,方法是在您的 /etc/modules 文件中放置一个完全由单词“ppp”组成的单行。
有关此主题的更多信息,请参阅Linux 内核 HOWTO。
两台机器之间唯一的网络流量(当然,作为隧道的结果)将通过 SSH 协议。
SSH 仅使用 TCP 流——没有 UDP 或 ICMP。ssh 服务器 (sshd) 监听端口 22。我们的客户端(因为我们使用了 -P 标志)仅使用 1024 到 65535 之间的非特权端口。此描述应为您提供足够的信息来设置防火墙。
例如,以下是允许 ssh 连接到服务器所需的 ipchains 命令。我们允许本地机器上的端口 22 和远程机器上的任何端口之间的传入 SSH 连接。将 eth0 替换为将承载 ssh 流量的接口,并将 $IPADDR 替换为该接口的 IP 地址。
ipchains -A input -i eth0 -p tcp -d $IPADDR 22 -j ACCEPT ipchains -A output -i eth0 -p tcp ! -y -s $IPADDR 22 -j ACCEPT |
并且,以下是在客户端上设置防火墙所需的命令。我们不允许传入的 ssh 连接,并且我们只允许协议在远程机器上的端口 22 和此机器上的非特权端口之间传递。同样,将 eth0 替换为将承载 ssh 流量的接口,并将 $IPADDR 替换为该接口的 IP 地址。
ipchains -A input -i eth0 -p tcp ! -y --source-port 22 -d $IPADDR 1024:65535 -j ACCEPT ipchains -A output -i eth0 -p tcp -s $IPADDR 1024:65535 --destination-port 22 -j ACCEPT |