SDB:VPN 配置
前期准备
常见的 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)」保存。
把配置文件以 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)」来新建一个钱包。
- 确定
图形界面
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 类型。
- 要是没有用户密码的话,「连接类型(Connection Type)」就选择 「X.509 认证(X.509 Certificates)」。我只在私人架设的 VPN 上看到过这种选法。比较少见。
- 要是只有 .ca 服务器认证文件和用户名密码,就选择 「密码(Password)」。部分国内 VPN 是这种选法。
- 要是既有 .ca 服务器认证文件,.crt 用户认证文件,.key 用户金钥,也有用户名和密码,就选 「带密码的 X.509 认证(X.509 With Password)。专业的国内 VPN 是这种选法。
最后一种最难,因此以它为例。如下图所示:
- 根据上面的「准备工作」第三条,系统连接(System Connection)一定要勾选。保存时会提示您输入用户名密码。
- 网关(Gateway)就是前面给出的 .ovpn 配置文件的 remote 行的 IP 地址或网址。
- CA,Certificate 和 Key 照着填。
- Key 密码。由于你不是 Key 的生成者,生成者是 VPN 服务商的自动化程序,在做 openssh 时生成这样的密码是要人工干预的。所以这种密码一般商业的 VPN 都是不会有的。只见于个人在 VPS 上搭建的 OpenVPN。因此请选择「不需要(Not Required)」。
- 用户密码。记得开启 KDE 密钥钱包或 GNOME 钥匙环后选 Store。否则只能使用「总是询问(Always Ask)」。
高级设置
下面我们要配置一些与 OpenVPN 底层协议和设备相关的参数,以使得它正常工作。
- 网关端口(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 的准备工作中的四条。
相比于 OpenVPN,PPTP 的帐号设定要简单得多。只需要填写网关,用户名,密码即可(记得勾选「系统连接(System Connection)」。密码是「存储(Store)」还是「总是询问(Always Ask)的设定和 OpenVPN 完全相同。
接下来的高级设置才是重中之重,不少用户无法成功连接 PPTP VPN 的原因都是在这里。
首先明确 PPTP VPN 是 Windows 视窗操作系统自带支持的虚拟私密网络。因此所有的服务器设定都是非常的以视窗为中心的。这就导致了一些不必要的失败。
所以我们接下来的步骤是使用模拟视窗的协议,来避免错误。
- 认证方式选择 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 流量消耗在最关键的网站上。
当然它也延续了所有 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 钥匙环密码的对话框。
如果您看到如下界面,恭喜您,你成功了!
修复 .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)」。
看吧!支持好多种的 VPN 哦!这里我们选择 OpenVPN。下一步,选择「导入 OpenVPN 配置文件(import openvpn config file)」。
在弹出的对话框中选择你的 .ovpn 配置文件,导入。注意这里比较窘的是默认打开的是 root 根用户的家目录,你要点击左边红色的 root,然后点击 home 才能回到你普通用户的家目录。
如果你的 .ovpn 文件是前面描述过的带密码的那种,你会看到这个页面,输入用户名和密码。下一步。
接下来的「使用连接状态检查(Use connection status check)」和「连接掉线后自动重连(Reconnect after connection lost)」都无需配置,直接下一步。
接下来的「创建新方案后立即连接(Connect After Creating New File)」不要勾选,因为我们还没有对导入的配置进行调整,是肯定会出错的。
VPN 网关一定要设置正确,但如果是导入配置的话,是自动填写上去的。修改一下「方案名称(Profile Name)」和「方案描述(Description)」。下一步,完成。
高级设置
下面我们要进入高级设置,以修改那些默认的却是错误的 KVpnc 配置选项。
首先点击「管理方案(Manage Profiles)」,会默认打开最后一次使用的方案。定位到左边的「认证(Authenticate)」-「证书(Certificates)」。如图配置:
- 证书(Certificate)这里指的是 .crt 认证文件。而不是 .ca 服务器认证文件。
- 下面有三个路径 Path,请注意只有第一个路径 Path 是真正的路径,后面两个都要细化到具体的 .ca 服务器认证文件和 .key 密钥文件。其中 .ca 服务器认证文件如果是导入的 .ovpn 是带了 ca 的,那么就会自动转换成图中的 .pem 格式。
下面定位到「网络-一般(Network - General)」-「NAT」:
- 这里需要注意的是,使用 NAT 桥接(Use NAT)是默认被勾选上的,我们要取消它。不然永远也连接不上。
- 有选择的话,尽量不要使用 UDP 连接,因为前面的那个 Bug 需要手动干预。UDP 连接失败的次数太多了。#FIXME 可以通过外部脚本功能来自动实现杀进程。脚本待我求助高手先。
接着点击连接就好了。
PPTP
PPTP VPN 的设置只能使用手动录入法。首先启动「新方案精灵(New Profile Wizard)」,下一步,连接方式选「Microsoft PPTP」。在接下来的「PPTP 设定(PPTP Settings)」里面勾选「允许 MPPE 状态模式(allow MPPE stateful mode)」。
然后输入用户名和密码,下一步,网络设备,如果是有线就选 eth0, 无线就选 wlan0。
之后一路下一步,一直来到「一般设置(General Settings)」。和 OpenVPN 的一样,方案名和描述随意写,VPN 网关要写对。然后下一步,点击完成。
高级设置
- 取消 NAT
- 使用 MSCHAP 而不是默认的 MSCHAPv2 协议