Linux下pppoe连接建立后仍不能上网的问题

| Comments

问题描述

pppoe可以连接,ifconfig可以看到ppp0接口,一切正常,只是不能上网。

解决办法

使用如下命令查看路由表:

1
route

正常情况下返回的结果中应该有如下内容:

default * 0.0.0.0 U 0 0 0 ppp0

如果没有,可手工添加:

1
route add default dev ppp0

如果可以上网,就成功了。

使用如下脚本在pppoe连接成功时自动添加路由表项:

1
2
3
4
5
6
#!/bin/sh

if ifconfig ppp0  > /dev/null 2>&1 ; then
    route del default
    route add default dev ppp0
fi

将上述内容保存成名为01-route.sh的文件,权限755,放到/etc/ppp/ip-up.d目录下。

然后创建以下两个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

if ifconfig ppp0  > /dev/null 2>&1 ; then
    echo 'PPPOE has already been switched on !'
    exit 0
fi
 
off

sudo pon
sleep 5
sudo /etc/ppp/ip-up
1
2
3
4
5
6
7
8
9
#!/bin/bash

if ! ifconfig ppp0  > /dev/null 2>&1 ; then
    echo 'PPPOE has already been switched off !'
    exit 0
fi
 
sudo poff
sudo /etc/ppp/ip-down

分别命名为onoff并复制到环境变量PATH下,以后即可使用这两个脚本建立和注销pppoe连接。

原因分析

问题的原因是pppoe连接建立时,没有自动往路由表中添加相关路由项。

一般情况下,如果使用的是ppp做pppoe连接,其配置文件中默认会开启defaultroute选项,该选项的作用就是在pppoe连接建立时自动添加路由表项,但在路由表中已经存在default项时,该操作将不会进行。

一般有两种情况会使路由表中在pppoe连接建立前就存在default项。一种情况是网络接口配置中设置了route,如在archlinux下,就是rc.conf文件中的gateway项。如果使用的是静态地址,则需要做这种配置,但对于大多数使用DHCP动态分配IP地址的情况,这项配置则不需要。另一种情况就是ADSL Modem自带路由功能,在分配IP给计算机时也会自动添加一条路由表项。

Comments