校内 VPN Howto (Ubuntu/Debian)

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-2i386.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