HowtoVPN

前段时间重装系统时发现wiki打不开了,为防以后还遇到这种情况,在这儿留个HowtoVPN的备份。
wiki: HowtoVPN (2007-07-04 10:44:57由pluskid编辑)

Debian 系统

内核选项

如果不是自己编译的内核,2.6 及以上的内核默认情况下都是可以的。如果是自 己编译内核,要注意两个几个选项要加上:

  • PPP [=m]
  • PPP_ASYNC [=m]
  • UNIX98_PTYS [=y]

l2tpd

安装

首先检查内核是否编译了Unix TTY支持,使用命令

如果看到一堆tty文件,那么说明系统编译了tty支持,这样可以使用Debian系统的l2tpd

如果没有看到tty文件,说明系统不支持tty,必须使用kghost修改过的l2tpd

如果需要kghost修改过的l2tpd,可以在 kghost@88 的 cvs 里面下载到他修改过的 l2tpd 的源代码进行编译:

编译好的 deb 在 Debian-ZJU 的源上有,只需要在 /etc/apt/sources.list 里面加入

然后就可以

直接安装了。但是现在源里面的 l2tpd 在开机连接 vpn 的时候速度非常慢,可以直接去88 FTP下载一个旧一点版本的包安装上:

并阻止它被升级:

或者也可以使用 xl2tpd ,在 Mirror 的 FTP 上可以找到一个在 sid 下编译好的版本,并附带源代码,如果和自己的系统不一样,可以自己编译。注意使用 xl2tpd 的时候配置有一些稍微不一样,例如配置文件在 /etc/xl2tpd/ 下而不是在 /etc/l2tpd 下,另外,在 vpn 脚本里面也需要配置一下 L2TPD_SCRIPTL2TPD_PIPE 这两个参数(详见脚本里面的注释)。

配置

配置文件为 /etc/l2tpd/l2tpd.conf ,配置如下:

其中 name = zealot@a 那里是自己的 vpn 用户名,国内用户是 @a ,教工国际 包月是 @c ,学生国际包月为 @d ,这个在学校的文档里面有说明。

pppoptfile 则用于指定 ppp 配置文件的地址。

ppp

安装

配置

配置文件在 l2tpd 配置里面由 pppoptfile 指定,这里是 /etc/l2tpd/zju.options

然后是密码文件,由于使用 chap 方式验证,密码文件默认放在 /etc/ppp/chap-secrets 里面:

secret 一栏填上自己的 vpn 密码即可,其他的可以用 * 代替。

运行与调试

运行

首先启动 l2tpd

注意这个时候如果看到输出里面有

是正常的,可以直接忽略。

然后发送连接到 vpn 的命令

之后运行一下 ifconfig ,如果看到 ppp0 设备,那么恭喜你成功了!

否则,可能需要调试了。

调试

在 l2tpd 的配置文件中加入打开调试的选项

停止先前启动的 l2tpd

再以非 daemon 方式启动之

然后在另外一个控制台向 l2tpd 发送命令

之后 l2tpd 的控制台上会输出一堆东西,pppd 的调试信息会输出到 /var/log/syslog ,另外, /var/log/debug 可能也会有一些东西。靠这些东 西,多 man 几次,多 google 几次,能否解决问题就靠实力了。

路由配置

要让校内的网络资源仍然通过原先的路由,而校外资源则通过 vpn ,需要配置 一下路由。连接到 vpn 以后,用 ip route 查看当前路由(如果没有 ip 命令,它在 iproute 包中,apt-get install iproute 就可以了。)

可以看出默认路由是通过网关,而不是 vpn ,我们希望 10.* 、 210.32.* 和 222.205.* 使用默认路由

注意 222.205.9.1 要替换成你刚才 ip route 所看到的 default 一句里面的那 个地址。

然后删除原来的默认路由

注意不要先删除默认路由再设置 10.* 的路由,因为 vpn 服务器在 10.* 网段,删 除默认路由将直接导致 vpn 断开。

设置其他地址使用 vpn ,地址可以通过 ifconfig 查看

就是 P-t-P 那里的地址,这里是 222.205.64.1 ,然后设置新的默认路由

这样 vpn 就配置完毕可以使用了。

自动化

新版本的 vpn 脚本

原来的 vpn 脚本有几个问题,这里重新写了一个版本,试图解决原来的一些问题:

  1. 重新登录的时候设置路由错误,主要是由于前面已经设置过一遍路由了,忽略即可
  2. 刚开机的时候 ppp driver 启动比较慢,所以把 vpn 脚本加入到系统启动脚本(例如 /etc/rc.local)里面去 vpn 仍然启动不起来,我增加了 TIMEOUT 和重试次数,测试了下是可以成功登录 vpn 的。
  3. 增加了一些测试让脚本更健壮一点,并改进了界面反馈信息。

新的脚本在这里,保存为 vpn.sh ,然后添加可执行权限 chmod +x vpn.sh ,之后直接执行就可以连接 vpn : ./vpn.sh ,加参数 -r 表示重新连接, -h 显示帮助信息。

注意:

如果已经设置了中文环境的话,将function setup_route中的P-t-P改成“点对点”,具体见下面.

以前的 vpn 脚本

前面的 l2tpd 和 ppp 配置一次就够了,后面的路由之类的每次连接 vpn 都要 重新配置,非常麻烦,可以用一个脚本来完成。

另外,一个大家都很清楚但是经常被忘记的问题是,连接 vpn 之前要先连接上内网。

P.S.(in ubuntu):

如果 ifconfig 后看不到 ppp0, 可以试试下面:

$ echo "c zju" > /var/run/l2tp-control

这一步之前先改变相关文件的读写权限

其中最后一步最重要(其它的需不需要改我也还没确定。有兴趣可以自己试试) 如果 /var/run/l2tp-control 不存在的话重新启动 l2tpd

改变了读写权限后再输入

20秒之后

应该就能看到ppp0了。 之后再配置路由。

Ubuntu下自动连VPN的脚本

  1. 只是在上面的那个脚本改了一下,因为我的都是中文界面的。

不知道学校里用Slackware的人多不多,最近改到这个版本上,那个l2tpd的源码编译通不过,去找了个补丁,打上去发现在连VPN比以前快多了,以前经常是4秒,现在几乎是一闪而过。

  • CategoryNetwork

wiki: HowtoVPN (2007-07-04 10:44:57由pluskid编辑)


这儿还有一份旧的,也一起发上来吧。

校内 VPN Howto (Ubuntu/Debian)
2006-09-21 20:50
UFO wiki 上有排版更舒服的版本:
http://mirror.uzone.org/wiki/HowtoVPN

1.内核

首先说一下,我用的内核是2.6.11,2.6以上的内核应该都可以的

编译内核的时候有几个选项要注意一下
第一个是ppp的支持,有两个选项

│ Symbol: PPP [=m]                                               |
│ Prompt: PPP (point-to-point protocol) support                  |
│   Defined at drivers/net/Kconfig:2292                          |
│   Depends on: NETDEVICES                                       |
│   Location:                                                    |
│     -> Device Drivers                                          |
│       -> Networking support                                    |
│         -> Network device support (NETDEVICES [=y])            |

│ Symbol: PPP_ASYNC [=m]                                         |
│ Prompt: PPP support for async serial ports                     |
│   Defined at drivers/net/Kconfig:2349                          |
│   Depends on: PPP                                              |
│   Location:                                                    |
│     -> Device Drivers                                          |
│       -> Networking support                                    |
│         -> Network device support (NETDEVICES [=y])            |
│           -> PPP (point-to-point protocol) support (PPP [=m])  |
│   Selects: CRC_CCITT                                           |
PPPOE可以不用编译,另外某些地方说这两个必须编译成模块,我不知道为什么,反正我是编译
成模块的,没有尝试过编到内核里面.
安装hotplug后,模块不用自己加载,使用到的时候,系统会自动加载

然后是PTY的支持
│ Symbol: UNIX98_PTYS [=y]                                       |
│ Prompt: Unix98 PTY support                                     |
│   Defined at drivers/char/Kconfig:421                          |
│   Depends on: EMBEDDED                                         |
│   Location:                                                    |
│     -> Device Drivers                                          |
│       -> Character devices                                     |

另外,强烈推荐安装udev包,因为我还不清楚/dev下面的pty文件是怎么生成的,安装udev包可
以方便很多
编译新内核后确保存在文件/dev/ptmx,如果没有这个文件说明内核或者udev的安装有问题

2.l2tpd的配置

首先安装l2tpd
原来的l2tdp的代码里面bug比较多,我的cvs上面有一份我修改过的l2tpd源代码,下载方法如
下:
$ cvs -z7 -d :pserver:cvs@debian.zealot.9966.org:/var/lib/cvs login
Logging in to :pserver:cvs@debian.zealot.9966.org:2401/var/lib/cvs
CVS password:                     <——–密码请输入cvs
$ cvs -d :pserver:cvs@debian.zealot.9966.org:/var/lib/cvs co l2tpd
cvs checkout: Updating l2tpd
U l2tpd/BUGS

切换到root(或者fakeroot)编译l2tpd的代码(编译源代码到deb包需要安装dh-make包)
l2tpd# debian/rules binary
blah blah
dpkg-deb: building package `l2tpd’ in `../l2tpd_0.70-pre20031121-2_i386.deb’.
如何编译deb包我这里就不多说了

安装刚编译好的l2tpd,这里不能用fakeroot
# dpkg -i l2tpd_0.70-pre20031121-2_i386.deb

然后是l2tpd的配置
l2tpd的配置文件是/etc/l2tpd/l2tpd.conf
这里只需要稍微修改一下默认配置就可以了
下面贴一下我的配置文件
[global]                              ; Global parameters:
port = 1701                           ; * Bind to port 1701
[lac zju]                             ; Example VPN LAC definition
lns = lns.zju.edu.cn                  ; * Who is our LNS?
refuse pap = yes                      ; * Refuse PAP authentication
require authentication = no           ; * Require peer to authenticate
name = zealot@a                       ; * Report this as our hostname
ppp debug = yes                       ; * Turn on PPP debugging
pppoptfile = /etc/l2tpd/zju.options   ; * ppp options file for this lac

首先解释一下lns和lac
lns指vpn服务器端,监听1701端口
lac指vpn客户端,主动链接服务器的1701端口

global里面指定l2tp所使用的端口
auth file是lns用的,这里可以无视

lns = lns.zju.edu.cn指定lns服务器地址
chap和pap是两种验证方式.
require chap|pap表示需要以chap|pap方式验证远程机器,就是服务器要发送用户名和密码
给本机,所以这里不需要这些选项
refuse chap|pap表示本机不会用chap|pap方法向服务器发送用户名和密码,由于这个vpn使
用chap方式,所以可以使用选项refuse pap
require authentication表示是否需要验证远程机器,就是服务器是否需要发送用户名和密
码给本机,这设置成no,就是不需要.
注:require authentication = no后,require chap|pap选项自动无效.
name表示登录名,就是动态帐号,@a @b @c @d参见校网中心发布的文档
pppoptfile = /etc/l2tpd/zju.options表示ppp配置文件的地址.

l2tpd的配置就这些了

3.pppd的配置

首先安装ppp包,我的版本是sid的2.4.3-20050321+2

ppp的配置我了解的不多

ppp的配置文件在l2tpd的pppoptfile中指定

这是我的配置文件,文件放在/etc/l2tpd/zju.options
asyncmap 0
noauth
crtscts
lock
hide-password
modem
netmask 255.255.255.0
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
ipcp-accept-local
ipcp-accept-remote
noipx

然后是pppd的密码文件
由于使用chap方式验证
密码文件默认放在/etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
*       *       “your password”                *
secret段设置成动态帐号密码即可,其他地方可以用*代替.别忘记去按照校网中心发布的文
档去zjuem修改密码.

4.vpn的运行与调试

先说运行.
启动l2tpd,
# /etc/init.d/l2tpd start
链接到vpn
# echo “c zju” > /var/run/l2tp-control
向/var/run/l2tp-control发送命令控制l2tpd的运行,这里的命令参见请l2tpd的文档
“c zju”表示发起名称为zju的链接,就是l2tpd配置文件中的[lac zju]
然后ifconfig,如果看到ppp0设备,恭喜你成功了
ppp0      Link encap:Point-to-Point Protocol
inet addr:222.205.74.23  P-t-P:222.205.64.1  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:40 (40.0 b)  TX bytes:46 (46.0 b)

如果没有那么幸运,就要调试了

首先开启pppd调试模式
就是在l2tpd中的配置文件中加入
ppp debug = yes

不要以daemon方式启动l2tpd
先停止l2tpd
# /etc/init.d/l2tpd stop
在控制台启动l2tpd
# l2tpd -D
这样可以看到l2tpd的输出

然后开另外一个控制台,向l2tpd发送命令
# echo “c zju” > /var/run/l2tp-control

l2tpd会在控制台上面输出一堆东西
pppd的debug输出在/var/log/syslog
另外/var/log/debug可能也会有一些东西
能否找到问题所在就靠实力了,这里我就不多说了
多man几次,google几次

5.路由配置
我喜欢使用ip命令配置路由,而不是route命令,ip命令功能更强大一些,用起来也方便一些.
ip命令在iproute包中

连接到vpn后,用ip route查看当前路由
# ip route
222.205.64.1 dev ppp0  proto kernel  scope link  src 222.205.74.23
222.205.9.0/24 dev eth0  proto kernel  scope link  src 222.205.9.2
default via 222.205.9.1 dev eth0

可以看出默认路由是通过网关,而不是vpn
我们希望10.* 210.32.*和222.205.*使用默认路由
# ip route add 10.0.0.0/8 via 222.205.9.1 dev eth0
# ip route add 222.205.0.0/16 via 222.205.9.1 dev eth0
# ip route add 210.32.0.0/16 via 222.205.9.1 dev eth0
注意222.205.9.1请替换成自己的网关

然后删除默认路由
# ip route del default

注意:不要先删除默认路由再设置10.*的路由,因为vpn服务器在10.*网段,删除默认路由将直
接导致vpn断开

设置其他地址使用vpn
先用ifconfig查看ppp0连接网关的ip地址
# ifconfig
ppp0      Link encap:Point-to-Point Protocol
inet addr:222.205.74.23  P-t-P:222.205.64.1  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1442  Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:40 (40.0 b)  TX bytes:46 (46.0 b)
我这里是222.205.64.1

使用vpn连接国内网
# ip route add default via 222.205.64.1 dev ppp0
然后使用ip route检查一下路由表.

至此vpn已经配置完毕

测试网络是否连通
$ telnet www.sina.com.cn www

在linux下面,最简单的vpn,
ip tunnel add mode ipip remote 210.32.191.xx local 192.168.0.1 dev eth0
//添加一个隧道设备,封装为192.168.0.1到210.32.191.xx,
//我原来没有写dev eth0,死活不行
ifconfig tunl1 1.1.1.1 netmask 255.255.255.252 pointopoint 1.1.1.2
//设定封装里面的虚拟ip

这样传过去的包是
ip 1.1.1.1 dst ip -> 1.1.1.2(gw)
ip 192.x.x.x 210.x.x.x
mac A:B:C:D
服务器端把包处理一下就可以了。
这样的vpn,不需要安装任何软件。
kernel直接支持的。
比较好玩。嗯。^_^

#! /bin/bash

function connect {
sudo chmod 666 /var/run/l2tp-control
sudo echo “c zju” > /var/run/l2tp-control
while ! ifconfig | grep -s ‘ppp0’ > /dev/null; do
sleep 1
done
}

if [ $# = 1 ]; then
if [ $1 = -r ]; then
sudo /etc/init.d/l2tpd stop
sudo /etc/init.d/l2tpd start
connect
sudo ip route add default via 172.16.255.2 dev ppp0
fi
else
if ! ifconfig | grep -s ‘ppp0’ > /dev/null; then
connect
sudo ip route add 10.0.0.0/8 via 10.14.101.1 dev eth0
sudo ip route add 222.205.0.0/16 via 10.14.101.1 dev eth0
sudo ip route add 210.32.0.0/16 via 10.14.101.1 dev eth0
sudo ip route add 239.43.1.1 via 10.14.101.1 dev eth0
sudo ip route del default
sudo ip route add default via 172.16.255.2 dev ppp0
else
echo ‘already connected…’
fi
fi

作者: 投稿者(Guest)

本账号专门用于发表“转载资料”以及读者的投稿

4 thoughts on “HowtoVPN

    • Leniy

      其实操作起来没多少麻烦。
      设置好一次,以后就可以一个命令启动了

发表评论

电子邮件地址不会被公开。 必填项已用*标注