如何让FreeBSD成为PPP拨接服务器?

/ns/wz/sys/data/20020820033649.htm

特定Modem对特定IP


本文举例如何以kernel mode PPP, 即pppd(8), 提供PPP 拨接伺服器的功能。

请注意所用MODEM必须是可以
1. auto answer incoming call, and
2. can auto reset when DTR signal drops.

ZZ.
AA.让kernel 支援ppp device
BB.设定MODEM
CC.设定/etc/ttys
DD.决定PPP 两端的IP
EE.设定pppd的options
FF.怎麽用?


AA.
请确定您所用的kernel 支援ppp device. 如果没有的话您必须修改它。
(FreeBSD handbook, 5.3.8. Networking, pseudo-device ppp number)
如果有支援,那麽打ifconfig -a 大概会有如下这样的讯息:

ppp0: flags=8010 mtu 1500
ppp1: flags=8010 mtu 1500

显示有两个ppp device。


BB.
接下来请参照modem的说明书将他设定为前述的:
1. auto answer.
2. Reset when DTR signal drops, 以及
3. 关掉command line echo.
4. 不要display result code.

当然您必须要先有适当的cable连接modem 和主机的RS-232 port。
连接好了之後可以用cu 指令来跟modem讲话(通常只有root才可以用cu):
# cu -l /dev/cuaa1 -s 115200
connected

当cu 打开/dev/cuaa1 时,连接cuaa1 的modem 的DTR灯会亮。
在cu 下,可打~. 跳出。


CC.
您必须知道如何接序列埠的terminal,(FreeBSD handbook, 11. Serial
Communications,
11.2.3. Configuration)
例如/etc/ttys中:

# Serial terminals
ttyd0 "/usr/libexec/getty std.9600" unknown off secure
ttyd1 "/usr/libexec/getty std.115200" vt100 on insecure
ttyd2 "/usr/libexec/getty std.9600" unknown off secure
ttyd3 "/usr/libexec/getty std.9600" unknown off secure

设定ttyd1使能 上相连的terminal,连线速度(transmittion speed between modem
and
the interface)固定115200bps,当作vt100 terminal 对待,不允许root login。

如果您的modem 已经 上com2 (ttyd1),这时kill -1 1 就会见到modem 上的DTR灯亮

表示主机已经待命。如果modem DTR灯没有亮起来,那就。。。。
至此您可以用普通terminal 模拟程式拨进那台modem 看看,拨通之後应该可以看到
FreeBSD的login画面。 login 进去後,再logout, 则modem 挂断。


DD.
每一个dialup连上後要用掉两个IP,local端与remote端各一,也就是
server端与client端各一。除非您拥有正式核发的IPs,不然请千万从
Private IP里挑选您喜欢的来用。

10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)

比如设server端为 172.16.0.10
client端为 172.16.0.20
这样为 一对,一个client拨上来要用掉 一对 IP。
假如您提供两个或三个MODEM让人拨接,那麽就需要两对或三对IP。


EE.
设定/etc/ppp/options 档。
/etc/ppp/options 内容设定了pppd(8)启动後的动作,options 可以在
命令行里指定,不过/etc/ppp/options这个档必须是存在的。它可用来当作
对各个ttyd?的default设定,ttyd?的个别设定可以放在/etc/ppp/options.ttyd?
之中。

/etc/ppp/options
crtscts # Hardware flow control
netmask 255.255.255.0 # netmask ( not required 因为好像改了也没用...呵)
domain abc.efg.net # your domain
passive # wait for LCP
modem # modem line

/etc/ppp/options.ttyd1
172.16.0.10:172.16.0.20 # local:remote IP
# i.e. server-side will get IP 172.16.0.10
# client-side will get IP 172.16.0.20

FF.
拨通後,login,打pppd就开始ppp pocket-mode.

=====================================================================

From: eddie@eddie.seed.net.tw (Eddie Wang)
Newsgroups: tw.bbs.comp.386bsd
Subject: 另一个架ppp server的方式
Date: Sun, 10 Aug 1997 14:08:00 GMT

在这提供一种简单架设ppp server的方法,主要是利用
danny@freebsd.org 所提供的pppkit.tgz来使FreeBSD
成为一个使用系统密码档及pap方式认证的terminal server。
大家可以在下列地方取得pppkit.tgz
ftp://ftp.hilink.com.au/pub/FreeBSD/pppkit.tgz or
ftp://freebsd.csie.nctu.edu.tw/pub/jdli/collect/ppp/pppkit.tgz
除此之外我还参考了handbook第11、12章以及FAQ第十章,
有兴趣的人可顺便看一下。
我的系统是 2.2 stable (0803)
cuaa0==>GVC 宝时捷33.6k
cuaa1==>创巨 modem blaster 28.8k
以下的说明皆以我的系统为范例,请自行依需要修改。

解开pppkit.tgz後的档案如下:
pppkit/etc/ppp/ppp.ports
指定由ttyxx拨入後将得到的ip

pppkit/etc/ppp/ppp.disabled
设定哪些人不可用pap ppp的方式拨入

pppkit/etc/ppp/options
设定给拨入端的DNS server

pppkit/etc/ppp/ppp.users
设定给某些特定的user固定ip,前提是这些user用一般的
Login:/Password:提示符号login的而不是用pap(设定方法请
参考README)

pppkit/etc/gettytab
参考用的

pppkit/bin/ppplogin.sh
提供给ppp user的login shell并且也让getty去启动pppd

pppkit/bin/fancyppplogin.sh
同上

pppkit/usr/sbin/pppd-22
提供给2.2+使用者的pppd

pppkit/usr/sbin/pppd-215
给2.1.5+的pppd

pppkit/usr/libexec/getty
2.1.5的user需要将原来的getty换成这个

pppkit/README
说明文件,我这篇post 80%+都在里面有说明

开始吧
* 先确定kernel中有ppp interface,并把modem接好,power on。

* cp pppkit/usr/sbin/pppd-22 /usr/sbin/pppd
(这是README说的,我没做:p )
chown root.bin /usr/sbin/pppd ; chmod 4555 /usr/sbin/pppd

* cp pppkit/etc/ppp/* /etc/ppp

* 修改/etc/ppp/options 将给拨入端的的dns server ip填入
假如你预备将ppp0的ip设定成和你网卡的ip相同的话,请加上
proxyarp这个keyword

* 修改/etc/ppp/ppp.ports 我只预备将ttyd1提供拨入,因此只要
设定一行"d1 xxx.xxx.xxx.xxx"

* cp pppkit/bin/ppplogin.sh /usr/local/bin
并修改其中 LOCAL=xxx.xxx.xxx.xxx 将xxx....换成你预备指定
给local端的ip(如上所说,可设定成和网卡相同)

* 编辑一个/etc/ppp/ppp.shells 格式如同/etc/shells
至少要加上/usr/local/bin/ppplogin.sh以及你预备提供拨接服务
的user所用的shell

* 看看/etc/ppp/ppp.disabled中少列了哪些你不想让他拨入的,加上去。

* 将/etc/ttys中关於ttyd1那行改成:
ttyd1 "/usr/libexec/getty std.57600" dialup on insecure

* 将/etc/gettytab中开头是std.57600那项设定改成:
std.57600|57600-baud:\
: np:sp#57600:pp=/usr/local/bin/ppplogin.sh

大致设定完成了,现在请 kill -HUP 1;ps -ax应该会看到这行
13143 ?? I 0:00.01 /usr/libexec/getty std.57600 ttyd1

现在要设定数据机了,handbook上说要上数据机能够正常提供dialin
的话必须:
1.CD asserted when connected (&C1)
2.DTR asserted for operation; dropping DTR hangs up line &
resets modem (&D2)
3.CTS transmitted data flow control (&K3)
4.Disable XON/XOFF flow control (找不到:p,不过这项在rc.serial
应该已经是预设的了)
5.RTS received data flow control (&K3)
6.Quiet mode (no result codes) (Q1)
7.No command echo (E0)
另外我想要把这些设定储存起来 (&W0)
以及要modem在响一声後自动接电话 (S0=1)
翻翻modem的手册,我的modem blaster应设定如下:
AT&C1&D2&K3E0Q1S0=1&W0

要设定modem请先在/etc/remote中加上一行:
cuaa1:dv=/dev/cuaa1:br#57600:pa=none
然後就可以用tip cuaa1来设定了,设定完用"~."结束。

现在可以试拨看看了。在拨入端的设定和一般拨SEEDNet(非广告)
一样,不论是95,nt,or FreeBSD都很顺利。当初我在测试的时候
用cuaa0拨到ttyd1,然後用ifconfig -a去看..真是精采:)

以上如有疏漏之处,欢迎在板上指正。