Server 专 栏
自 己 动 手 架 SLIP Server

似 乎 现 在 的 东 西 都 是 最 流 行 DIY了 , 想 了 解 SLIP Server应 如 何 架 设 吗 ? 那 你 得 仔 细 阅 读 本 文 罗 !

马 得 翔

  不 管 您 是 何 方 神 圣 , 若 是 您 想 在 家 透 过 电 话 线 来 上 Internet, 那 您 就 非 得 用 SLIP或 PPP来 与 对 方 的 PPP或 SLIP Server沟 通 , 要 不 然 上 层 的 网 路 应 用 程 式 根 本 动 不 起 来 ......以 下 就 与 各 位 探 讨 SLIP Server这 座 桥 如 何 搭 起 来 的 。

SLIP 协 定 的 由 来

  SLIP( Serial Line IP, RFC 1055) 就 是 透 过 serial line( 如 RS232加 modem与 电 话 线 ) 来 载 运 IP封 包 ; 由 於 早 先 的 IP封 包 都 可 以 在 ethernet、 token ring、 X.25等 介 面 上 运 作 , 但 就 是 少 掉 了 一 般 最 常 用 的 电 话 线 这 介 面 , 所 以 用 电 话 线 ( Serial Line) 来 传 递 IP封 包 的 这 种 协 定 ( 即 SLIP) 就 应 运 而 生 。

  SLIP协 定 浅 显 易 懂 , 细 节 请 见 RFC 1055的 说 明 ; 简 单 地 说 , 它 包 括 了 送 方 的 资 料 转 换 以 及 收 方 的 资 料 还 原 , 说 明 如 下 :

送 方 动 作 - 资 料 转 换

资 料 形 态 转 变 成 为
END(0xC0) ESC + ESC_END 即 0xDB + 0xDC
ESC(0xDB) ESC + ESC_ESC 即 0xDB + 0xDD
其 它 资 料 保 持 不 变
表 一 SLIP送 方 动 作 - 资 料 转 换

  送 方 首 先 会 把 资 料 做 转 换 , 如 表 一 , 接 着 送 出 END( 0xC0, 不 必 再 做 转 换 ) 来 代 表 此 IP封 包 结 束 , 然 後 送 出 封 包 就 可 以 了 。

收 方 动 作 - 资 料 还 原

  而 收 方 把 从 送 方 来 的 资 料 还 原 即 可 , 也 就 是 去 求 表 一 的 反 函 数 , 如 表 二 :

收 到 的 资 料 还 原 成
若 为 ESC(0xDB), 再 去 收 1个 byte 
如 果 是 ESC_END(0xDC) END(0xC0)
如 果 是 ESC_ESC(0xDD) ESC(0xDB)
若 为 END(0xC0) 封 包 结 束
其 他 资 料 保 持 不 变
表 二 SLIP收 方 动 作 - 资 料 还 原

  那 麽 为 什 麽 选 择 END( 0xC0) 与 ESC ( 0xDB) 来 转 换 呢 ? 可 能 是 因 为 IP与 上 层 的 协 定 或 协 定 所 负 载 的 资 料 , 较 少 使 用 这 两 种 byte吧 ! 而 SLIP这 个 协 定 也 说 明 了 如 何 把 一 个 控 制 位 元 ( END) 加 入 封 包 送 出 , 而 收 方 把 封 包 还 原 成 原 来 的 样 子 。

1、 Linux环 境 下 的 SLIP Server

  严 格 说 来 SLIP Server并 不 能 称 为 Server, 因 为 它 只 负 责 资 料 连 结 层 的 点 到 点 的 连 结 , 不 过 叫 Server也 没 甚 麽 关 系 , 反 正 很 多 学 术 名 词 都 已 经 被 泛 电 脑 化 与 生 活 化 , 最 终 目 的 只 要 使 用 者 能 容 易 上 手 即 可 !

  为 什 麽 选 择 Linux为 我 们 架 SLIP Server的 环 境 呢 ? 笔 者 认 为 最 大 的 因 素 是 Linux的 通 讯 功 能 很 强 悍 , 具 有 完 整 的 TCP/IP网 路 支 援 , 而 且 Linux又 有 原 始 程 式 帮 我 们 Know How, 更 重 要 的 是 , 它 是 免 费 的 , 不 像 别 种 作 业 系 统 或 SLIP Terminal Server还 需 要 另 外 的 投 资 , 当 然 是 选 择 用 Linux来 架 SLIP Server罗 !

  那 麽 要 在 Linux上 架 SLIP Server要 有 怎 样 的 配 备 才 行 呢 ? 基 本 上 Linux Kernel 的 版 本 大 於 1.2.0即 可 , 因 为 旧 版 的 Kernel 在 routing的 功 能 上 似 乎 有 bug, 所 以 最 好 用 较 新 的 版 本 ; 同 时 该 版 的 Kernel也 应 该 要 有 支 援 SLIP以 及 IP_FORWARD, 因 为 若 没 有 IP_FORWARD, Kernel会 把 不 认 识 的 IP 封 包 去 掉 , 而 不 会 帮 它 绕 路 , 所 以 就 算 使 用 者 拨 号 进 来 , 封 包 也 routing不 出 去 ; 上 述 设 定 如 果 有 缺 少 一 样 , 请 设 定 CONFIG_SLIP =y、 CONFIG_SLIP_COMPRESSED=y 、 CONFIG_IP_FORWARD=y, 然 後 重 新 编 译 Kernel, 要 不 然 接 下 来 的 SLIP Server 不 管 您 怎 麽 架 , 您 绝 对 架 不 起 来 的 。

2、 先 前 预 备 动 作

( 1) 申 请 两 个 IP Address
一 个 给 SLIP Server用 , 另 一 个 给 远 端 使 用 者 使 用 , 千 万 不 要 随 便 拿 两 个 IP Address, 因 为 若 有 两 方 的 IP Address 一 样 , 这 会 造 成 两 方 的 TCP/IP网 路 运 作 不 正 常 的 , 害 人 又 害 己 的 。 这 个 SLIP Server与 Client的 IP Address( YYYY 与 ZZZZ) 是 和 原 先 主 机 的 IP Address ( XXXX) 是 不 一 样 的 , 如 图 一

( 2) NULL Modem
NULL Modem可 帮 助 我 们 模 拟 Modem的 功 能 , 这 样 做 优 点 满 多 的 , 比 方 说 可 省 去 Modem或 电 话 线 等 实 际 设 备 , 而 且 在 模 拟 时 也 省 去 拨 号 等 动 作 , 可 减 轻 我 们 等 待 的 时 间 , 有 兴 趣 架 站 的 朋 友 , 可 先 用 此 法 模 拟 , 如 图 一 ; 至 於 正 式 上 线 再 把 它 改 为 用 modem拨 接 的 方 式 , 如 此 一 来 , 就 可 省 去 不 少 电 话 费 喔 ! 至 於 NULL Modem的 细 节 , 请 见 Linux的 相 关 FAQ。

( 3) COS与 Modem
若 您 想 去 模 拟 真 正 拨 号 上 线 的 方 式 , 那 麽 您 可 考 虑 使 用 图 二 的 方 法 。 不 过 , 您 必 须 要 有 一 台 简 易 的 交 换 机 ( COS) 才 行 ; 这 里 modem与 RS232服 务 程 式 ( 如 以 下 讨 论 的 /sbin/agetty) 必 须 一 致 才 行 , 同 时 可 以 把 铃 响 几 声 後 进 入 回 应 模 式 ( ATS0) 的 值 设 为 1或 2, 以 便 我 们 在 try时 能 减 少 等 待 时 间 , 最 後 别 忘 记 把 这 些 设 定 值 写 回 Modem, 下 次 重 开 机 就 不 必 重 新 设 定 啦 !

( 4) SLIP 的 模 拟 软 体
使 用 者 端 要 具 备 有 SLIP的 模 拟 软 体 , 如 : DOS下 的 slipper.exe或 Trumpet Winsock, 这 是 要 把 SLIP封 包 或 原 始 资 料 做 转 换 或 还 原 的 。

3、 把 sliplogin.tar给 解 开 , 然 後 敲 入 make install

  系 统 会 开 始 编 译 sliplogin.c这 支 程 式 , 成 功 後 把 它 的 执 行 档 copy至 /sbin目 录 下 , 同 时 会 把 sliplogin所 用 到 的 相 关 设 定 档 copy至 /etc 的 目 录 下 。

4、 开 始 设 定 相 关 档 案

/etc/inittab

/etc/password
使 用 者 输 入 的 username在 此 获 得 确 认 , 如 以 下 的 两 支 帐 号 , 若 输 入 slip则 该 使 用 者 进 入 slip模 式 ; 若 输 入 cslip则 该 使 用 者 进 入 cslip ( compressed SLIP) 模 式 :


slip::502:101::/tmp:/sbin/sliplogin

cslip::503:101::/tmp:/sbin/sliplogin

  请 注 意 , user ID必 须 不 一 样 , 如 上 例 slip为 502而 cslip为 503; 但 grounp ID须 设 为 一 致 , 如 上 例 均 为 101, 有 没 有 密 码 随 个 人 喜 爱 , 上 例 没 设 ; 如 果 都 正 确 的 话 , 使 用 者 login之 後 会 呼 叫 slip server来 服 务 该 使 用 者 , 即 /sbin/sliplogin该 支 程 式 。

/sbin/sliplogin
SLIP Server的 执 行 档 , 负 责 slip client环 境 的 设 定 , sliplogin的 使 用 权 限 设 为 4750, 系 统 比 较 安 全 。

/etc/slip.hosts
sliplogin会 从 /etc/slip.hosts这 个 档 案 抓 取 该 使 用 者 所 需 的 设 定 , 如 下 例 , 若 使 用 者 为 slip的 话 , 他 的 Slip Server Address为 148 .5.3.211而 他 的 IP Address为 148.5.3.212, 子 网 路 遮 罩 为 0xffff0000( 小 弟 公 司 网 路 为 Class B) , 模 式 为 slip; 同 理 , 输 入 cslip 是 选 择 压 缩 式 ( compressed) 的 SLIP协 定 ( CSLIP) 。


slip 148.5.3.211 148.5.3.212 0xffff0000 normal

cslip 148.5.3.211 148.5.3.213 0xffff0000 compressed

etc/slip.tty
设 定 dynamic IP address的 设 定 档 , 若 要 使 用 , slip.hosts中 必 须 设 定 为 DYNAMIC。

/etc/slip.login.slip 或 /etc/slip.login
使 用 者 进 入 时 的 设 定 档 , 型 态 须 为 可 执 行 , sliplogin会 call它 来 设 定 网 路 介 面 , 系 统 先 会 找 slip.login.+「 使 用 者 名 称 」 , 如 username为 slip的 话 , 系 统 会 去 找 slip.login.slip; 如 果 找 不 到 就 用 slip.login 来 作 为 一 般 的 设 定 。


#!/bin/sh-

# generic login file for a slip line.  sliplogin invokes this with the para.:

#( 1) slipunit( 2) ttyspeed( 3) pid  ( 4) loginname( 5) local-addr 

#( 6)  remote-addr( 7) mask ( 8) opt-args

#设 定 网 路 卡 与 RS232介 面 的 关 系 /sbin/

ifconfig $1 $5 pointopoint $6 mtu 1500 arp -trailers up

#建 立 使 用 者 IP Address的 绕 路 表 

/sbin/route add $6 $1

#

#建 立 arp表 , 如 /sbin/arp -s $6 00:00:c0:98:c1:4c pub

# 00:00:c0:98:c1:4c 为 笔 者 网 路 卡 的 实 体 位 址 

/sib/arp -s $ 6  [您 网 路 卡 上 的 实 体 位 址 ]  pub

#

#Your own game like a timeout or logging.

echo kill $3 | /usr/bin/at now + 30 minutes

#Really important ! Don’ t delete this exit 0

exit 0

etc/slip.logout
离 开 时 系 统 的 设 定 档 , 型 态 须 为 可 执 行 , sliplogin会 call它 来 重 设 网 路 介 面 , 系 统 会 先 找 slip.logout.+「 使 用 者 名 称 」 ; 如 果 找 不 到 就 用 slip.logout来 作 为 一 般 离 开 时 的 设 定 。


#!/bin/sh -

#( 1) slipunit( 2) ttyspeed

 ( 3) loginname( 4) local-addr

#( 5) remote-addr ( 6) mask ( 7) opt-args

#

/sbin/ifconfig $1 down

/sbin/route del $5

#in case you have an ethernet card 

#/sbin/arp -d $5

exit 0

  接 下 来 笔 者 再 把 这 些 设 定 档 整 理 出 来 , 希 望 读 者 能 更 清 楚 了 解 它 们 的 设 定 :

◆slip.hosts

#

# login local-addr   remote-addr   netmask   opt1( slipmode)   opt2 ...

# valid slipmodes: normal,compressed,ax25,6bit,auto

#

# Example:

#          slip,cslip and dynamic need to be in /etc/passwd

#

slip     148.5.3.211     148.5.3.212     0xffff0000      normal

cslip    148.5.3.211     148.5.3.213     0xffff0000      compressed

dynamic 148.5.3.211     DYNAMIC      0xffff0000      compressed

  当 使 用 者 为 slip时 , 他 的 IP Address为 148.5.3.212; 若 输 入 cslip, 所 采 用 的 是 CSLIP模 式 , IP Address为 148.5.3.213; 若 输 入 dynamic, 也 是 采 用 CSLIP模 式 , 不 过 IP Address并 没 有 固 定 , 因 为 它 属 於 DYNAMIC模 式 , 这 时 候 IP Address是 由 slip.tty来 决 定 的 。

◆slip.tty

# slip.tty    tty -> IP address mappings for dynamic SLIP

# format: /dev/tty?? xxx.xxx.xxx.xxx

# can’ t use .255 ( broadcast address)  so start at 254 and work down

# this is assuming you started numbering your machines at .1 and up.

# it doesn’ t actually MATTER, but I like it this way. :) 

# NOTE: don’ t use these example addresses, they have to be changed to 

# IP’ s that are valid for your network!

# NOTE2: don’ t use these loopback adresses if you have a real IP address

/dev/ttyS0      148.5.3.212

/dev/ttyS1      148.5.3.213

  表 示 若 由 com1( ttyS0) 上 线 , 使 用 者 的 IP Address为 148.5.3.212; 同 理 , 若 他 从 com2( ttyS1) 上 线 , 他 的 IP Address为 148.5.3.213; 通 常 来 说 , 使 用 者 只 晓 得 SLIP Server的 一 支 代 表 的 电 话 号 码 , 反 正 电 信 局 会 自 动 帮 使 用 者 跳 号 , 而 连 上 之 後 , 再 根 据 该 支 电 话 号 码 所 对 应 的 modem与 RS232, 接 着 决 定 出 comX或 ttyS X , 再 根 据 slip.tty我 们 就 可 决 定 IP Address了 。 这 个 SLIP Server分 配 给 我 们 的 IP Address就 是 我 们 被 分 配 到 的 Internet上 的 独 立 节 点 位 址 , 我 们 可 以 一 直 使 用 到 断 线 为 止 。

◆slip.login

#!/bin/sh -

#

#       @( #) slip.login  5.1 ( Berkeley)  7/1/90

#

# generic login file for a slip line.  sliplogin invokes this with

# the parameters:

#      1        2      3      4         5          6        7     8-n

#   slipunit ttyspeed pid loginname local-addr remote-addr mask opt-args

#

/sbin/ifconfig $1 $5 pointopoint $6 mtu 1500 arp -trailers up

/sbin/route add $6 $1

#in case you have an ethernet card this will announce the slip client

#xx:xx:xx:xx has to be replaced by your hardware address

#/sbin/arp -s $6 xx:xx:xx:xx pub

/sbin/arp -s $6 00:00:c0:98:c1:4c pub

exit 0

  不 管 使 用 者 是 以 那 种 模 式 登 录 至 SLIP Server, sliplogin会 呼 叫 slip.login来 设 定 网 路 介 面 、 绕 路 表 、 ARP表 等 。

◆ slip.logout

#!/bin/sh -

#

#      1        2         3         4          5        6     7-n

#   slipunit ttyspeed loginname local-addr remote-addr mask opt-args

#

/sbin/ifconfig $1 down

/sbin/route del $5

#in case you have an ethernet card 

/sbin/arp -d $5

exit 0

  当 使 用 者 离 开 时 , sliplogin会 呼 叫 slip.logout来 把 方 才 登 录 时 的 介 面 重 设 。

◆password
slip::502:101:slip:/tmp:/sbin/sliplogin cslip::503:101:cslip:/tmp:/sbin/sliplogin dynamic::504:101:dynamic:/tmp:/sbin/sliplogin

  使 用 者 都 必 须 在 password档 案 下 定 义 , 这 样 才 能 登 录 进 来 。 例 如 : 上 述 slip模 式 下 的 “ slip” 使 用 者 , cslip模 式 下 的 “ cslip” 使 用 者 , DYNAMIC模 式 下 的 “ dynamic” 使 用 者 。

◆inittab

# Serial lines

#s1: 45: respawn: /sbin/agetty 19200 ttyS0 vt100

#s2: 45: respawn: /sbin/agetty 19200 ttyS1 vt100

# Dialup lines

d1: 45: respawn: /sbin/agetty -mt60 19200,9600,2400,1200 ttyS0 vt100

d2: 45: respawn: /sbin/agetty -mt60 19200,9600,2400,1200 ttyS1 vt100

  开 放 两 支 拨 接 线 给 外 面 的 使 用 者 , 他 们 分 别 接 在 com1与 com2, 即 ttyS0与 ttyS1。

5、 开 始 模 拟

  如 图 一图 二 , 我 们 假 设 主 机 的 IP Address 为 148.5.3.83, Slip Server的 IP Address 为 148.5.3.211, 给 使 用 者 的 IP Address为 148.5.3.212, 成 功 连 线 後 , 我 们 所 建 立 的 绕 路 表 为 :

● 核 心 绕 路 表 ( 执 行 route)
Destination Gateway Genmask Flags Metric Ref Use Iface
       e
148.5.3.212 255.255.255.255 UH * 0 0 90 sl0
148.5.0.0 * 255.255.0.0 U 0 0 141 eth0
127.0.0.0 * 255.0.0.0 U 0 0 88 lo
default 148.5.1.2 * UG 0 0 0 eth0
表 叁 核 心 绕 路 表

● 网 路 介 面 ( 执 行 ifconfig)

lo  Link encap Local Loopback  

          inet addr 127.0.0.1  Bcast 127.255.255.255  Mask 255.0.0.0

          UP LOOPBACK RUNNING  MTU 2000  Metric 1

          RX packets 0 errors 0 dropped 0 overruns 0

          TX packets 0 errors 0 dropped 0 overruns 0



sl0  Link encap UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

          inet addr 148.5.3.211  P-t-P 148.5.3.212  Mask 255.255.0.0

          UP POINTOPOINT NOTRAILERS RUNNING  MTU 1500  Metric 1

          RX packets 67 errors 0 dropped 0 overruns 0

          TX packets 47 errors 0 dropped 0 overruns 0

eth0  Link encap UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

          inet addr 148.5.3.86  Bcast 148.5.255.255  Mask 255.255.0.0

          UP BROADCAST RUNNING  MTU 1500  Metric 1

          RX packets 1544 errors 0 dropped 164 overruns 0

          TX packets 70 errors 0 dropped 0 overruns 0

6、 SLIP Server 启 动 顺 序

  当 modem的 DCD信 号 出 现 , 即 用 modem 成 功 的 上 线 或 双 方 接 上 NULL Modem, 这 时 /etc/inittab所 定 义 的 tty服 务 程 式 agetty 就 会 呼 叫 /bin/login, 要 求 输 入 user name, 这 时 我 们 敲 入 slip、 cslip或 dynamic, /bin/login就 会 去 查 /etc/passwd, 如 果 确 认 成 功 就 会 执 行 /sbin/sliplogin, 这 时 slip.hosts、 slip.tty( 若 为 dynamic SLIP) 等 设 定 档 会 被 参 考 , 如 果 成 功 , SLIP Ser-ver会 送 出 slip server is 148.5.3.211 , you are 148.5.3.212或 SLIP Server is 148.5.3. 211 , you are 148.5.3.213给 SLIP Client , 148.5.3.212或 148.5.3.213就 是 我 们 的 IP Address, 之 後 SLIP Server再 去 call slip.login.slip或 slip.login来 设 定 网 路 介 面 ( 用 ifconfig) 、 绕 路 表 ( 用 route) 与 arp的 cache( 用 arp) , 这 时 SLIP Server就 可 以 用 啦 ! ( 请 注 意 , SLIP模 式 下 的 Client端 的 Default Getway与 Netmask都 被 disable掉 了 , 由 SLIP Server来 帮 您 转 换 ) 。

  以 Trumpet Winsock来 说 , 若 使 用 者 这 时 按 ESC键 , 系 统 出 现 SLIP ENABLED , 那 麽 就 进 入 slip mode, 若 您 所 连 上 的 是 属 於 dynamic SLIP, 那 麽 就 请 您 重 新 设 定 IP Address, 然 後 选 择 离 开 再 进 入 , 这 时 您 的 PC就 成 为 Internet上 一 个 独 立 的 节 点 , 拥 有 自 己 的 IP Address, 这 时 Winsock应 用 程 式 都 可 以 开 始 运 作 , 而 sliplogin退 居 幕 後 , 改 为 监 督 电 话 线 的 情 况 。

7、 离 开 SLIP Server

若 使 用 者 离 线 或 当 线 , modem的 DCD信 号 会 通 知 sliplogin, sliplogin就 会 执 行 slip.logout.slip或 slip.logout, sliplogin因 此 结 束 , 接 下 来 又 回 到 原 先 的 agetty的 控 制 , 继 续 服 务 下 位 使 用 者 , 这 就 是 SLIP Server的 运 作 方 式 。

图 叁 SLIP Server上 线 啦

总 结

  一 般 人 喜 欢 用 PPP上 线 , 那 是 因 为 设 定 简 便 , 不 像 Dynamic( C) SLIP还 必 须 重 新 设 定 IP Address。 不 过 , 根 据 理 论 与 实 际 的 情 况 , 在 线 路 品 质 不 差 的 情 况 之 下 , CSLIP 的 效 能 还 是 比 PPP好 , 这 也 许 是 CSLIP还 是 无 法 被 PPP取 代 的 原 因 , CSLIP的 TCP表 头 压 缩 公 式 请 见 RFC 1144。

  至 於 SLIP Server架 好 後 , 剩 下 来 的 就 是 使 用 者 连 线 时 间 的 计 算 , 有 兴 趣 想 当 ISP 的 朋 友 不 妨 想 想 看 , 因 为 这 牵 涉 到 收 费 的 问 题 ! 至 於 SLIP Server的 内 部 运 作 细 节 , 请 参 考 原 始 程 式 sliplogin.c与 Linux核 心 中 的 网 路 部 份 。

( 笔 者 任 职 於 台 湾 金 讯 电 子 股 份 有 限 公 司 E-Mail:derek_m1@verifone.com