24. 使用 /etc/ppp/ip-down
你可以建立一指令稿在连接一旦结束之後执行.这存放在
/etc/ppp/ip-down 里.这可以用来还原任何对应你在 /etc/ppp/ip-up
指令稿中做的特殊动作.
--------------------------------------------------------------------------------25.
区域网路上的递送问题
如果你已经连接在某个区域网路上但是仍然想要使用在你个人的 Linux
机器上的 pppd
的话,你得要应付某些递送封包的问题,从你的机器到你的区域网路(经过你的乙太网路界面)以及到远端的
PPP 伺服器和更外面的世界.
这一节并不尝试教你有关封包递送的机制 -
它只处理一个简单的,特定的递送情况(静态的)!
如果你不熟悉递送机制的话,那麽我强烈地鼓励你阅读 Linux Network
Administrator Guide (NAG).同时 O'Reilly 的书 "TCP/IP Network
Administration" 也以非常容易了解的方式涵盖了这个主题.
静态递送路径的基本规则是预设递送路径应该是指向网路位址号码最多的那一个.对於其它的网路则在递送表格中输入指定递送路径.
我唯一打算在这里介绍的情况是你的 Linux
机器在一个没有连上网际网路的区域网路上 -
而你想要在仍然连接著区域网路的情况下拨接到网际网路上供自己使用.
首先,确定你的乙太网路递送路径是设往能够通过你的区域网路的指定网路位址
- 不是设往预设递送路径!
藉由发出 route 指令检查之,你应该会看见如下的讯息:
[root@hwin /root]# route -n
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
loopback * 255.255.255.0 U 1936 0 50 lo
10.0.0.0 * 255.255.255.0 U 1436 0 565 eth0
如果你的乙太网路界面 (eth0) 指向预设递送路径,(在 eth0
该行的第一列上会显示 "default"
字样)那麽你得要变更你的乙太网路起始指令稿使它指向特定的网路号码而非预设递送路径(参照
Net2 HOWTO 以及 NAG).
这将允许 pppd 设立你的预设递送路径,如下所示:
[root@hwin /root]# route -n
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
10.144.153.51 * 255.255.255.255 UH 488 0 0 ppp0
127.0.0.0 * 255.255.255.0 U 1936 0 50 lo
10.1.0.0 * 255.255.255.0 U 1436 0 569 eth0
default 10.144.153.51 * UG 488 0 3 ppp0
如同你所见到的,我们拥有经由 ppp0 到 PPP 伺服器(10.144.153.51)的主机递送设定而且也拥有使用
PPP 伺服器作为闸道的预设网路递送设定.
如果你的设定得要比此更复杂 -
阅读已经提过有关递送的文件并请教在你身旁的专家!
如果你的区域网路上已经有路由器,那麽在你那里已经建立了通往宽广网路世界的闸道.你仍应把你的预设递送路径指往
PPP 界面 - 并且使其它的递送路径指定到由路由器服务的网路.
25.1. 安全上的注意事项
当你在现有的区域网路上设定一台 Linux
机器连结到网际网路上,你在不知不觉中已经对网际网路 -
以及在那里的骇客们 -
开放了你的整个区域网路.在你这样做之前,我强烈地鼓励你请教你的网路管理者并参考该处的安全策略.如果你的
PPP
连线被成功地用来攻击你的站台的话,那麽你最少也会招致同夥的使用者,网路及系统的管理者强烈的愤怒.你也可能会发现你自己置身於非常严重的麻烦!
在你连接区域网路到网际网路上去之前,甚至是动态的连线你都应该要考虑安全的隐忧
- 因此早点参考 O'Reilly 的 "Building Internet Firewalls"!
--------------------------------------------------------------------------------26. 建立
PPP 伺服器
如同前面提过的,这件工作有许多方法可以可以达成.我在这里所介绍的是我怎麽做的方法(使用
Cyclades 多埠串列卡)以及一组自动转接的电话线路.
如果你不喜欢我在这里介绍的方法,请自由地使用你自己的方法.不过,我很乐意在这份使用说明未来的版本中包含额外的方式.所以,请把你的评论跟方法寄给我!
请注意,这一节只跟如何设定 Linux 作为 PPP
伺服器有关.我不想(不曾)包含有关设定特殊终端机伺服器及这一类的资讯.
而且,我尚未实验过配合 shadow
密码使用(但应该会做).因此目前介绍的资讯并不包含任何 shadow
需要的设定.
26.1. 编译核心
所有早先提过关於编译核心以及核心与 pppd
版本的说明都适用.这节假设你已经读过这份文件前面的章节!
对於 PPP 伺服器,你必须在你的核心中包含 IP forwarding
的功能.你也可能会希望包含其它的功能(像是 IP firewalls, accounting
等等).
如果你使用多埠串列卡,那麽你也必须明确地在你的核心中包含必要的驱动程式!
26.2. 伺服器系统的概观
我们使用相同的使用者名称/密码配对提供拨接 PPP (and SLIP)
帐号以及 shell
帐号.这样做的好处(对我们而言)是使用者只需要一个帐号就可以使用所有种类的连线.
因为我们是教育组织,我们并不对职员以及学生的使用收费,所以不必担心计算与收费的问题.
在我们的节点与网际网路之间我们设置有一台防火墙,而这会限制某些使用者的存取,因为拨接线路是在我们的(网际网路)防火墙内(理由很明显,其他网际网路防火墙的细节也不会在此出现而且在任何情况下都没有关系).
使用者建立连往我们节点之 PPP
连结的程序(当然是在他们拥有有效的帐号後)是:
拨入我们的自动转接拨号器(这是连结一堆数据机的单一电话号码
- 第一台空□的数据机会接起拨入的电话).
使用一对有效的使用者名称以及密码签入.
在 shell 提示符号下,发出 ppp 指令以启动伺服器上的 PPP 程序.
启动他们机器上的 PPP(可以是执行 Windows, DOS, Linux, MAC OS
或任何作业系统的机器 - 这是他们的问题).
这台伺服器为每个拨入的埠使用个别的 /etc/ppp/options.ttyXX
档案,而这为动态的 IP 分配设定远端的 IP
号码.伺服器为远地的客户端使用代理位址解析协定(proxyarp)来递送封包(经由适当的
pppd 选项加以设定).这避免了使用 routed 或是 gated 的需求.
当使用者从他们那端挂断时,pppd
会侦测出来并告诉数据机要它挂断,同时停掉 PPP 连结.
26.3. 所需的全部软体
你将会需要下列的软体:-
Linux,适当地编译以包含必要的选项.
适合於你核心的 pppd 版本.
一套能够聪明地处理数据机通讯的 'getty' 程式.
在这里我们使用的是 getty_ps2.0.7h ,但积极考虑 mgetty.我了解 mgetty
可以侦测出使用 pap/chap 的呼叫( pap 是 Windows 95
使用的标准)并自动地起动 pppd,但是我尚未研究过它.
你的拨接使用者能够存取的一台领域名称伺服器 (DNS).
如果有可能的话你真的应该执行你自己的领域名称伺服器...
26.4. 设定标准的拨接(shell access)
在你可以设立你的 PPP 伺服器之前,你的 Linux
机器必须能够处理标准的拨接存取.
这份使用说明并不涵盖这项设定方法.请参阅你选择之 getty
的文件以及 Serial HOWTO 里有关这项设定的资讯.
26.5. 设立 PPP 选项档案
你将得为所有拨接埠设立一个全体的 /etc/ppp/options
档案,其中是通用的选项.我们使用的选项是:
--------------------------------------------------------------------------------
asyncmap 0
netmask 255.255.254.0
proxyarp
lock
crtscts
modem
--------------------------------------------------------------------------------
注意 - 我们没有使用任何(明显的)递送设定 - 特别是这里没有
defaultroute 选项.这理由是因为所有你(做为 PPP 伺服器)所要做的就是将封包从
PPP
客户端递送到你的区域网路或网际网路并且将封包由你的区域网路递送到你的客户端.
全部所需的只是到客户机器的主机递送,而使用 pppd 的 'proxyarp'
选项达成.
这个 'proxyarp' 选项设立一个代理位址解析协定的项目於 PPP
伺服器的位址解析协定(ARP)表格中,那基本上就是说 '将所有要给 PPP
客户端的封包送给我'.这是建立单一 PPP
客户端的递送路径最简单的一个方式 -
但你不能用这种方式在两个区域网路之间递送封包 -
你必须加入适当的网路递送而不能使用代理位址解析协定.
你几乎一定会希望提供动态分配的 IP
号码给你的拨接使用者.你可以藉由分配 IP
号码给每个拨接埠来达成目的.现在,为你的每个拨接埠建立一个
/etc/ppp/options.ttyXX 档案.
在这里面,只要简单地放入本地(伺服器)的 IP
号码及该埠所要使用的 IP 号码.例如
--------------------------------------------------------------------------------
kepler:slip01
--------------------------------------------------------------------------------
特别注意,在这个档案里你可以使用合法的主机名称(我发现我只记得在我网路上重要机器与设备的
IP 号码 - 名称会更有意义才对)!
26.6. 设定 pppd 以便让使用者(成功地)执行它
因为起动 ppp
连结隐含著配置核心设备(网路界面)及操控核心递送表格的动作,所以需要特别的权限
- 事实上需要完整的 root 权限.
幸运的是, pppd 已经设计成可以安全地设定为以 root
的身分执行.所以你必须
--------------------------------------------------------------------------------
chmod u+s /usr/sbin/pppd
--------------------------------------------------------------------------------
当你列出这个档案时,它应该会如同这样
--------------------------------------------------------------------------------
-rwsr-xr-x 1 root root 74224 Apr 28 07:17 /usr/sbin/pppd
--------------------------------------------------------------------------------
如果你没有这样做,使用者将不能设立他们的 PPP 连结.
26.7. 为 pppd 设定一个全域的别名(alias)
为了简化我们拨接 PPP 使用者的连线程序,我们建立一个全域的别名(放在
/etc/bashrc)如此一旦他们签入之後只要一个简单的指令就能起动伺服端的
ppp.
这看起来像
--------------------------------------------------------------------------------
alias ppp="exec /usr/sbin/pppd -detach"
--------------------------------------------------------------------------------
它所作的是
exec :
意指以这个指令所执行的程式替换正在执行的程式(在这个例子中是
shell).
pppd -detach : 起动 pppd 并且不要把产生的程序放入背景执行.这确保当
pppd 结束时不会留下任何程序.
当一个使用者像这样签入时,他们在 'w' 的输出中看起来会像这样
--------------------------------------------------------------------------------
6:24pm up 3 days, 7:00, 4 users, load average: 0.05, 0.03, 0.00
User tty login@ idle JCPU PCPU what
hartr ttyC0 3:05am 9:14 -
--------------------------------------------------------------------------------
就这样... 我告诉过你这是一个很简单的,基本的 PPP 伺服系统!
--------------------------------------------------------------------------------27. 在
null modem (直接连线)上使用 PPP
这非常地简单 - 因为没有数据机所以事情变得更容易.
首先,选择其中一部机器做为'伺服器',在串列埠上设立 getty
以便让你可以从'客户端'使用 minicom 去取用此串列埠以测试连接性.
一旦你成功了,你可以除去这个 getty,除非你想用使用者名称/密码来确认连线.因为你有两部机器的'实体控制权',我假设你并不想如此做.
现在,在伺服器端除去 getty 并确认你已在两部机器上正确地使用
'setserial' 来设定串列埠.
所有你要做的就是在两个系统上启动 pppd.我假设你在两台机器上都使用
/dev/ttyS3 建立连线. 因此,在两部机器上执行指令:-
--------------------------------------------------------------------------------
pppd -detach crtscts lock <local IP>:<remote IP> /dev/ttyS3 38400 &
--------------------------------------------------------------------------------
这将会建立起连结 -
但目前为止你还未指定递送路径.你可以在每部机器上用 ping
指令来测试连结.如果这样可以的话,终止其中一个 pppd
程序以结束连结.
你需要的递送路径实际上看你究竟想做什麽而定.一般来说,其中一部机器会连上乙太网路(其及後的网路)因此所需的递送完全和
PPP 伺服器与客户端一样.
因此在具有乙太网路的机器上,pppd 的指令应该是
--------------------------------------------------------------------------------
pppd -detach crtscts lock proxyarp <local IP>:<remote IP> /dev/ttyS3 38400
&
--------------------------------------------------------------------------------
而另一部机器上是
--------------------------------------------------------------------------------
pppd -detach crtscts lock defaultroute <local IP>:<remote IP> /dev/ttyS3 38400
&
--------------------------------------------------------------------------------
如果你连接两个网路(使用串列连结!)或有更复杂的递送需求,你可以完全按照这份文件前面所提的方法来使用
/etc/ppp/ip-up.
Robert Hart
Port Hedland, Western Australia
Melbourne, Victoria, Australia August/October 1996 January/March 1997