VTun

作者:Ryan Breen

在互联网泡沫时代的鼎盛时期,我是一家P2P软件初创公司的第一位员工。因为我们是从零开始构建内部网和开发环境,所以我们可以在任何地方自由地使用 Linux。正如现在大家都知道的,世界发生了变化,互联网公司也走向了衰落。我的小初创公司的独立性也随之消失,它被一家拥有成熟 Windows 开发人员基础的大公司收购了。尽管新公司足够开明,允许我继续在 Linux 上进行开发,但在系统管理任务方面,我基本上只能靠自己了。

我遇到的唯一重大困难领域是 VPN 设置。在我的上一份工作中,每位开发人员都有一个映射到其开发工作站的入站 SSH 端口。新办公室不仅锁定了对 SSH 端口的外部访问,而且批准的 VPN 解决方案对 Linux 也不友好。技术惯性保证了像 FreeS/WAN 这样的跨平台解决方案在可预见的未来无法实现。幸运的是,VTun,我在上一份工作中使用的 VPN 解决方案,足够灵活,甚至可以处理这种恶劣的环境。

它是如何工作的?

VTun 的工作原理是将 IP 隧道技术与现有的数据包路由程序无缝集成。VTun 秉承 UNIX 模块化精神,仅直接负责在两个系统之间隧道传输数据包,利用已建立的网络管理工具来提供一个有凝聚力的 VPN 解决方案。

为了便于类比,假设您的家庭和办公室网络是一组离散且隔离的铁路网络。每台机器代表一个车站。Linux 内核控制轨道开关,决定火车如何从一个车站到达下一个车站。这些设施可以通过 route 程序进行操作,允许最终用户添加或删除目的地。

Linux 内核还提供了用于重新路由火车的设施。例如,让我们将互联网(一个庞大的铁路系统)添加到我们的火车站类比中。家庭和办公室网络只是这个系统中微小的支线。通常,只有一个车站(防火墙或网关路由器)可以直接访问更大的互联网铁路。如果家庭轨道上的另一个车站想要向互联网发送火车,这些火车首先会被重新路由通过网关车站。这个重新路由过程,技术上称为 IP 伪装或网络地址转换 (NAT),是通过 iptables 程序管理的。iptables 是 2.4 Linux 内核中 Netfilter 防火墙代码的用户空间部分。

那么 VTun 在这个类比中处于什么位置呢?回想一下,家庭和办公室网络是隔离的火车系统。由于办公室防火墙站的限制,来自家庭的火车通常不允许越过工作轨道。VTun 为我们提供了一种在两个车站(例如,您的家庭和办公室桌面)之间的单独网络上铺设虚拟轨道的设施。一旦铺设了这条轨道,车站就会使用 iptables 进行配置和路由,以便来自家庭的火车可以像从办公室桌面出发一样自由地访问工作系统。

约定和注意事项

现在我们已经了解了 VTun VPN 的组件,我们准备检查一个完整的实现。最明显的场景是将单个远程工作站(您的家庭桌面)通过您的工作桌面连接到办公室 LAN。为了使这个例子简单,假设您可以从家中建立到办公室桌面的 SSH 连接,但该机器在其他方面无法从 Internet 访问。假设家庭网络配置在 192.168.1.0/24 子网,办公室网络具有 192.168.5.0/24 和 192.168.100.0/24 子网。

VTun 是一个客户端/服务器系统。服务器机器在指定的端口上侦听来自 VTun 客户端的连接。客户端通过连接到服务器端口来启动隧道的创建。对于此示例,家庭桌面是客户端,办公室桌面是服务器。

在我们开始安装之前,我们应该花一点时间讨论安全性。创建 VPN 可能意味着办公室网络的安全性现在仅与家庭网络一样安全。因此,至关重要的是,您的家庭机器受到防火墙的保护,该防火墙在所有安全补丁上都是最新的,并且定期进行入侵审计。最重要的是,未经您办公室系统管理员的同意,切勿创建 VPN。

安装

在注意事项和免责声明之后,我们继续进行有趣的部分。VTun 需要安装在客户端和服务器上,因此应在每个系统上完成下面概述的步骤。此步骤已在最新版本的 Red Hat Linux 上进行了测试。如果您发现此安装路径在您的发行版中失败,请发送电子邮件至 ryan@ryanbreen.com。我将使用这些回复来跟踪 www.ryanbreen.com/vtun 上的特定于发行版的勘误表文件。

某些发行版已经有 VTun 的软件包,因此您可以通过使用软件包管理器从发行版的更新站点安装 VTun 来节省一个步骤。

与大多数 VPN 解决方案一样,VTun 需要内核级设施的支持,在这种情况下,由 TUN 点对点网络驱动程序提供。TUN 模块包含在标准内核发行版中,因此您很可能不需要重新编译内核。作为测试,尝试通过运行以下命令加载驱动程序insmod tun以 root 身份运行。如果未找到模块,请从 vtun.sourceforge.net/tun/index.html 下载最新版本(当前为 tun-1.1)。使用以下命令安装它

tar xzf tun-1.1.tar.gz
cd tun-1.1
su -c 'make install'

如果您希望在进程尝试访问虚拟隧道设备时自动加载 TUN 模块,请将以下行添加到 /etc/modules.conf

alias char-major-10-200 tun

接下来,配置并安装用户空间 vtund 程序。您可以在 vtun.sourceforge.net/download.html 找到最新的 VTun 软件包。为了通用性,这里我们从源代码安装,但如果您的发行版支持 RPM 或 deb,请随意获取预编译的软件包之一。截至发稿时,最新的源代码 tarball 是 vtun-2.5.tar.gz。编译遵循标准步骤

tar xzf vtun-2.5.tar.gz
cd vtun-2.5
./configure
make
su -c 'make install'

根据您的发行版,配置可能会因 LZO 未安装而失败。LZO 是 VTun 使用的压缩库。它可以从 www.oberhumer.com/opensource/lzo/download 下载。构建并安装 LZO,然后重试 VTun 安装。

安装后,VTun 将其配置文件放在 /usr/local/etc/vtund.conf。这可能会非常令人困惑,因为客户端和服务器需要在隧道规范部分中单独的条目。为了避免混淆,我建议根据需要将 vtund.conf 移动到 vtund-client.conf 和 vtund-server.conf。然后,在启动时手动指定相关配置文件的路径。以下配置讨论中都使用了此建议。

VTun 配置文件

VTun 配置文件格式相对简单明了(请参阅列表 1 和列表 2)。该文件分为三个离散的单元。第一个是一组全局选项,用于定义基本参数,例如服务器端口号和辅助程序的路径。第二个是一组默认会话选项,用于定义隧道的网络属性。这些属性可以在特定隧道的配置中根据需要被覆盖。

列表 1. 简单的 vtund-client.conf

options {
   port 5000;

   # Path to various programs
   ifconfig   /sbin/ifconfig;
}

# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}


my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol

   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.5.0/24 = actual work network 1
      # 192.168.100.0/24 = actual work network 2
      ifconfig
        "%% 10.3.0.1 pointopoint 10.3.0.2 mtu 1450";
   };
   down{
      ifconfig "%% down";
   };
}

列表 2. 简单的 vtund-server.conf

options {
   port 5000;

   # Path to various programs
   ifconfig   /sbin/ifconfig;
}

# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}

my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol

   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.1.0/24 = actual home network
      ifconfig
        "%% 10.3.0.2 pointopoint 10.3.0.1 mtu 1450";
   };
   down{
      ifconfig "%% down";
   };
}

一个值得特别关注的隧道配置参数是 keepalive。办公室系统管理员通常在其防火墙上为活动连接设置较低的空闲时间。如果您的隧道不活动时间超过此截止时间,即使只有几分钟,您的连接也会超时。启用 keepalive 指示 VTun 通过定期从客户端向服务器发送数据包来规避此行为,从而使防火墙确信连接正在积极使用中。

最后一组选项定义了特定隧道的配置。配置文件可以包含任意数量的此类设置,允许客户端和服务器参与多个 VPN。每个隧道配置组都以一个名称开头。我选择了名称 my_tunnel,但该名称是任意指定的。每个隧道都可以配置密码,但当隧道通过 SSH 创建时,通常会忽略此选项。up 和 down 块分别描述了在创建和销毁隧道时运行的一组命令。

列表 1 和列表 2 中的简单配置文件指示 VTun 在连接建立后在每个系统上创建隧道接口。配置文件使用模式 %% 来表示隧道接口,因此可以按任何顺序创建多个隧道。隧道接口的实际名称以 tun 前缀开头,后跟一个数字。创建的第一个隧道是 tun0。

创建 VTun VPN

让我们将对 VTun 配置的基本理解付诸实践,使用列表 1 和列表 2 创建一个简单的隧道。如果您不想手动输入它们,可以在 ftp.linuxjournal.com/pub/lj/listings/issue112/6675.tgz 找到列表。将 vtund-server.conf 保存到办公室机器上的 /usr/local/etc/,并将 vtund-client.conf 保存到家庭机器上的 /usr/local/etc/。在配置文件就位后,在每台机器上启动 VTun 进程。以 root 身份,在办公室桌面上启动服务器

vtund -f /usr/local/etc/vtund-server.conf -s

-s 选项告诉 vtund 作为服务器运行,侦听端口 5000 上的连接。

要访问服务器,您必须能够访问办公室机器上的端口 5000。回想一下,为了本示例的目的,办公室只能通过 SSH 访问,因此您必须使用 OpenSSH 的端口转发机制从办公室机器隧道传输端口 5000。

ssh mydesktop.work.com -L 5000:localhost:5000

-L 选项告诉 OpenSSH 将家庭机器上的端口 5000 转发到办公室桌面上的端口 5000。然后,对家庭机器上端口 5000 的连接通过 SSH 透明地隧道传输到办公室机器上的端口 5000。此配置还具有加密所有 VPN 流量的额外好处。

现在可以从家庭桌面访问办公室机器上运行的服务器,剩下的就是启动客户端。以家庭桌面上的 root 身份,运行

vtund -f /usr/local/etc/vtund-client.conf
↪my_tunnel localhost

my_tunnel 参数告诉客户端和服务器正在创建什么隧道。两个系统都查询各自的配置文件并运行 my_tunnel 节的 up 块中的命令。最后一个参数 localhost 指定 VTun 服务器的主机名。在这种情况下,VTun 服务器是 localhost,因为您将端口 5000 从家庭机器转发到办公室桌面。

如果隧道创建成功,运行ifconfig在每台机器上都应该列出一个 tun0 接口。然后,家庭机器在 tun0 上具有 IP 地址 10.3.0.1,办公室机器具有 IP 10.3.0.2。借鉴火车站的类比,办公室桌面和家庭桌面之间的轨道已经铺设好,您现在可以通过这条轨道在机器之间路由火车。为了演示这一点,请从您的家庭桌面创建到 10.3.0.2 的 SSH 连接。

使其成为现实

您现在有一个从家庭到办公室的工作隧道。接下来,您需要配置 route 和 iptables,以便将来自家庭的数据包通过工作桌面伪装到办公室 LAN 的其余部分。幸运的是,这就像在客户端和服务器上的配置文件中添加几行并重新启动 vtund 进程一样简单。当连接建立时,VTun 执行相应的 route 和 iptables 命令。

回到火车站的类比,您需要指示家庭桌面站,任何目的地为办公室网络的火车都应通过新创建的 VTun 轨道路由。您可以通过手动运行以下命令来完成此操作

route add -net 192.168.5.0 netmask
↪255.255.255.0 gw 10.3.0.2
route add -net 192.168.100.0 netmask
↪255.255.255.0 gw 10.3.0.

或者,您可以将列表 3 中显示的命令添加到 vtund-client.conf。这些命令指示 iptables 转发来自 tun 接口的所有数据包,并将这些数据包伪装为来自办公室桌面。或者,我们可以将列表 4 中显示的命令添加到 vtund-server.conf 并重新启动服务器。

列表 3. 完整的 vtund-client.conf

options {
   port 5000;

   # Path to various programs
   ifconfig   /sbin/ifconfig;
   firewall   /sbin/iptables;
   route       /sbin/route;
}

# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}

my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol

   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.5.0/24 = actual work network 1
      # 192.168.100.0/24 = actual work network 2
      ifconfig
        "%% 10.3.0.1 pointopoint 10.3.0.2 mtu 1450";
      route "add -net 192.168.5.0 netmask
      ↪255.255.255.0 gw 10.3.0.2";
      route "add -net 192.168.100.0 netmask
      ↪255.255.255.0 gw 10.3.0.2";
   };
   down{
      ifconfig "%% down";
      route "del -net 192.168.5.0 netmask
      ↪255.255.255.0 gw 10.3.0.2";
      route "del -net 192.168.100.0 netmask
      ↪255.255.255.0 gw 10.3.0.2";
   };
}

列表 4. 完整的 vtund-server.conf

options {
   port 5000;

   # Path to various programs
   ifconfig   /sbin/ifconfig;
   firewall   /sbin/iptables;
   route      /sbin/route;
}

# Default session options
default {
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}

my_tunnel {
   pass  XXXXXXXX;    # Password
   type  tun;         # IP tunnel
   proto tcp;         # TCP protocol

   up {
      # 10.3.0.1 = fake tunnel interface (home-end)
      # 10.3.0.2 = fake tunnel interface (work-end)
      # 192.168.1.0/24 = actual home network
      ifconfig
        "%% 10.3.0.2 pointopoint 10.3.0.1 mtu 1450";
      route "add -net 192.168.1.0 netmask
      ↪255.255.255.0 gw 10.3.0.1";
      firewall "-t nat-A POSTROUTING -o %%
      ↪-j MASQUERADE";
      firewall "-AFORWARD -i %% -j ACCEPT";
   };
   down{
      ifconfig "%% down";
      route "del -net 192.168.1.0 netmask
      ↪255.255.255.0 gw 10.3.0.1";
   };
}

一旦配置了 route 和 iptables,您应该可以从您的家庭桌面访问您的整个公司内部网。浏览您的内部 Web 服务器,连接到源代码服务器,并尝试导出图形小部件,例如 xterm。对于所有这些任务,性能应该绰绰有余,并且 SSH 隧道确保所有流量都经过加密,免受窥探。

现在您有了一个工作隧道,您可能希望配置服务器以自动启动。此过程特定于发行版。VTun tarball 包含一组用于不同发行版的 init 脚本,因此您应该查阅 Readme 以确定哪个最适合您。

高级配置

细心的读者可能已经注意到,只有家庭桌面可以访问办公室内部网。来自家庭网络内其他车站的火车目前不会通过家庭桌面站重新路由。我认为这种配置至少在一定程度上更安全,因为它减少了办公室网络在家中受到损害的风险。如果您希望从家庭网络上的其他机器获得连接,只需将相应的 iptables 规则添加到 vtund-client.conf 中的 up 指令即可。我将其留给感兴趣的读者作为练习。

如果您可以通过 SSH 连接到办公室网络上的任何机器,则上述配置可以完美工作。不幸的是,许多办公室不提供任何开放的入站端口。这正是我在新工作中遇到的情况,但 VTun 的灵活性使我能够克服甚至这个障碍。解决方案是反转配置,使用办公室桌面作为 VTun 客户端,并从办公室内部发起 SSH 隧道。

为了使此解决方案有效,我们必须能够从办公室内部访问我们的家庭机器。但是,大多数宽带连接都具有动态 IP 地址。我们可以通过使用专为动态 IP 定制的 DNS 服务来规避此问题,例如 DynDNS.org 提供的服务。

这种方法的最大缺点是其相对脆弱性。在安全设置中,客户端不会自动启动,因为 SSH 连接需要身份验证,如果办公室机器因电源中断而宕机,您将被排除在外。如果您不太担心安全性,可以使用无密码短语或 expect 脚本的 SSH 公钥身份验证来自动化登录。我不鼓励任何一种方法。

如果您的办公室机器在 UPS 上,您很少会遇到这个问题。在使用此设置的六个月中,只有一次电源中断持续足够长的时间来杀死我的 VPN 的客户端。此设置在家庭网络端也很健壮。您可以将您的机器脱机数天,并且一旦您启动 vtun 服务器,VPN 就会重新初始化,这要归功于客户端中智能的 keepalive 和重试功能。

结论

希望您现在已经了解了 VTun VPN 的多功能性和强大功能,并掌握了为自己设置一个 VTun VPN 的技术诀窍。不幸的是,对 VTun 功能集的全面讨论远远超出了本文的范围。除了上面描述的基本设置之外,VTun 还允许对 IP 以外的协议进行 Ethernet、PPP 或 SLIP 隧道传输。VTun 还为加密、压缩和带宽整形提供原生支持,因此它适用于每种可以想象的连接场景。VTun 属于每个网络用户的工具包,并且值得与 OpenSSH、rsync 和 screen 等突破性应用程序一起提及。

致谢

非常感谢 Jennifer Edwards 和 James Manning 审阅本文。

资源

Ryan 的 VTun 信息页:www.ryanbreen.com/vtun

通用 TUN/TAP 驱动程序主页:vtun.sourceforge.net/tun

VTun 主页:vtun.sourceforge.net

Ryan Breen (ryan@ryanbreen.com) 是杜克大学 2000 年的毕业生,拥有计算机科学和经济学学位。他目前与交往三年的女友和养了两年半的狗住在波士顿。在工作中,他构建高吞吐量浏览器模拟,是一位忠实的 KDE 用户,并且偶尔也是 KDE 开发人员。

加载 Disqus 评论