了解 OpenVPN
如果您的公司有经常出差的员工,例如销售或技术人员,VPN 是一种让他们访问公司网络数据的良好方法。市面上有许多不同的 VPN 解决方案可以购买,但也有许多是免费的。在这里,我只讨论您可以自行设置而无需购买商业 VPN 产品的解决方案。
用于更复杂任务的主要 VPN 解决方案是 IPsec;有些人使用 PPTP。虽然 PPTP 可用,但过去曾出现过 安全漏洞,并且它根本无法与 IPsec 相提并论。
如果不是因为 Windows 客户端实现的缺陷,隧道模式下的 IPsec 会是一个更好的解决方案:Windows XP/2000 客户端在不使用 L2TP 的情况下无法使用隧道模式下的 IPsec。L2TP 在安全性方面没有问题,但它会增加延迟(因为需要 PPP 和 L2TP 进程)并增加数据包开销,从而减慢连接速度。开源服务器在 L2TP 方面还没有太多经验,因此目前使用开源方案来实现 L2TP 存在问题。
纯 IPsec 的一个缺点是它出了名的复杂性:很多事情都可能出错。因此,OpenVPN 应运而生,它是一个基于 SSL 的成熟的开源 VPN 解决方案。OpenVPN 提供与隧道模式下的 IPsec 相同的功能;您可以通过它隧道化整个网络。在本文中,我将重点介绍如何使用 OpenVPN 作为移动办公人员的 VPN 解决方案。
每种 VPN 方法都有其优缺点列表。OpenVPN 的优点包括:
与隧道模式下的 IPsec 相同的功能:您可以隧道化整个网络(IP 隧道或桥接隧道)。
Windows XP/2000 提供带有 GUI 的 install.exe 文件,用于启动隧道。配置文件是基于文本的。
OpenVPN 服务器可以将路由、DNS 服务器 IP 地址和其他配置详细信息推送给客户端。这使得 OpenVPN 非常适合移动办公人员的设置,因为您可以修改设置而无需接触远处的笔记本电脑。
您可以使用桥接或路由设置。
服务器/客户端代码是相同的:配置决定角色。
SSL 是安全协议中最可靠的协议之一,如果您需要,可以使用 RSA 公钥加密。有关其安全设置的更多信息,请参阅 本文。
OpenVPN 在金钱方面不花费您任何东西——您只需要一台服务器、一个互联网连接和技术知识。
所有加密过程都在用户空间中处理,这意味着它易于安装——比 IPsec 复杂得多。
缺点列表包括:
该设置使用 TUN/TAP 设备。当出现问题时,这可能会使问题变得复杂。如果 Microsoft 更改其代码,它也可能会直接崩溃。
OpenVPN 进程在用户空间中执行,因此相对较慢。TUN/TAP 设备与用户空间进程结合在一起,创建了一个设置,其中流量必须相对频繁地跨越用户空间/内核边界。这种设置可能会在连接上产生较高的延迟。
存在数据包开销,因为 IP/以太网被封装在 SSL 中,而 SSL 又被封装在 UDP/TCP 中。
最新版本的 OpenVPN 是 beta 版;早期版本有更多缺点。
当出现问题时,您可以联系谁?一些公司希望付费获得支持。
考虑到这些论点,如果您正在设置 VPN,OpenVPN 应该是一个认真的选择。只有花钱才能获得体面 VPN 的日子肯定已经结束了。
本文的其余部分是关于使用路由(而非桥接)和 TUN 设备设置移动办公人员场景的指南。其目的是确保互联网上的笔记本电脑可以安全地连接到公司网络,使用内部服务器和数据。
我在撰写本文时参考的基本操作指南可以在 这里 找到。这是一个关于在 Linux SME 服务器 上以桥接模式设置 OpenVPN 的操作指南。我的设置略有不同,因为我不使用桥接设置。另一个好的来源是 OpenVPN 操作指南。
安全设置
任何人在设置 VPN 时不考虑面临的不同类型的安全风险都是愚蠢的。因此,您应该从考虑安全问题开始任何 VPN 设置。
连接安全
通过互联网传输的 OpenVPN 流量受到 TLS 的保护。这里的设置使用公钥交换;计算机身份验证通过基于 RSA 的公钥/私钥对(公钥也称为证书)完成。在此设置中,我们制作自己的根证书;也就是说,对于我们的 VPN 方案,我们就是我们自己的 Verisign,可以这么说。我们是此信任网络的根。我们创建一个服务器密钥对和多个客户端密钥对。我们使用自己的根证书对它们进行签名。此设置是 OpenVPN 的基本密码学设计。
SSL/TLS 连接是使用这些密钥建立的。身份验证完成后,使用 Diffie-Hellmann 加密 交换密钥以建立连接。每小时协商新密钥,使用完全正向保密 (PFS)——下一个使用的密钥不是通过使用前一个密钥派生的。默认情况下,连接使用 128 位 Blowfish 密码块链接模式,带有 SHA1 消息摘要。
服务器安全
OpenVPN 服务器本身当然可能会受到攻击。您可以通过以下方式最大限度地降低这种风险:
使用共享密钥和tls-auth选项在公钥交换发生之前。这样做可以防止人们利用 SSL 设置,如果这有可能的话。
设置选项user nobody和group nobody。这确保服务器不以 root 身份运行。您也可以使用 chroot 监狱。
在 DMZ 中使用单独的服务器。这样,成功的黑客攻击会被防火墙减慢速度,因为防火墙保护内部网络免受 DMZ 的攻击。可以在防火墙日志中注意到奇怪的连接。
通过在 OpenVPN 服务器上使用 iptables 防火墙规则,防止来自隧道主机的流量进入服务器,以及来自互联网的所有流量,除了需要的 UDP 流量。
用户身份验证
客户端笔记本电脑的安全设置至关重要。如果您的移动办公人员正在使用笔记本电脑并且可以访问您公司的网络,那么您的数据将来可能会公开。无论 SSL 加密有多好,这都是一个单独的风险。如果笔记本电脑可以通过 OpenVPN 隧道直接连接到您的网络,您就遇到了问题。为避免这种情况,您需要建立对笔记本电脑或 SSL 密钥的用户身份验证。
有很多方法可以进行此身份验证。您可以对客户端的 SSL 密钥进行密码保护,这是推荐的做法。但是,如果员工有在笔记本电脑附近写下密码的习惯,则密码保护是不够的。一种选择是获取带有 PIN 码的基于 USB 的 iKey,其中包含客户端密钥。PIN 码更容易记住,因此写下它们的需求更小。当然,iKey 应该放在钥匙链上,而不是笔记本电脑本身上。您应该建立 AUP(可接受用户策略)以确保所有用户都理解这一点。这样做可以防止被盗的笔记本电脑变成灾难。此外,您可以在笔记本电脑上使用加密的文件系统。
另一种选择是设置您自己的自定义身份验证方案。例如,您可以使用带有硬件令牌的强身份验证,并结合 Kerberos 服务器。OpenVPN 具有执行此操作的脚本挂钩。您也可以使用服务器密码文件。
网络设置
我的配置文件旨在实现的网络设置如下:
OpenVPN 服务器位于 65.66.45.x。
客户端位于互联网上的某个位置。
客户端/服务器 P2P 网络是 192.168.100.0/24,或者更确切地说,是该网络中的 /32 网络。
OpenVPN 服务器后面的公司网络是 172.16.1.0/24。
因此,该公司的内部邮件服务器可能位于 172.16.1.3,DC 位于 172.16.1.5,文件服务器位于 172.16.1.6。示意图如下所示
CLIENT -> [modem/adsl-router] -> Internet <-UDP-> OpenVPNserver CLIENT - TUNInterFace <=tunnel=> TUNInterFace ==> Internal network CLIENT - 192.168.100.6 <=======> 192.168.100.5 <==> 172.16.1.0
我正在使用 Linux SME 服务器,它基本上是一个 Red Hat 系统,精简到文件/打印机/防火墙/电子邮件服务器所需的功能,带有一个基于 Perl/HTTP 的配置面板。在成为一个有问题的开源项目一段时间后,Linux SME 服务器正在由 Lycoris 进一步开发。我已经使用 Linux SME 服务器多年,只有在被迫的情况下才会迁移——它非常易于使用。
安装 OpenVPN 很简单。在 Linux 服务器端,您必须安装一到两个 RPM 包。在 SME 上,这些 RPM 包是 lzo.xxx.rpm 和 openvpn-2.0_beta17-1.i386.rpm。大多数系统已经包含 lzo。您的内核应包含 TUN 设备,大多数内核都包含。如果您运行openvpn从 /usr/sbin/openvpn 运行,您应该会找到一个 TUN 设备。使用我们将要使用的设置,它具有 P2P 连接。
我的机器上的配置文件保存在 /etc/openvpn/server.conf,但您的配置文件可能存储在其他位置。我的服务器配置文件如下面的输出所示;请参阅 man page 以了解所有项目引用的内容以及它们的含义)
###OpenVPN server config routing TUN setup######## port 1194 dev tun tls-server mode server dh dh1024.pem ca ca.crt cert SERVER.crt key SERVER.key duplicate-cn ifconfig 192.168.100.1 192.168.100.2 ifconfig-pool 192.168.100.5 192.168.100.200 # IP range clients mtu-test tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 #keep tunnel open by ping push "ping 10" push "ping-restart 60" ping 10 ping-restart 120 #route to be established on the server route-up "route delete -net 192.168.100.0/24" route-up "route add -net 192.168.100.0/24 tun0" #route to push to clients push "route 172.16.1.0 255.255.255.0" #route to company network push "dhcp-option DOMAIN hansceess.net" #push the DNS domain suffix push "dhcp-option DNS 172.16.1.7" #push DNS entries to client push "route 192.168.100.1" # add route to protected network comp-lzo status-version 2 status openvpn-status.log verb 5 ####################### end server config ##############
在 Windows 客户端端,您应该下载 Windows 安装程序并运行它。普通安装程序可在 OpenVPN 网站 上找到,而 GUI 版本可在 此处 找到。我建议使用后者:它为您提供一个托盘图标,您可以使用该图标启动 OpenVPN 服务。在“设置”下的“网络连接”窗口中,您应该找到一个 tap win32 适配器。当您键入以下内容时,您还应该在路由表中看到该适配器route print在 DOSBox 中。
安装程序安装完所有内容后,您应该将 D:/Program Files/OpenVPN/config/*.ovpn 中的配置设置调整为您想要的设置。您可能还需要调整您的个人防火墙,如果它看到了接口——我的防火墙没有看到。我调整后的设置文件如下所示
####################client.ovpn###### port 1194 #udp by default dev tun ##remote is the openvpn-server remote 65.66.45.x tls-client ca ca.crt cert CLIENT.crt key CLIENT.key mtu-test tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 pull #ip-win32 ipapi|manual|dynamic|netsh (see man page, use #when ip address on interface does not appear, but dhcp server #is visible in ipconfig /all) #ip-win32 ipapi comp-lzo verb 4 ##############################end########
客户端上的 OpenVPN 进程是一个 Windows 服务,如果您愿意,可以使用脚本或 GUI 启动它。TAP 设备(在 tun 模式下)可以像任何接口一样进行 tcpdump,这在进行故障排除时非常方便。其余配置来自服务器。
您可以像为 OpenSSL 制作密钥一样为 OpenVPN 制作密钥。但是对于那些喜欢舒适的人来说,OpenVPN 有一组简单的 RSA 脚本来帮助您。您首先必须编辑密钥的 vars 文件中的一些变量:服务器/客户端密钥的名称、您的公司名称、电子邮件等等。接下来,运行./build-ca构建您的根私钥。然后,运行./build-key server构建服务器密钥对。使用以下命令构建客户端密钥:./build-key client。在此客户端步骤中,您可以在密钥中添加密码短语以进行密钥身份验证,如上所述。最后,您必须运行./build-dh生成服务器需要的 Diffie-Hellmann .pem 文件。此文件包含一个大的素数和另一个参数(有关详细信息,请参阅 本文)。使用这些数字,服务器可以快速生成新密钥,默认情况下,对于持久连接,服务器每小时执行一次此操作。
您还需要将服务器密钥、根证书和 *.pem 文件复制到 /openvpn。客户端需要客户端密钥和根证书。这些应该通过安全介质传输,例如 winscp。
还有一件事要做:在服务器上获取防火墙 iptables 规则。我添加的规则是
# internet interface eth1 let OpenVPN udp port in /sbin/iptables --append INPUT -p udp --dport 1194 -m state --state NEW -i eth1 -j ACCEPT #block anything into the server from tun interface /sbin/iptables --append INPUT -i tun0 -j DROP #tun0 debugging #/sbin/iptables --append INPUT -i tun0 -j LOG --log-prefix tun0-input #/sbin/iptables --append OUTPUT -o tun0 -j LOG --log-prefix tun0-output #/sbin/iptables --append FORWARD -i tun0 -j LOG --log-prefix Forward-ComingFrom-Tunnel #/sbin/iptables --append FORWARD -o tun0 -j LOG --log-prefix Forward-OutTo-Tunnel #OpenVPN Forward chain: if you have a Tun-device, the forward chain #screens traffic from networks/hosts outside the tunnel, going to #internal networks and back. we want this traffic to go through, #default but first we might want to block some things: remember, the #other side of the tunnel is not safe by default: he could be routing #so we should log syns at least coming in /sbin/iptables --append FORWARD -i tun0 -m state --state NEW --jump LOG --log-prefix Tunnel_into_intranet #you should know the networks allowed in and out through the tunnel #let client network in. /sbin/iptables --append FORWARD -i tun0 --source 192.168.0.0/16 -j ACCEPT #let company network out /sbin/iptables --append FORWARD -o tun0 --source 172.16.0.0/16 -j ACCEPT ##troubleshoot: let all through # /sbin/iptables --append FORWARD -i tun0 -j ACCEPT # /sbin/iptables --append FORWARD -o tun0 -j ACCEPT #you might want to allow some, but not all # /sbin/iptables --append FORWARD -i tun0 -p tcp --dport 25 -j ACCEPT ##drop the rest /sbin/iptables --append FORWARD -i tun0 -j DROP /sbin/iptables --append FORWARD -o tun+ -j DROP
安装 OpenVPN 后,就该进行测试了。确保服务器进程已使用以下命令启动service openvpn [re]start。您应该使用 ifconfig 查看 TUN 设备。使用我的配置,它显示
Link: encap:Point-to-Point Protocol Inet addr:192.168.100.1 P-t-P 192.168.100.2.
现在,启动客户端 OpenVPN 服务。在 D:/Program Files/Openvpn/*.log 中找到的文件包含调试信息。使用verb设置,您可以详细说明日志记录。当您启动客户端服务时,托盘中的图标会显示已连接。Ipconfig /all在 DOSBox 中显示 tap 接口上的 IP 地址,例如 192.168.100.10
Ethernet adapter Local Area Connection 8: Connection-specific DNS Suffix . : Description . . . . . . . . . . . : TAP-Win32 Adapter V8 Physical Address. . . . . . . . . : 00-FF-CF-10-9F-A6 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IP Address. . . . . . . . . . . . : 192.168.100.10 Subnet Mask . . . . . . . . . . . : 255.255.255.252 Default Gateway . . . . . . . . . : DHCP Server . . . . . . . . . . . : 192.168.100.5
print route为您提供一些路由
192.168.100.1 255.255.255.255 192.168.100.9 4 1 192.168.100.8 255.255.255.252 192.168.100.10 4 1 192.168.100.10 255.255.255.255 127.0.0.1 127.0.0.1 1 192.168.100.255 255.255.255.255 192.168.100.10 4
虽然这一切看起来可能很奇怪,但它确实有效。您现在可以 ping 192.168.100.1;如果成功,则隧道正常。在服务器上,您可以使用以下命令查看传入的 pingtcpdump -nlpi tun0。此外,tail -f /var/log/messages提供一些信息。
服务器上的路由看起来像这样(netstat -rn)内核 IP 路由表
Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.100.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 65.66.45.2 0.0.0.0 255.255.255.0 U 0 0 0 eth1 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 65.66.45.1 0.0.0.0 UG 0 0 0 eth1
如果一切顺利,您的连接应该在那里。如果不是,请检查服务器路由表并使用 tcpdump 抓包 TUN 接口。您还可以使用 iptables 调试规则。
在本文中,我展示了一个简单的 OpenVPN 设置。在现实生活中,设置不会复杂太多。虽然任何 VPN 的安全影响都应经过深思熟虑,但设置 OpenVPN 实际上非常容易。如果您遇到麻烦,可以在邮件列表中找到很多帮助。
OpenVPN 是一款严肃的 VPN 产品。它可以在许多方面与 IPsec 相媲美。它当然很便宜——试试购买一台 Cisco 集中器——易于安装,并且按照开源传统,可以进行调整。
如果 OpenVPN 有缺点,那可能是延迟。但是,目前还没有实际数据来支持这种说法。
Hans-Cees Speel (hanscees@hanscees.com) 是 Tunix 防火墙支持 的安全顾问。他利用业余时间为 北欧树木 构建 Web 指南。