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 |
其 它 资 料 | 保 持 不 变 |
送 方 首 先 会 把 资 料 做 转 换 , 如 表 一 , 接 着 送 出 END( 0xC0, 不 必 再 做 转 换 ) 来 代 表 此 IP封 包 结 束 , 然 後 送 出 封 包 就 可 以 了 。
收 方 动 作 - 资 料 还 原
而 收 方 把 从 送 方 来 的 资 料 还 原 即 可 , 也 就 是 去 求 表 一 的 反 函 数 , 如 表 二 :
收 到 的 资 料 | 还 原 成 |
---|---|
若 为 ESC(0xDB), 再 去 收 1个 byte | |
如 果 是 ESC_END(0xDC) | END(0xC0) |
如 果 是 ESC_ESC(0xDD) | ESC(0xDB) |
若 为 END(0xC0) | 封 包 结 束 |
其 他 资 料 | 保 持 不 变 |
那 麽 为 什 麽 选 择 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、 先 前 预 备 动 作
3、 把 sliplogin.tar给 解 开 , 然 後 敲 入 make install
系 统 会 开 始 编 译 sliplogin.c这 支 程 式 , 成 功 後 把 它 的 执 行 档 copy至 /sbin目 录 下 , 同 时 会 把 sliplogin所 用 到 的 相 关 设 定 档 copy至 /etc 的 目 录 下 。
4、 开 始 设 定 相 关 档 案
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该 支 程 式 。
slip 148.5.3.211 148.5.3.212 0xffff0000 normal cslip 148.5.3.211 148.5.3.213 0xffff0000 compressed |
#!/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 |
#!/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 |
接 下 来 笔 者 再 把 这 些 设 定 档 整 理 出 来 , 希 望 读 者 能 更 清 楚 了 解 它 们 的 设 定 :
# # 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 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上 的 独 立 节 点 位 址 , 我 们 可 以 一 直 使 用 到 断 线 为 止 。
#!/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表 等 。
#!/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模 式 下 的 “ slip” 使 用 者 , cslip模 式 下 的 “ cslip” 使 用 者 , DYNAMIC模 式 下 的 “ dynamic” 使 用 者 。
# 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, 成 功 连 线 後 , 我 们 所 建 立 的 绕 路 表 为 :
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 |
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的 运 作 方 式 。
总 结
一 般 人 喜 欢 用 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)