LINUX ADSL
时间:2006-07-11 来源:ljc6386613
好了,终于提到最热门的 ADSL 拨接制的上网方式啰!嗯!来谈一谈怎么在 Linux 上拨接上网吧!在 Linux 系统中,要以 ADSL 连上 Internet 是一件很简单的事情,使用 rp-pppoe ( http://www.roaringpenguin.com/pppoe/ ) 软件就可以进行拨接了!安装也很方便喔!再来要注意的是,在目前的 Linux 版本当中,由于强调桌上型计算机的便利性,所以很多版本的 Linux 都取消了文字接口下的 ADSL 拨接指令,例如 Red Hat 新版的 Linux 。所以在预设的状态下,我们仅能以图形接口启动 ADSL ,这真的很讨厌,因为我们的主机就是不想要启用 X Window 的啊!怎么办?没关系,我们可以透过重新安装 rp-pppoe 就行啦!我们提过在 Linux 的安装方式主要有 RPM 与 Tarball 两种方式,目前鸟哥已经成功的在 Red Hat 7.2 上面安装 rp-pppoe-2.6-5.src.rpm 这个版本的 rp-pppoe 啰!然而由于很多时候 RPM 有相依属性的问题,因此我们也尝试以 Tarball 来安装一下 rp-pppoe 吧!( 注:如果依旧无法以 RPM 安装 rp-pppoe 时,请直接以 Tarball 来安装吧! )
此外,需要特别留意的是,原本 Linux 主机上面就会有 eth0 这个网络卡接口,不过在使用 rp-pppoe 拨接之后,会多产生了一个对外的接口,称为 ppp0 的这个网络联机接口,因此,您将具有三个网络接口喔!分别是:
- 内部循环测试用的lo接口;
- 网络卡 eth0 这个接口;
- 拨接之后产生的经由 ISP 对外连接的 ppp0 接口。
而由于这三个接口的 IP 网段都不相同,因此,请『特别留意通讯闸的设定!』一般而言,在 ADSL 拨接的状态下,前面提到的几个档案的设定内容中,『都不要设定GATEWAY及GATEWAYDEV这两个参数』,因为 rp-pppoe 会自动由 ISP 取得这方面的数据,如果您设定了GATEWAY,反而会造成系统无法联机出去的状态喔!
因为拨接之后会产生两个实体接口,分别为 eth0 与 ppp0 ,所以底下我们将针对两个接口进行设定。在 eth0 的设定中,我们选择 192.168.1.0/255.255.255.0 并且 IP 为 192.168.1.2 ,至于 ppp0 则完全由 rp-pppoe 所产生。
设定与安装的步骤简单说明如下:
- 重新设定网络参数档案;
- 查看是否安装了 rp-pppoe,移除 rp-pppoe;
- 安装 rp-pppoe :
- 用 rpm 安装;
- 用 Tarball 安装;
- 设定 rp-pppoe :
- ADSL 拨接连线
好了!开始一步一步来进行安装与设定及联机的步骤吧!
- 重新设定网络参数档案:
由于我们是使用拨接的方式来连上 Internet 的,所以 default gateway 是由 rp-pppoe 拨接之后 ISP 直接传送数据到我们 Linux 主机上的,因此,在您的 Linux 系统当中,千万不要设定 GATEWAY 或者是 GATEWAYDEV 喔!( 这个情况我们会在 Linux Router 的设定当中说明 )!1. 取消预设通讯闸
[root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes <==若您需要 eth0 帮您建立内部私有网域时,这里可以写成 yes
但若不需要内部网络时,这一行请直接写成 no ,反正拨接
之后网络卡会自动被启动!
BOOTPROTO=static
IPADDR=192.168.1.2
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
[root@test root]# /etc/rc.d/init.d/network restart - 移除原本的 rp-pppoe 套件:
如同前面说的,新版的 rp-pppoe 很多都仅支持图形接口的拨接程序,所以我们这里直接将 rp-pppoe 移除 (或者根本不要使用预设的 rp-pppoe 套件),然后再重新安装官方网站的 rp-pppoe 套件说:[root@test root]# rpm -qa | grep rp-pppoe
rp-pppoe-3.5-2 <==看来是已经安装了!只好移除啰!
[root@test root]# rpm -e rp-pppoe - 安装 rp-pppoe :
安装 rp-pppoe 的方式有两种,可以使用 rpm 与 tarball 的方式来分别安装,不过,只要选择一种来安装就可以啦!
- RPM 安装 rp-pppoe:
如果您下载的是 SRPM 的档案的话,那么就需要先经过编译才行。详细的编译及安装步骤如下表所示:( 请注意,编译的过程也需要 gcc 之类的 compiler ,如果没有在 Install 的时候选择时,在编译个过程中可能会有出现错误,请自行由 Linux 原版光盘安装吧! )
- 下载 rp-pppoe :
rp-pppoe 的下载网站在:『http://www.roaringpenguin.com/pppoe/#download』,底下我是以rp-pppoe-3.5-1.src.rpm 这个档案进行介绍的。如果您的主机尚未开放任何的服务时,您可以使用软盘来下载 rp-pppoe ,因为 rp-pppoe 的档案很小啦!还不到 200 KB 呢!所以软盘就可以啰!如何使用软盘呢?- 先使用软盘将下载下来的 rp-pppoe copy 到软盘上;
- 将软盘放置于 Linux 主机的软盘槽中;
- 在 Linux 底下使用 df 这个指令,看看有没有类似底下的这一行:
/dev/fd0 1423 0 1423 0% /mnt/floppy
如果有的话,请使用『 umount /mnt/floppy 』,如果无,则跳到下一步; - 使用『 ls -l /mnt 』看看有没有 floppy 这个目录:
如果有则下一步,若无则『 mkdir /mnt/floppy 』; - 使用『 mount -t vfat /dev/fd0 /mnt/floppy 』将软盘挂上去!
- 使用『 cp /mnt/floppy/rp* /root 』将档案 copy 到 /root 这个目录下;
- 使用『 cd /root 』将目录转到 root 底下。
- 编译及安装 rp-pppoe :
1. 编译 SRPM:
[root@test root]# rpm --rebuild rp-pppoe-3.5-1.src.rpm
[root@test root]# rpmbuild --rebuild rp-pppoe-3.5-1.src.rpm
# 注:在 Red Hat 7.3 以前, rpm 的指令使用 rpm ,但是在 Red Hat 8
# 以后, SRPM 的重制指令已经独立至 rpmbuild 啰!所以请选择
# 适合您的 Linux 版本喔!
.........
Wrote: /usr/src/redhat/RPMS/i386/rp-pppoe-3.5-1.i386.rpm
.........
在编译时,最后的结果(如果没有错误)会显示上面那个样子!
也就是说,您的编译完成的档案就放在上面啰!
2. 安装 rp-pppoe :
[root@test root]# cd /usr/src/redhat/RPMS/i386
[root@test i386]# rpm -ivh rp-pppoe-3.5-1.i386.rpm
Preparing... ########################################### [100%]
1:rp-pppoe ########################################### [100%]
[root@test i386]# rpm -q rp-pppoe
rp-pppoe-3.5-1
这样就安装完毕了!简单吧!如果不相信,可以查询看看!
- 下载 rp-pppoe :
- Tarball 安装 rp-pppoe :
嗯!由于 RPM 可能会有相依属性的问题!因此,如果您的系统上面无法安装 rp-pppoe 的话,那么就直接以 Tarball 的方式来安装 rp-pppoe 吧!目前 (2003/08/18) 最新的 rp-pppoe 套件为 rp-pppoe-3.5.tar.gz 这个档案:1. 解压缩!
[root@test root]# mv rp-pppoe-3.5.tar.gz /usr/local/src
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf rp-pppoe-3.5.tar.gz
2. 侦测系统与编译执行文件:
[root@test src]# cd rp-pppoe-3.5/src
[root@test src]# ./configure --prefix=/usr/local
[root@test src]# make; make install
- RPM 安装 rp-pppoe:
- 设定 rp-pppoe :
rp-pppoe 的设定非常简单,只要透过 /usr/sbin/adsl-setup ( 若为 Tarball 安装的话,那么就在 /usr/local/sbin /adsl-setup 啰 ) 这个程序来设定就 OK 了![root@test root]# /usr/sbin/adsl-setup
>>> Enter your PPPoE user name (default [email protected]): T0123456
这个时候请输入您在 ADSL 的账号,不同的 ISP 有不同的设定方式呦!请特别注意!
a. 如果是 seednet 的话,应该有点像这样==> T0123456
b. 如果是 Hinet 的话,应该有点像这样====> [email protected](连同 host 也要写)
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth0): eth0
因为我们使用 eth0 联机的呀!
>>> Enter the demand value (default no): <=按下 Enter 即可
这里按 enter 不用设定就好了!>>> Enter the DNS information here: 168.95.1.1
>>> Enter the secondary DNS server address here: 139.175.10.20
这里要您输入惯用的 DNS 主机:
若使用 hinet 的话,可以打入 168.95.1.1
若使用 seednet 的时候,可以打入 139.175.10.20
>>> Please enter your PPPoE password: <==输入您的密码
>>> Please re-enter your PPPoE password: <==再输入一次
这里就输入您的 ADSL 密码啦,要输入两次喔!
The firewall choices are:
0 - NONE: This script will not set any firewall rules. You are responsible
for ensuring the security of your machine. You are STRONGLY
recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
for a LAN
>>> Choose a type of firewall (0-2): 0
这里要您选择防火墙的形式,通常我是不设火墙的,
所以直接选 0 就对了! 注意:选了防火墙有的时候反而会造成无法联机成功!
反正未来我们会手动设定防火墙,所以这里不设定没有关系!
Start this connection at boot time
Do you want to start this connection at boot time?
Please enter no or yes.
yes
如果想要一开机就自动启动 ADSL 联机的话,这里可以填入 yes啦!
Ethernet Interface: eth0
User name: T0123456
Activate-on-demand: No
Primary DNS: 168.95.1.1
Secondary DNS: 139.175.10.20
Firewalling: NONE
>>> Accept these settings and adjust configuration files (y/n)?y
接下来将您的设定作一个整合结果输出,如果没有问题的话,
输入 y 之后就完成设定啦!
基本上,设定完成之后以下的档案会被自动改变,
有影响的是 resolv.conf 这个档案,您可以手动改变这个档案喔!
Adjusting /etc/ppp/pppoe.conf
Adjusting /etc/resolv.conf
(But first backing it up to /etc/resolv.conf-bak)
Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
(But first backing it up to /etc/ppp/pap-secrets-bak)
(But first backing it up to /etc/ppp/chap-secrets-bak)
- 连上 Internet 啦!
怎么拨接呢?简单的很,直接下达 adsl-start 即可![root@test root]# adsl-start
....Connect!
- 查看您的 IP 啦!
那如何知道您的 IP 呢?呵呵!就使用 ifconfig 呀![root@test root]# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:211.74.249.38 P-t-P:172.16.11.8 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:8356088 errors:0 dropped:0 overruns:0 frame:0
TX packets:8532063 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
- 自动侦测 ppp0 的拨接状态:
基本上,目前的 rp-pppoe 已经都设定好了断线后会自动拨接的模式了,因此我们大可不用太担心,不过,如果您还是很担心会断线后无法自动拨接出去,那么可以在 /etc/crontab 加入这一行:[root@test root]# vi /etc/crontab
.......
01-59/3 * * * * root /usr/sbin/adsl-start > /dev/null 2>&1
或许您会发现使用 rp-pppoe 拨接之后,您的 /var/log/messages 老是出现这样的讯息:
[root@test root]# more /var/log/messages May 10 18:02:22 testing pppoe[8527]: Bogus PPPoE length field (50) |
这是什么问题啊?在 RP-PPPOE 的官方讨论区上面提过,这个问题是由于 ISP 提供的讯息长度超过 rp-pppoe 预设的检查长度才会发生的一个警告讯息,事实上这个讯息并不重要,不用理会他也没有关系,不会影响到 Internet 的运作。但是,这样的讯息在 /var/log/messages 里面每一分钟就出现一次,实在很讨厌!怎么办,可以将他拿掉吗?!当然可以!您可以下载新的 Tarball 来重新编译过!步骤是这样的:
- 到下面的网站去下载新的 Tarball (我这里以 3.5 为例!)
http://www.roaringpenguin.com/pppoe/#download - 在 /usr/local/src底下解开该档案,则会造成 /usr/local/src/rp-pppoe-3.5 这个目录
- 到 /usr/local/src/rp-pppoe-3.5/src 底下去,修改这四个档案:
- discovery.c
- pppoe.c
- pppoe-server.c
- relay.c
/* Check length */
if (ntohs(packet.length) + HDR_SIZE > len) {
syslog(LOG_ERR, "Bogus PPPoE length field (%u)",
(unsigned int) ntohs(packet.length));
return;
}/* Check length */
if (ntohs(packet.length) + HDR_SIZE > len) {
/* syslog(LOG_ERR, "Bogus PPPoE length field (%u)",
(unsigned int) ntohs(packet.length)); */
return;
}if (plen + HDR_SIZE > len) {
syslog(LOG_ERR, "Bogus length field in session packet %d (%d)",
(int) plen, (int) len);
return;
}if (plen + HDR_SIZE > len) {
/* syslog(LOG_ERR, "Bogus length field in session packet %d (%d)",
(int) plen, (int) len); */
return;
} - 然后就可以开始这样做啰:
cd /usr/local/src/rp-pppoe-3.5/src
./configure
make
make install - 如果一切都可以成功的进行,那么就可以:
adsl-stop
adsl-start
-
在新闻群组或者是BBS上面最常听到的就是这个问题啦:
- 咦!我的ADSL已经拨接上了,使用telnet IP也可以正确的连上BBS,但是为什么就是无法使用『telnet 网址』的方式连上Internet呢?
- 我在我的虚拟网域内有几部计算机,这几部计算机明明都是在同一个网域之内,而且系统通通没有问题,为什么我使用pop3或者是ftp连上我的Linux主机会停顿好久才连上?
这两个问题其实有点相关性啦,第一个问题比较好解决,那个绝对是DNS的IP设定错误,修改一下/etc/resolv.conf即可!第二个问题则是因为网络联机时,有的时候会去检查联机IP的主机名称(我们称为领域名称反解),但是我们的内部网域计算机都是私有IP,自然无法被反查到他的名称啦!这个时候我们就必需要藉由/etc/hosts这个档案来帮我们的内部计算机设定名称啦(名字可以随便取没有关系啰!)
/etc/hosts
还有几个档案对于内部真的是挺重要的,首先就是 /etc/hosts 这个档案啦!请注意!由于计算机与计算机在交互沟通的时候,都会『想要确认对方的身份』,因此会利用 /etc/hosts 与 /etc/resolv.conf 这两个档案去『查询对方的 domain name 』,亦即是对方的身份啦!这个时候,如果您的计算机在连上对方的计算机时,对方无法查询到您的身份,那就有可能会发生『等待逾时』的情况!最常见的发生状况就在于『使用您的局域网络内的私有 IP ( 或者被称为虚拟 IP )连上具有实体 IP 的 NAT 主机』时,最容易发生这个问题了!您应该会觉得奇怪,『咦!不都是我的局域网络的计算机吗( 指 NAT 主机跟您的 Client ) 怎么 pop3 跟 FTP 联机这么慢?!还要等个 60 秒!』嘿嘿!没错!这个时候就是您的 NAT 主机在追查您的 PC1 的身份啦!
那么通常 Linux 主机是如何查询对方的身份的呢?在预设的情况中( 因为这个顺序可以改变,所以才会说是『预设情况』,这个顺序我们会在 DNS 的架设当中再提及! )首先,就会去检查 /etc/hosts 这个档案的设定,所以他是第一优先,再来则是 /etc/resolv.conf 的 DNS 主机啦!而,由于您 LAN 里面的 Client 是以『私有 IP 』进行架设的,然而您并没有将您的 私有 IP 写入 /etc/hosts 当中,这个时候您的 Linux 主机就会到 /etc/resolv.conf 里面设定的 DNS IP 去查询您的 client 的身份,偏偏您的 client 根本就没有在因特网上( 因为私有路由不可直接与 Internet 连接 ),哈哈!那么当然 Linux 就会找不到,也就会 delay 了几乎 60 秒钟了!
了解了吗?所以说,您就要将您的 私有 IP 的计算机与计算机名称写入您的 /etc/hosts 当中了!好了!那么这个咚咚的内容如何呢?我们来看一看原本的 Red Hat 7.2 的设定吧!
[root@test root]# vi /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 计算机 IP 主机名称 主机别名( alias ) |
在上面的情况中很容易就发现了设定的方法了吧!很简单吧!没错!那就是 IP 对应主机名称啦!那么现在知道为什么我们给他 ping localhost 的时候,地址会写出 127.0.0.1 了吧!那就是写在这个档案中的啦!而且那一行不能拿掉呦!否则系统的某些服务就会无法被启动!好了!那么将我局域网络内的所有的计算机 IP 都给他写进去!并且,每一部给他取一个您喜欢的名字,即使与 client 的计算机名称设定不同也没关系啦!以我为例,如果我还额外加设了 DHCP 的时候,那么我就干脆将所有的 C Class 的所有网段 ( 什么是 C Class ? 如果看不懂我在写什么,请千万回到 网络基础去看一看内容呦!很重要的! )全部给他写入 /etc/hosts 当中,有点像底下这样:
[root@test root]# vi /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.1.1 linux001 192.168.1.2 linux002 192.168.1.3 linux003 ......... ......... 192.168.1.255 linux255 |
如此一来,不论我哪一部计算机连上来,不论是在同一个网段的哪一个 IP ,我都可以很快速的追查到!嘿嘿!那么区内网络互连的时候,就不会多等个好几时秒钟啰!
/etc/resolv.conf
很多朋友常问的一个问题『咦!我可以拨接上网了,也可以 ping 到奇摩雅虎的 IP ,但为何就是无法直接以网址连上 Internet 呢!』嘿!被气死!前面不是一直强调那个 DNS 解析的问题吗?对啦!就是名称解析不对啦!赶快改一下 /etc/resolv.conf 这个档案吧!改成上层 ISP 给您的 DNS 主机的 IP 就可以啦!例如 Hinet 的 168.95.1.1 及 Seednet 的 139.175.10.20 啰!例如底下的范例(这个范例就可以照抄了! ^_^):
[root@test root]# vi /etc/resolv.conf nameserver 168.95.1.1 nameserver 139.175.10.20 |
- DNS 设定错误:
最容易造成无法以网址联机的情况就是 DNS 主机的 IP 设定错误了!大家都习惯将 /etc/resolv.conf 设定成自己 NAT 的主机 IP!这是『错误的情况』!请注意!将『局域网络内的每一部计算机,不只是 NAT 主机,全部的( 不论是 Linux 还是 Windows ) DNS 主机 IP 都写成合法的 IP!例如使用 Hinet 的 168.95.1.1 !』
- GATEWAY 设定错误:
常常有朋友问到:『为何我的 adsl-start 拨接上了,但是就是无法连接出去 Internet 呢?』有的朋友则是问:『为何我连出去 Internet 的时候,都是以私有 IP 那个接口( eth0 )在联机,而不会以公共 IP ( ppp0 那个接口 )来联机?』这个都是同样的问题,就是系统无法建立实际的 gateway 来沟通您与 Internet 的联机!因为封包送错了方向啦!举个最简单的例子,我们都知道私有 IP 与公共 IP 不能直接相互沟通,所以我们需要在主机上面设定两个 IP ( 通常是以两块网络卡搞定!),一个是公共 IP 另一个则是私有 IP ,然而在设定的初期,很多人都会使用一个预设的 gateway ( 在 /etc/sysconfig/network 或者是 ifcfg-eth0 ),这个gateway 是在告诉系统:『嘿!要上 Internet 您只能由这里出去!』的意思,因此,所有的封包将会直接给他送到这个 gateway 来!不过,抱歉的是,由于您在后来新增了一个 ppp0 ( 拨接之后产生的 ) 界面,这个界面所使用的是公共 IP ,而该 IP 是写在 ppp0 的界面里头的,他可以自行提供合理的 gateway 。然而偏偏您已经设定了一个 default gateway 了,因此不论 pppoe 如何振作,嘿嘿!都没有办法改变的啦!因此,这个时候就必须要来改一下您的 default gateway 了!
- 修改 /etc/sysconfig/network 或者是 ifcfg-eth0 这个档案,将里头的:
GATEWAY=xxxx.xxxx.xxx
GATEWAYDEV=eth0
里面的 xxxx.xxx.xxx.x 都删掉,然后,那个如果对外卡是eth0,则设定为 eth0 ,否则亦可设定为 ppp0 ( 拨接! )当然,最好是可以不要设定啦,所以变成了:
GATEWAY=
GATEWAYDEV= - 这样就可以啦!如果没有办法立刻达成,可以下达:
/etc/rc.d/init.d/network restart