3. 软件安装

3.1. 术语

由于 VPN 的设置与客户端-服务器事务非常相似,我将借用该术语来命名隧道两端的计算机

服务器

这是被动等待传入 VPN 连接请求的计算机。它完全无人值守地运行。

客户端

这是发起连接请求的计算机,请求服务器启动 VPN。

3.2. 要求

3.3. 规划

要设置 PPP-SSH 链接,您需要指定以下参数

服务器主机名

您的 VPN 服务器的主机名或 IP 地址是什么?

服务器 VPN 用户名

在您的服务器上,VPN 软件将以哪个用户名运行?本教程包含有关如何专门为此创建一个名为“vpn”的用户的说明。这应该是 root 用户!为了安全和日志记录,这应该是一个专用帐户。

服务器接口 IP 地址

PPP-SSH VPN 在客户端和服务器上都设置了专用网络接口。该接口将是 pppN,其中 N 是第一个未使用的 ppp 接口的编号(即,如果您已经使用 ppp0 通过调制解调器拨号,它将是 ppp1)。

您需要为服务器上的接口指定 IP 地址。此地址仅对客户端和服务器可见(以及对客户端和服务器可能为其转发未伪装数据包的子网上的任何计算机可见)。

如果您不知道选择哪个 IP 地址,请阅读Linux 网络管理员指南中的第 2.2 章,尤其要查看表 2-1。例如,192.168.0.1 是一个不错的选择。

客户端接口 IP 地址

您需要为客户端上的接口选择 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

3.4. 设置 PPP

内核的 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

3.5. 允许 SSH 通过防火墙

两台机器之间唯一的网络流量(当然,作为隧道的​​结果)将通过 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