SDB:VPN 配置

跳转至: 导航, 搜索

Template:Working

本教程教您如何在 openSUSE 下配置并使用 pptp/openvpn 这两种最常见的 VPN(虚拟私密网络)。本文的顺序是从简单到复杂,从最常用的默认 NetworkManager 开始,一直到普通用户最少用的命令行方式。

前期准备

常见的 OpenVPN 类型

国内常见 OpenVPN 主要有以下三种形式:

  • 没有用户名/密码,只有服务器 .ca 认证文件(有时也以 .crt 格式存储),用户的 .crt 认证文件和用户的 .key 密钥文件。
  • 服务器 .ca 认证文件和用户名/密码。
  • 有用户名/密码,也有服务器 .ca 认证文件,用户的 .crt 认证文件和用户的 .key 密钥文件。

服务商一般也会提供一个 .ovpn OpenVPN 配置文件。里面有我们用来配置 NetworkManager 的信息。以下是一个 .ovpn 的复杂例子,以注释加上了一些配置讲解,实际当中远没有这么复杂:

//远程网关地址 + 端口号, NM 设置会用
remote www.google.com.hk 443
//用户名密码认证,NM 不支持这样的 .txt 明文密码文件,因此需要用 Kwallet 来保存它们。
auth-user-pass marguerite.password.txt 
//这是一个客户端配置文件
client
//虚拟设备类型,一般都是 tun,也有 tap。NM 设置会用
dev tun
//端口类型,在 tcp 协议中桥接 VPN,也可以使用 udp。NM 设置会用
//tcp 的好处是你向服务器发送连接请求,服务器也要向你发送接受请求的通知才能成功连接(握手)。
//缺点是必须一直保持这种连接,在无线网络中 VPN 容易断线,也就是容错性不强。
//udp 的好处是你向服务器发送连接请求,如果服务器不向你发送拒绝接受请求的通知,你就认为连接是成功的。
//有一定的容错性,这在应付国内的各种中间人污染导致返回 reset 时非常管用。可以一直保持连接。
//但缺点是容易丢包,也就是服务器不响应你,你也认为是成功的,容易造成网页加载起来不停。
proto tcp
//断线自动重连次数,这个 NM 用不到,有自己的设定。
resolv-retry infinite
nobind
persist-key
persist-tun
//认证文件的校验方式:服务器校验和客户端校验,一般是服务器校验。NM 用不到,默认就是服务器校验。
ns-cert-type server
//lzo 压缩。会减小传输流量。一般的服务器都开启了这个。NM 设置会用
comp-lzo
route-delay 2
route-method exe
//调试日志的输出级别,从 1 到 4
//数字越大,在 /var/log/NetworkManager(root 访问,普通用户打开为空)中的信息就越多。
verb 3

开放防火墙端口

OpenVPN 很难穿透 Linux 防火墙,因此我们需要在防火墙打开 OpenVPN 的端口。

  • 请打开你的 .ovpn 配置文件,从中读取网关(remote)的端口(port)信息,比如 21, 443,和端口类型(proto),比如 tcp/udp。
  • 开启 YaST2, 选择左侧的「安全和用户(Security and Users)」,然后选择「防火墙(Firewall)」。
  • 在新打开的防火墙模块中选择「已允许的服务(Allowed Services)」,然后选择右下角的「高级(Advanced)」。
  • 根据你 .ovpn 配置的端口类型,在 tcp 或 udp 栏中填上相关端口,多个端口号之间以空格(space)分隔。
  • 点击「确定(ok)」保存高级设置,一路点击「下一步(next)」保存。

Yast2-firewall.png Yast2-firewall advanced.png

把配置文件以 root 根用户可读权限保存

因为 OpenVPN 只有 root 根用户权限才能进行添加虚拟设备等操作,所以如果我们的配置文件放在一个 root 根用户无法访问到的目录,比如 drwx------ Dropbox 这样的权限 root 根用户就无法访问,因此需要

sudo chmod 755 Dropbox 

来更改相应目录的权限和 .ovpn/.ca/.crt/.key 文件本身的权限。一般文件夹只要不是调整过权限的都可以被 root 根用户访问,我们更需要注意的是这些配置文件本身的读取权限。

VPN 连接必须是系统连接

如(二)中所说,普通用户是无法添加网络设备的,我们如果建立了普通用户的网络连接,那它只能使用系统默认的 eth0 有线和 wlan0 无线连接,这对大多数 VPN 来说都是不够的。

因此在使用 NetworkManager 创建 VPN 连接时一定要注意 KDE 前端「勾选上“系统连接(System Connection)”」或 GNOME 前端「不要共享给普通用户」。

对有用户密码的 VPN 连接,开启 Kwallet KDE 密钥钱包 或 GNOME Keyring 钥匙环

KDE 密钥钱包/GNOME 钥匙环主要用来存储 NetworkManager 中的明文密码。

可以选择不开启,那样在配置 NM 时就不能选择「存储密码」,而要选择「总是询问」,因为没有 KDE 密钥钱包/GNOME 钥匙环,NetworkManager 完全不知道把密码存储到哪儿,只能忽略掉。这样没有密码连接是必然失败的。

  • 点击「应用程序菜单」,搜索「Kwallet」。
  • 点击 「Kwallet」而不是「KwalletManager」,前者是 KDE 密钥钱包的设定,后者是浏览钱包内存储的密码,完全打不开。正确打开后者的方法是找到系统托盘上的「KDE Wallet Manager」,双击。
  • 在设置页面勾选「启用 KDE 密钥钱包子系统(Enable the KDE Wallet subsystem)」,在下面选择一个默认使用的钱包,默认下拉菜单为空,可以点击「新建(New)」来新建一个钱包。
  • 确定

Kwallet-configuration.png

图形界面

NetworkManager (NM)

KDE 前端

KDE 的 NetworkManager 前端是以一个 Plasmoid(等离子体,Plasma Desktop 又叫等离子桌面,等离子体就是等离子桌面的小挂件的意思)的形式存在的。

在没有该前端的年代,openSUSE 使用的是自己开发的 KNetworkManager 前端,该前端目前已停止开发并不再与 openSUSE 11.4 及以后版本的默认 KDE 版本兼容,因此不在我们教程范围之内。但两者的界面差不多,配置选项也都差不多。

KDE 的 NetworkManager 前端的 import 导入功能不像 GNOME 前端那么强。因此我们以下的教学主要以手工录入的形式讲解。

OpenVPN

  • 首先右键点击桌面右下角的 NetworkManager 图标,选择「网络管理设置(Network Management Settings)」。然后选择「添加(Add)」并选择 VPN 类型。

NetworkManagement-Plasmoid-addVPN.png

  • 要是没有用户密码的话,「连接类型(Connection Type)」就选择 「X.509 认证(X.509 Certificates)」。我只在私人架设的 VPN 上看到过这种选法。比较少见。
  • 要是只有 .ca 服务器认证文件和用户名密码,就选择 「密码(Password)」。部分国内 VPN 是这种选法。
  • 要是既有 .ca 服务器认证文件,.crt 用户认证文件,.key 用户金钥,也有用户名和密码,就选 「带密码的 X.509 认证(X.509 With Password)。专业的国内 VPN 是这种选法。

最后一种最难,因此以它为例。如下图所示:

NetworkManagement-Plasmoid-configureVPN.png

  • 根据上面的「准备工作」第三条,系统连接(System Connection)一定要勾选。保存时会提示您输入用户名密码。
那些配置了指纹识别的用户,不要忘记输入密码点击确定后,验证您的手指。Kdesu 程序目前缺少这个界面。很多人不知道,于是就坐等验证超时,无法保存。
  • 网关(Gateway)就是前面给出的 .ovpn 配置文件的 remote 行的 IP 地址或网址。
  • CA,Certificate 和 Key 照着填。
  • Key 密码。由于你不是 Key 的生成者,生成者是 VPN 服务商的自动化程序,在做 openssh 时生成这样的密码是要人工干预的。所以这种密码一般商业的 VPN 都是不会有的。只见于个人在 VPS 上搭建的 OpenVPN。因此请选择「不需要(Not Required)」。
  • 用户密码。记得开启 KDE 密钥钱包或 GNOME 钥匙环后选 Store。否则只能使用「总是询问(Always Ask)」。
那些选择了「总是询问(Always Ask)」的用户,连接 VPN 时 NetworkManager 会弹窗,有两个密码输入框,请认真确认你填写的是第一个用户密码,第二个 Key 密码留空即可。


高级设置

下面我们要配置一些与 OpenVPN 底层协议和设备相关的参数,以使得它正常工作。

NetworkManagement-Plasmoid-configureVPN1.png

  • 网关端口(Gatewary Port)。就是前面给出的 .ovpn 配置文件的 remote 行后面的端口号。
  • Tunnel MTU。很少用。在 .ovpn 配置文件中对应 MTU 行。没有就选「自动(Automatic)」。
  • 使用 LZO 压缩(Use LZO Compression),一般勾选。对应 .ovpn 中的 comp-lzo。
  • 使用 TCP 协议(Use TCP Connection),对应 .ovpn 中的 proto tcp。要是 udp 就不要勾选。
  • 使用 TAP 设备(Use TAP Device),对应 .ovpn 中的 dev tap。要是 tun 就不要勾选。一般不选。tap 设备非常的少见。
  • 其他用默认,「连接名(Connection Name)」随便选一个。支持中文。

然后点击「确定(OK)」,输入 root 根用户密码,(并验证手指)。

至此,一个可以成功连接的 OpenVPN 就在 KDE 桌面环境中被创建好了。

接着请打开 Konsole 终端模拟器,输入:

su
(输入 root 根用户密码)
//针对 openSUSE 12.1 以上的 Systemd
systemctl try-restart NetworkManager.service
//针对 openSUSE 12.1 以下的 Sysinit
/etc/init.d/NetworkManager try-restart

这样会确保重新加载所有配置。

不成功的话请看最后的「甄错」章节。

Enjoy it!

PPTP

PPTP 依然要遵守上面 OpenVPN 的准备工作中的四条。

NetworkManager-Plasmoid-configurePPTP.png

相比于 OpenVPN,PPTP 的帐号设定要简单得多。只需要填写网关,用户名,密码即可(记得勾选「系统连接(System Connection)」。密码是「存储(Store)」还是「总是询问(Always Ask)的设定和 OpenVPN 完全相同。

接下来的高级设置才是重中之重,不少用户无法成功连接 PPTP VPN 的原因都是在这里。

首先明确 PPTP VPN 是 Windows 视窗操作系统自带支持的虚拟私密网络。因此所有的服务器设定都是非常的以视窗为中心的。这就导致了一些不必要的失败。

有人可能会问,咦?我看好像 PPTP VPN 比 OpenVPN 简单呀。不是这样的。在后面的「命令行」章节你会发现,在命令行中连接 OpenVPN 远比 PPTP 要方便。而且在 LAMP 服务器上搭建 OpenVPN 也比 PPTP VPN 简单得多。

所以我们接下来的步骤是使用模拟视窗的协议,来避免错误。

NetworkManager-Plasmoid-configurePPTP2.png

  • 认证方式选择 MSCHAP 和 MSCHAPv2, 这是视窗使用的 PPTP 认证协议。其他的密码认证协议(PAP),CHAP 协议(要求服务器和用户都知道明文密码,但不在传输中交换,商业 VPN 不可以明文存储用户的密码),扩展认证协议(EAP,完全就是个无线网络协议,哪有服务器用无线网络的。)都不可用。
  • 勾选「MPPE 加密(MPPE encryption)」。这是视窗使用的 VPN 加密协议。
  • 勾选「使用状态加密(use stateful encryption)」。状态加密的意思大概就是说每个发出的包都是用不同的密钥加密的。
  • 压缩(compression)三个,BSD 压缩、抽气压缩和 TCP 头部压缩,全选。BSD 压缩就是我们常说的 bzip2 压缩,tar.bz2; 抽气(deflate)压缩是使用 LZ77 压缩算法的一种无损压缩。三个都是一些压缩算法,都选上。
  • 发送 PPP 回响包(send PPP echo packets)不选。PPP 回响包是使用电话线上网的人才需要的。

这里就不需要 Konsole 重启 NetworkManager 了,因为不需要加载 .ca/.crt/.key 文件。

enjoy it!

GNOME 前端

KVpnc

关于 KVpnc

KVpnc 是 KDE3 黄金时代流传下来的神器,其他的还有 Amarok,K3B,Kenlive 等。有 KDE4 分支。因此在目前的各大发行版上都有提供。

KVpnc 是 Linux 平台上唯一提供所有市面可见的 VPN 的完整支持的程序,包括 IPSEC/L2TP/OpenVPN/PPTP VPN,和它们的各类变种,甚至还有 SSH Tunnel。是中文 Cross Wall 用户的福音。有什么 VPN 问题搞不定的,第一反应就应该是打开 KVpnc 试一试。而且更为关键的是,它比 NetworkManager 强大之处在于:它支持在启动后和停止前运行外部脚本,什么意思呢?也就是说它可以完美支持诸如 chnroutes 这样的项目,让国内连接不走 VPN,以实现 7x24 小时挂机,只把 VPN 流量消耗在最关键的网站上。

当然不是指挂着 VPN 开 BT 下载,脚本和 IPTABLES 防火墙是受得了,VPN 自身受不了会死掉的。

当然它也延续了所有 KDE 程序的「优良」传统,那就是「配置选项太眼花缭乱了」,新手第一眼看到会有死个它看的冲动!但是它提供了非常好用的导入工具,加上一些 Tweak,调教起来还算是不难的。

如何正确启动 KVpnc?

一些原理我们前面有讲过,普通用户没有权限添加或删除虚拟网络设备,因此需要使用 root 根用户启动 KVpnc。因此忘了预安装的 Kvpnc.desktop 桌面文件吧,那是给普通用户的障眼法。但是在 Konsole 中使用 sudo kvpnc 又会返回:

kvpnc: cannot connect to X server 

这是因为 root 用户的 X 窗口管理器并没有启动,而 KVpnc 是一个图形界面的程序。因此正确的启动方法是:在 Konsole 或 GNOME Terminal 里使用:

//KDE
kdesu kvpnc
//GNOME
gnome-sudo kvpnc

会弹出让你输入 root 密码的对话框,之后会弹出让你输入 Kwallet 金钥钱包/GNOME 钥匙环密码的对话框。

KVpnc-login.png

如果您看到如下界面,恭喜您,你成功了!

修复 .desktop 文件

当然,总是这样子启动还有点烦的。我们来修改一下桌面文件让它可以单击启动吧。

打开 /usr/share/applications/kde4/kvpnc.desktop(root 根用户权限),修改

Exec=kvpnc

//KDE
Exec=kdesu kvpnc
//GNOME
Exec=gnome-sudo kvpnc

保存,完成。

之所以没有默认就修好是因为 KVpnc 可以被用在 KDE 和 GNOME 上,所以不知道选哪个。Exec=sudo kvpnc又肯定不能用。

KVpnc 和最新的 OpenVPN 2.2+ 的兼容性解决(--script-security 2 警告)

默认的 OpenVPN 2.2+ 在 KVpnc 中总是会输出这样一条警告:

WARNING: External program may not be called unless '--script-security 2' or higher is enabled. Use '--script-security 3 system' for backward compatibility with 2.1_rc8 and earlier. See --help text or man page for detailed info. 
警告:如果没有启用 '--script-security 2' 或更大的数字,外部程序可能无法被调用。使用 '--script-security 3 system' 以向前兼容 2.1_rc8 和之前的旧版本。详细信息请见 --help 文字或 man 帮助页面。

这主要是用来处理外部脚本的,如果你不使用诸如 chnroutes 这样的项目的话,完全可以忽略它,如果您使用的话,有两种方式可以解决它。

第一种最简单的方法:在您的 .ovpn 配置文件中添加这样一行:

script-security 3 system

第二种方法:创建一个封装脚本来带参数启动 OpenVPN,在 KVpnc 的设置中把 Daemon 设置为这个封装脚本。脚本内容为:

#!/bin/sh
/usr/sbin/openvpn --script-security 2 $@

保存之后,修改权限,并移动到 /usr/sbin

sudo chown root:root 脚本名
sudo chown +x 脚本名 //授予可执行权限
sudo mv 脚本名 /usr/sbin

然后在 KVpnc 的「设定(Settings)」-「设定 KVpnc(Configure KVpnc)」-「守护程序(Daemons)」下拉菜单中找到 OpenVPN,修改 /usr/sbin/openvpn 为 /usr/sbin/脚本名,记得顺手把调试级别(Debug Level)上调到 3. ,以便甄错。

KVpnc 的 Bug

KVpnc 的一个 Bug 就是,断线重连有时候会提示你「端口已占用」。这是因为它没能杀死失败的 VPN 进程。需要你手动:

sudo ps -A |grep vpn

找出连接的进程号,使用:

sudo kill -9 进程号

来杀死它。

这也就告诉了我们在 KVpnc 中尽量避免使用 UDP 连接,而改用连接时间更长的 TCP 连接。

OpenVPN 连接

OpenVPN 有导入法和手动录入法。由于选项太多了,容易把新手说蒙掉,我们使用导入法,然后再来修改一些 KVpnc 默认的却是错误的配置选项,以使得它能够正常工作。

首先点击「新方案精灵(New Profile Wizard)」。默认的 KVpnc 窗口很小,它被藏起来的,拉伸下窗口就能看到。然后点击「下一步(Next)」。

KVpnc-openvpn-0.png

看吧!支持好多种的 VPN 哦!这里我们选择 OpenVPN。下一步,选择「导入 OpenVPN 配置文件(import openvpn config file)」。

KVpnc-openvpn-1.png

在弹出的对话框中选择你的 .ovpn 配置文件,导入。注意这里比较窘的是默认打开的是 root 根用户的家目录,你要点击左边红色的 root,然后点击 home 才能回到你普通用户的家目录。

KVpnc-openvpn-2.png

如果你的 .ovpn 文件是前面描述过的带密码的那种,你会看到这个页面,输入用户名和密码。下一步。

接下来的「使用连接状态检查(Use connection status check)」和「连接掉线后自动重连(Reconnect after connection lost)」都无需配置,直接下一步。

接下来的「创建新方案后立即连接(Connect After Creating New File)」不要勾选,因为我们还没有对导入的配置进行调整,是肯定会出错的。

KVpnc-openvpn-3.png

VPN 网关一定要设置正确,但如果是导入配置的话,是自动填写上去的。修改一下「方案名称(Profile Name)」和「方案描述(Description)」。下一步,完成。

KVpnc-openvpn-4.png

高级设置

下面我们要进入高级设置,以修改那些默认的却是错误的 KVpnc 配置选项。

首先点击「管理方案(Manage Profiles)」,会默认打开最后一次使用的方案。定位到左边的「认证(Authenticate)」-「证书(Certificates)」。如图配置:

KVpnc-openvpn-5.png

  • 证书(Certificate)这里指的是 .crt 认证文件。而不是 .ca 服务器认证文件。
  • 下面有三个路径 Path,请注意只有第一个路径 Path 是真正的路径,后面两个都要细化到具体的 .ca 服务器认证文件和 .key 密钥文件。其中 .ca 服务器认证文件如果是导入的 .ovpn 是带了 ca 的,那么就会自动转换成图中的 .pem 格式。

下面定位到「网络-一般(Network - General)」-「NAT」:

KVpnc-openvpn-6.png

  • 这里需要注意的是,使用 NAT 桥接(Use NAT)是默认被勾选上的,我们要取消它。不然永远也连接不上。
  • 有选择的话,尽量不要使用 UDP 连接,因为前面的那个 Bug 需要手动干预。UDP 连接失败的次数太多了。#FIXME 可以通过外部脚本功能来自动实现杀进程。脚本待我求助高手先。

接着点击连接就好了。

PPTP

注意: 此处略坑爹。保证能连上,但 10 几秒就会断线。不像 NM 那么稳定。还需要进一步研究之。

PPTP VPN 的设置只能使用手动录入法。首先启动「新方案精灵(New Profile Wizard)」,下一步,连接方式选「Microsoft PPTP」。在接下来的「PPTP 设定(PPTP Settings)」里面勾选「允许 MPPE 状态模式(allow MPPE stateful mode)」。

KVpnc-pptp-0.png

然后输入用户名和密码,下一步,网络设备,如果是有线就选 eth0, 无线就选 wlan0。

之后一路下一步,一直来到「一般设置(General Settings)」。和 OpenVPN 的一样,方案名和描述随意写,VPN 网关要写对。然后下一步,点击完成。

KVpnc-pptp-1.png

高级设置

  • 取消 NAT

KVpnc-pptp-2.png

  • 使用 MSCHAP 而不是默认的 MSCHAPv2 协议

KVpnc-pptp-3.png

其他客户端

命令行