红联Linux门户
Linux帮助

如何在Linux上用OpenVPN搭建安全的远程网络架构

发布时间:2015-05-01 11:08:15来源:51CTO作者:布加迪编译

对你在互联网上传送的数据采用一层妥善安全的加密机制,以挫败各种各样的窥视活动,这总归是谨慎的举措;由于我们的政府大量获取每一则信息,此举显得愈发地重要。说到保护在不可信赖的网络上传送的数据,OpenVPN是首要选择。本文将简要介绍一下如何设置OpenVPN,那样即使你出门在外,也可以安全地访问自己的家庭服务器。

先简单地说一说VPN:市面上有许多并非名至实归的商用VPN。它们并不比由SSL保护的网站强一点,因为它们信任所有客户机。真正的VPN(虚拟专用网)通过不可信赖的网络连接两个可信赖的端点设备。你根本无法从随便找到的任何一台电脑登录上去,这是好事,因为你大概也明白这个道理:从一个被感染的主机登录到你的专有网络是件坏事,不管网络连接本身有多么安全。所以,你必须同时配置服务器和客户机。


OpenVPN快速入门

你需要在不同子网上的两台电脑,比如同一个网络上的一台有线电脑和一台无线电脑(或者在Virtualbox中的几个Linux访客系统),你还要知道这两台电脑的IP地址。假设把示例中的这两台电脑分别命名为Studio和Shop。在这两台电脑上都安装OpenVPN。OpenVPN内置在大多数Linux发行版中,所以你可以借助常用的程序包管理器来安装它。本文这个示例适用于Debian、Ubuntu及众多的派生版本:

$ sudo apt-get install openvpn openvpn-blacklist

该命令可安装服务器以及检查已泄密密钥黑名单的一个小程序。你必须安装这个黑名单检查程序!由于从前Debian发行了一款破损版的OpenSSL(参阅http://www.debian.org/security/2008/dsa-1571),该版本OpenSSL有一个破损的随机数生成器,所以用该版本OpenSSL生成的密钥按理说不堪一击,不可信赖。随机数生成器其实并非随机性的,而是可以预测的。这种情况发生于早在2008年的时候,使用过缺陷版OpenSSL的人都理应能够查到并更换安全性差的密钥。尽管这是五年多前的事情,但为了保险起见,还是应该用黑名单检查程序。

现在不妨测试一下,为此在我们的两台电脑之间建立一条未经加密的隧道。首先ping每台电脑,确保它们彼此可以正常联系。然后确保OpenVPN没有在运行,因为我们要开始手动启动它:

$ ps ax|grep openvpn

如果它在运行,就终止它。假设Studio的IP地址是192.168.1.125,Shop的IP地址是192.168.2.125。建立一条从Studio到Shop的未经加密的隧道:

$ sudo openvpn --remote 192.168.2.125 --dev tun0 --ifconfig 10.0.0.1 10.0.0.2

然后,建立一条从Shop到Studio的未经加密的隧道:

$ sudo openvpn --remote 192.168.1.125 --dev tun0 --ifconfig 10.0.0.2 10.0.0.1

你成功建立了连接后,看到诸如此类的信息:

Wed Oct 16 2013 ******* WARNING *******: all encryption and authentication

features disabled -- all data will be tunnelled as cleartext

Wed Oct 16 2013 TUN/TAP device tun0 opened

Wed Oct 16 2013 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0

Wed Oct 16 2013 /sbin/ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2 mtu 1500

Wed Oct 16 2013 UDPv4 link local (bound): [undef]

Wed Oct 16 2013 UDPv4 link remote: [AF_INET]192.168.2.125:1194

Wed Oct 16 2013 Peer Connection Initiated with [AF_INET]192.168.2.125:1194

Wed Oct 16 2013 Initialization Sequence Completed

“Initialization Sequence Completed”(初始化序列已完成)这几个神奇的字眼证明了你的做法正确。你应该可以使用隧道地址来回ping,即ping 10.0.0.1和ping 10.0.0.2。你建立起隧道后,应该可以使用你想使用的任何IP地址,只要没有与现有网络的IP地址重叠就行。想关闭隧道,只要按Ctrl+c组合键。

纯粹为了试着玩,在你的隧道上打开一个SSH会话。图1显示了基于VPN隧道的成功的SSH登录,它还显示了每日消息(Message of the Day):

$ ssh carla@10.0.0.2

如何在Linux上用OpenVPN搭建安全的远程网络架构

图1:基于VPN隧道的成功的SSH会话,以及每日消息。

哇,它成功了!


加密的VPN隧道

这么做很好玩,但要是没有采取加密,毫无意义可言,于是我们将搭建一种简单的静态密钥配置架构。它不如真正的公开密钥基础设施(PKI)来得安全牢固,PKI通常拥有根证书、撤销以及所有诸如此类的机制,但这种静态密钥架构对出门在外时需要访问家庭服务器的那些人来说是一种足够好的解决方案。幸好,OpenVPN有一个命令,可以创建静态密钥,所以建立一个用来存放密钥的文件夹,创建密钥,然后将其设成只有文件拥有者才能读取:

$ sudo mkdir /etc/openvpn/keys/

$ sudo openvpn --genkey --secret /etc/openvpn/keys/static.key

$ sudo chmod 0400 /etc/openvpn/keys/static.key

这是一个明文格式的密钥,你可以在文本编辑器中打开及查看――如果你很好奇的话,还可以将其随意取成想要的名称;你没必要把它取为“static.key”。将该密钥拷贝到两台电脑上――没错,拷贝同一个密钥。它不是私有-公共密钥对,而是一个单一的共享密钥。

现在,我们将为每台电脑创建一些简单而基本的配置文件。(在Debian/Ubuntu等发行版上,没有默认的配置文件,不过在/usr/share/doc/openvpn/中有众多的示例文件。)在我小小的测试环境中,Studio是服务器,Shop是将登录到服务器上的移动笔记本电脑。我的服务器配置文件是/etc/openvpn/studio.conf,这就是它拥有的一切:

# config for Studio

dev tun

ifconfig 10.0.0.1 10.0.0.2

secret /etc/openvpn/keys/static.key

确保只有文件所有者才能读取并写入该文件:

$ sudo chmod 0600 /etc/openvpn/studio.conf

客户机上的配置文件很相似,只不过添加了服务器的IP地址:

# config for Shop

dev tun

ifconfig 10.0.0.2 10.0.0.1

secret /etc/openvpn/keys/static.key

remote 192.168.1.125

请注意ifconfig这一行上你那些IP地址的顺序,因为它们要按照本地地址>远程地址的顺序。现在开启服务器上的OpenVPN,指定服务器配置文件,然后在客户机上进行同样一番操作:

$ sudo openvpn /etc/openvpn/studio.conf

$ sudo openvpn /etc/openvpn/shop.conf

你会看到成功的连接显示同样的“初始化序列已完成”这条消息;你还必须留意没有出现下面这条消息,创建未经加密的隧道时,应该会出现这条消息:

******* WARNING *******: all encryption and authentication features disabled

******* 警告 *******:所有加密和验证特性被禁用


防火墙和动态IP地址

OpenVPN本身配置起来很简单。最麻烦的地方还是在于处理防火墙和动态IP地址。世界上有无数不同的防火墙,所以我觉得你应该事先弄清楚如何安全地访问防火墙。OpenVPN需要端口1194,然后你需要有一条转发规则,可以指向你想访问的那台电脑。

动态IP地址是另一个麻烦的地方。Dyn.com提供了一个成本低廉的方法,它可以管理你的互联网服务提供商(ISP)为你分配的动态IP地址。或者你也可以向ISP付几块钱,获得一个静态地址。

到现在为止,你可以称之为一切进展良好,因为你可以在服务器上手动启动OpenVPN,让它等待你的指令,你可以将笔记本电脑带到外面,随时连接到服务器。不过,我们可以在一些方面加以改进,比如让OpenVPN在服务器上后台运行,使用Network Manager(网络管理器)自动建立连接,而OpenVPN实际操作方面缺少的最主要一项内容是:如何访问你的远程资源。下次我们将着重介绍这方面的内容。

上面我们主要讲了如何在家庭服务器与远程节点(比如笔记本电脑)之间建立一条简单的OpenVPN加密隧道。下面我们将介绍一些改进,比如如何让OpenVPN在后台运行,那样我们没必要手动启动它,使用Network Manager(网络管理器)以便易于连接到我们的远程服务器,以及访问服务。


集成了网络管理器

网络管理器是一款出色的OpenVPN客户程序;只要确保你已安装了network-manager-openvpn这个插件。我们将使用上篇中的示例配置。打开你的网络管理器配置,找到可以建立新VPN连接的窗口。这在KDE和GNOME上看起来不一样,但是你需要的信息却一样。当你开始着手时,需要查看OpenVPN连接类型,比如图2中那样;如果你没有看到这个信息,那么表明缺少这个插件。(以下图形来自GNOME。)

如何在Linux上用OpenVPN搭建安全的远程网络架构

图2:在网络管理器中创建新的OpenVPN客户机配置。

图3显示了主配置屏幕。从上往下分别如下:

·你想为该连接取的任何名称。

·网关是你那台远程服务器的IP地址。

·从下拉菜单选择静态密钥。

·然后使用文件选择器,找到你想要使用的密钥。

·这不是一个单向/双向密钥,所以选择None。

·远程IP地址和本地IP地址是你的虚拟OpenVPN地址,来自/etc/openvpn/foo.conf文件。

·我们没有设定密码。

·可以设置“所有用户可用”或者只有你可用,随你喜欢。

如何在Linux上用OpenVPN搭建安全的远程网络架构

图:3:针对OpenVPN客户机的网络管理器主配置屏幕

保存设置,然后使用网络管理器来进行连接。就是这么容易!现在,你只要点击一下按钮,就可以建立连接和断开连接了(图3)。

如何在Linux上用OpenVPN搭建安全的远程网络架构

图4:点击一下按钮,就可以建立连接和断开连接了。


自动运行OpenVPN

手动启动OpenVPN很简单,但是为了方便起见,你可能想让它在服务器上后台运行,而且在意外重启后继续保持连接。在Debian/Ubuntu/及众多派生发行版上,这一步自动处理:当你安装了OpenVPN后,它可以配置成系统启动时自动启动。所以,安装完毕后,你需要重启,或者使用下面其中一个命令来启动这个后台程序:

$ sudo /etc/init.d/openvpn start

$ sudo service openvpn start

第一个命令是传统方式,第二个命令则使用了service命令。早在之前,service最先出现在红帽Linux中;如果你的发行版在默认情况下没有安装该命令,它很可能潜伏在软件库中,如果你想使用它的话。

Fedora使用了systemd初始化系统,相比之下Ubuntu使用Upstart,而Debian仍使用传统的SysV初始化系统。如果你在/etc/openvpn中有多个OpenVPN配置,可以在systemd中有所选择地启动每一个配置,就像这样:

# systemctl start systemctl start openvpn@studio.service

其中的“studio.service”引用上篇中的示例/etc/openvpn/studio.conf文件。这个调用在重启后并不继续保持,所以它就像是运行openvpn /etc/openvpn/studio.conf,这是我们在上篇中手动启动OpenVPN会话的方式。只要借助chkconfig,就能够让OpenVPN在systemd上后台运行:

# service openvpn start

# chkconfig openvpn on

这应该会以通常的方式让OpenVPN在后台运行,它作为一种整体式的后台程序,而不是按照/etc/openvpn/中的.conf文件单独配置。systemd支持chkconfig命令和service命令,所以这应该能行。不过,使用systemd的发行版其情况很不一样,所以如果你的发行版不一样,请留言告知我们。


加强你的连接

OpenVPN很强大,擅长保持一条持久性连接,哪怕出现在服务中断的情况下。你可以让连接更强大,只要将下面这几行添加到客户机和服务器上的.conf文件:

persist-tun

persist-key

这几行对由于省电和移动而频繁断开连接的笔记本电脑用户大有帮助。


现在怎么办?

鉴于你已设置好了这个架构,该如何处理它呢?如果你习惯于使用OpenSSH用于远程操作,可能会局限于使用SSH的这种心态:能够登录到特定的机器,并运行应用程序。这样不行,而是应该把OpenVPN看成是虚拟以太网连线,通向你的服务器或以太网,它们都采用了一层牢固的加密机制。现在你可以通过同一条隧道运行未经加密的服务和加密的服务,只要在防火墙中开一个口就行。

所以,你可以通过你的OpenVPN隧道按以前的方式来运行SSH,还可以进行远程管理,运行应用程序。你可以访问网络资源,比如文件共享区和Web应用程序。你可以迫使客户机上的所有网络信息都通过你的VPN隧道来进行传送,但是就本文而言,我认为你希望能够使用你的原生网络和VPN网络。

所以,如果你使用可信赖的笔记本电脑,就可以上网冲浪,运行SSH,在你连接的任何网络上处理想做的任何事情。之后,当你想在OpenVPN隧道上运行某个程序,就可以打开它,并指定IP地址,就像这样:

$ ssh carla@10.0.0.1

Web应用程序很容易:将Web浏览器指定你的OpenVPN服务器的虚拟IP地址,按平常那样登录。比如说,我运行各种Web服务,以便在家庭服务器上进行测试。所以,我可以访问http://10.0.0.1/drupal处的Drupal,可以访问http://10.0.0.1/owncloud处的OwnCloud。我使用了很棒的gFTP图形化FTP客户程序,所以如果我想要连接,只需要Host(主机)这一行上的虚拟IP地址、用户名和密码。或者使用这个命令行:

$ ftp 10.0.0.1 21

你可以远程管理自己的MySQL数据库,只要使用你自己的用户名和密码:

$ mysql -h 10.0.0.1 -u admin –p

所以,你需要知道的主要是,如何将主机规格添加到你想运行的任何命令上。

很显然,要是借助名称服务,而不是非得使用IP地址,这一切会来得更容易,所以下一回我们将学习如何在OpenVPN中实施名称服务。同时,请尽情享用你那条又棒又安全的OpenVPN隧道。


相关文章:
Linux上如何通过OpenVPN建立安全的远程连接:http://www.linuxdiyf.com/linux/11518.html

Ubuntu Server 14.04搭建OpenVPN服务器保护你的隐私生活:http://www.linuxdiyf.com/linux/10473.html

CentOS6.3下OpenVPN的搭建及相关配置详解:http://www.linuxdiyf.com/linux/10236.html