最近因为Wifi信号不大稳定,使用Fedora时不得不配置一下PPPoE拨号上网,由此引发了一大堆折腾。说实话,自高中起折腾Linux这么久,越发觉得这个操作系统用作Server确实爽,但是作为桌面系统、生产环境来用的话,体验简直是惨不忍睹。多媒体应用,配置解码器等等各种繁琐;上网娱乐,Chrome支离破碎的GTK显示效果卡得人蛋疼;连编程开发都缺少像VS那样与操作系统深度集成的GUI版IDE环境——用VS调试STL,那效果简直酸爽……总而言之,该用Linux做的开发还是得用,某些库就是要gcc以及glibc系列的编译器和库才能够正确或者说顺利编译完成,你在Win下面搞cygwin或者mingw就是能折腾死你;不然就是对设备的访问就是*nix风格的,或是用到了无法模拟的*nix函数,那你也没办法不是。
转入正题,在Cinnamon桌面环境下的网络设置里面似乎完全没有PPPoE的设置选项,也就意味着想要上网的话必须使用命令行连接。这类操作网络接口的行为一般都需要root权限,这是显然的了。以我现在使用的Fedora20为例,首先在root下使用pppoe-setup命令创建一个有效的配置文件,这个配置文件会被放置在/etc/sysconfig/network-scripts/下面,名称会类似ifcfg-接口名,比如ifcfg-ppp0之类。创建过程基本上是全程有提示的,需要输入网卡接口名,用户名,密码什么的,会问你防火墙规则,这个貌似选0或者1都可以。需要注意的一点就是在提供DNS的时候,如果设置不正确,就会出现能ping通但是无法访问web的情况,而且很诡异的是你指定的DNS并不保存在创建的配置文件里面,天知道放到哪里去了。配置完成以后最好备份一下配置文件,使用pppoe-start命令进行连接,默认会使用新建的那个配置文件进行连接。使用pppoe-status命令则可以查看当前连接的状态。
因为我是使用VPN连接到学院的服务器来上免费网,因此还需要配置好可用的VPN。Cinnamon在这一点上就比较恶心了,尽管你PPPoE已经拨号成功,但是它的网络管理器并不认为你已经连上局域网了,因为不是通过它的处理,也没有向它发送什么提示,从而自然也不会让你连接VPN。这也就是Linux有点令人诟病的地方,虽然Unix哲学崇尚一个程序只做好一件事,并且要做到最好,但是这也从某种程度上导致了程序间的协作变得更为不方便或者说不自然,不像Windows或者Mac那样,所有网络管理就是集中在操作系统层面来运作,根本不需要考虑处理不同协议的程序之间交互的问题,搞得所有东西就都得命令行操作到底,当然这种看法就属于个人私货了。
回到正题,既然无法通过网络管理器来进行PPTP VPN连接,我们就只能通过命令行的方式来完成了。Cinnamon的网络管理器倒是有自己的CLI版本,nmcli——还是用Python实现的,但是这个工具的问题是一样的,它不承认你通过PPPoE建立的网络连接,所以还是不得不换用其他的VPN client。首先:
yum install ppp-2.4.5-33.fc20.x86_64 pptp-setup-1.8.0-1.fc20.x86_64
把需要用于命令行连接的工具给装上,然后使用命令:
pptpsetup --create vpnname --server ip --username test --password test --encrypt --start
来创建一个有效的VPN连接,这个vpnname就是以后用来进行连接的配置文件名,最后的--start参数表示创建这个连接之后立刻发起这个连接。根据服务器配置的不同,可能也不需要这个加密参数--encrypt。这个命令实际上会在/etc/ppp/peers目录下创建配置文件,其内容大体如下面所示(注意这个配置是针对VPN连接的,不是PPPoE拨号):
pty "pptp 121.249.217.158 --nolaunchpppd"
name *
password *
remotename PPTP
而删除配置文件则使用命令:
pptpsetup --delete vpnname
这种使用命令行连接VPN的方式存在一个小问题,就是需要用命令:
route add default dev ppp0
来添加路由表,让默认的流量都经ppp0也就是VPN接口转发之后才能通过VPN上网。为了解决这个烦人的问题,我们修改/etc/ppp/ip-up.local,这个文件按照PPTP的工作原理,会在连接被建立的时候自动被执行,而对于别的Linux发行版,也可能不一定是直接修改这个文件,比如可能是将一个脚本放置在类似ip-up.d这样名称的目录中。总而言之,向这个脚本文件中添加一句:
route add default dev $1
就可以每次在连接建立的时候自动修改路由表了。最后,我们已经建立好了配置文件,还需要的就是以后如何用命令来连接上VPN。软件包ppp-2.4.5-33.fc20.x86_64提供了两个脚本pon和poff来进行连接管理,但奇葩的是,默认情况下这两个脚本既不具有可执行权限,又没有链接到有效的环境变量目录下面。或许为软件打包的人认为这俩脚本就根本不会有人用到吧……总而言之,利用yum whatprovides这个神器命令查询一下,我们会发现这俩东西实际上都放在/usr/share/doc/ppp/scripts/目录下,把它们都加上可执行并链接到/usr/local/bin/下面就好。明明是bash脚本却被扔到了doc里面也是醉了……此外,拨号也可以直接使用pppd命令,语法是pppd call 配置文件名,如果需要断开的话,直接kill掉pppd进程即可,显然是方便了许多。
最后,在先建立了PPPoE连接以后,我们就可以使用pon vpnname和poff vpnname这两个命令来方便地连接以及断开VPN。而通过这么久的折腾,我在Fedora下总算也能插着网线上网了。还是不得不承认,Linux系统的很多地方实在是程序员思维太强实用性差,对用户不够友好。最悲催的是,当我折腾好这些之后,我发现仅仅修改一下路由器上面的PPPoE连接参数,把/etc/ppp/options里面的lcp-echo-failure参数调大一些(这个参数是路由器用来判断丢失多少个包就认为已经断开连接),就使得网络连接稳定多了,也就根本不需要非得插网线来上网了……