7. 将 VPN 集成到您的系统中

手动启动连接用久了会让人感到厌烦。您可能希望您的 VPN 在启动时或拨号连接建立时自动启动。

7.1. 在启动时连接

让此脚本在启动时运行非常容易。我假设您正在使用非常常见的 System V initscript 设置。如果不是,您将需要自行研究如何将其集成到您的系统中。

  1. 将 vpn-pppssh 脚本复制或符号链接到 /etc/init.d。

    cp /usr/local/bin/vpn-pppssh /etc/init.d/vpn-pppssh
  2. 取消 vpn-pppssh 脚本中 start 和 stop 子句中 echo 行的注释,以启用启动时的 “Starting” 和 “done.” 消息。

  3. 在脚本的 start 部分,在以 "${PPPD}" 开头的行之后添加 "> /dev/null 2>&1"。这只是为了防止 pppd 的详细消息弄乱您的启动屏幕。您也可以将 pppd 的消息(其中可能包含非常有用的错误信息)重定向到一个日志文件,或者如果您不注重美观,就不用管它,让您的屏幕变得乱七八糟。

  4. 现在,您只需将您的脚本链接到六个运行级别中的每一个。

    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc0.d/K10vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc1.d/K10vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc2.d/S99vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc3.d/S99vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc4.d/S99vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc5.d/S99vpn-pppssh
    client$ ln -s /etc/init.d/vpn-pppssh /etc/rc6.d/K10vpn-pppssh

现在,当您重启机器时,vpn 应该在启动过程的末尾附近启动。当它执行到此脚本时,您的机器将等待 VPN 启动后再继续启动。如果这是一个问题,您可以编写自己的 /etc/init.d/vpn-pppssh 脚本,该脚本在后台调用 /usr/local/bin/vpn-pppssh 脚本。链接将在您的机器完成启动后建立。

要手动启动或关闭连接,只需直接从 /etc/init.d 运行 vpn-pppssh 脚本。

client$ /etc/init.d/vpn-pppssh stop
client$ /etc/init.d/vpn-pppssh start

7.2. 通过拨号连接

如果您正在使用 PPP 拨号连接到互联网,您可以设置每次拨号连接建立时都启动 VPN。这并不困难,但这确实需要一个较新版本的 pppd,该版本需要同时支持 ipparam 选项以及 ip-up.d 和 ip-down.d 目录。

  1. 在 /etc/ppp/ip-up.d 中创建 “vpn-up” 文件。

    #!/bin/sh
    
    if [ "$PPP_IPPARAM" = "vpn" ]; then
            # Don't bring up the vpn if we're bringing up the vpn.
            exit 0
    fi
    
    /usr/local/bin/vpn start

    这里存在一个重入问题,if 语句可以解决这个问题。如果我们正在启动常规的 PPP 连接,我们希望启动 VPN。但是,VPN 本身也是一个 PPP 连接!如果我们不对此做任何处理,PPP 将会递归地自我衍生,直到您的机器崩溃。

    诀窍在于 vpn-pppssh 脚本中的 “ipparam vpn” 参数。 这会将此调用的 IPPARAM 变量设置为 “vpn”,然后我们在启动脚本中检查它。 如果它设置为 vpn,那么我们就知道我们正处于启动 vpn 的过程中,所以我们直接无错误退出。 否则,我们就启动它。

  2. 如果您想在启动 VPN 时在防火墙上打一个孔,您可以简单地创建一个包含以下内容的 /etc/ppp/ip-up.d/vpn-fw 文件。 以下所有 shell 变量均由 pppd 提供,因此您应该能够直接使用此脚本,无需修改。

    #!/bin/sh
    
    # Punch a hole in the firewall for the VPN
    
    if [ "$PPP_IPPARAM" = "vpn" ]; then
            ipchains -I input 1 -i $PPP_IFACE -s $PPP_REMOTE -d $PPP_LOCAL -j ACCEPT
            ipchains -I output 1 -i $PPP_IFACE -s $PPP_LOCAL -d $PPP_REMOTE -j ACCEPT
    fi
  3. 在 /etc/ppp/ip-down.d/vpn-pppssh 中创建 “vpn-down” 文件。

    #!/bin/sh
    
    if [ "$PPP_IPPARAM" = "vpn" ]; then
            # Don't bring down the VPN if we're bringing down the vpn.
            exit 0
    fi
    
    /usr/local/bin/vpn stop

确保使上面的所有脚本都可执行 (chmod a+x /etc/ppp/ip-up.d/vpn-pppssh)。 现在,当您启动 PPP 连接时,VPN 应该会随之启动。 并且,当您关闭它时,VPN 将会消失。 非常简单。