Kodama's home / tips.
port-owner root port-group uucp port-mode 0664 port ttyS0 data-only y modem-type data init-chat "" atz OK ats0=0q0&d3&c1 OK
Q0 result code on V1 command は単語形式 E1 echo on X3 速度表示あり, busy ト−ンあり s0=0 自動着信までの回数 &d3 ER on->off でソフトリセット &c1 相手モデムのキャリアに従う
#/FIDO/ uucp fido /usr/local/lib/fnet/ifcico @ /AutoPPP/ - a_ppp /usr/local/sbin/ppxpd -direct ppp #* - - /bin/login @
# Serial lines s0:2345:respawn:/usr/local/sbin/mgetty ttyS0inittab 編集後, init q する.PPxP インスト−ル
/usr/local/etc/ppxp/conf/ppp
source default # source modem set LOG.FILE /var/log/ppxp/ppp.log set LOG.LEVEL PHASE FSM OS AUTH PRIVATE CP CHAT CONS set IP.REMOTE 192.168.254.0/24 set IP.SLOCAL yes set IP.NETMASK 255.255.255.0 set IP.UP hrouteup set IP.DOWN hroutedown set AUTH.PROTO PAP CHAP set AUTH.SERVER file set IP.PROXYARP yes set IP.AUTOROUTE yes set IP.RESOLV no set IP.DNSRELAY noc.f. YOSHINORI KANAO さんのペ−ジ を参考にしました. PPP サ−バ−メモ
ppxp-0.99120923.tar.gz を用いて, set AUTH.PROTO PAP と set AUTH.SERVER file の宣言をして, PAP 認証で /usr/local/etc/ppxp/passwd ファイルを参照させる場合, ソ−スの修正が必要.
ソ−スの pap.c の PapCheck 関数中の AuthCmp と SetPasswd の実行順に注意. SetPasswd の 後に AuthCmp するように変更しないと認証に失敗する.
原因は, pcp.c の AuthCmp からの呼び出し関係が以下のようになっており:
PapCheck(pap.c)---AuthCmp(auth.c)---AuthDecode(auth.c)AuthDecode 中で, SetPasswd で設定される変数 cPwd を参照している点にある.pap.c の PapCheck の一部を以下のように修正すると良い.
オリジナル
case AUTH_SERVER_FILE: pwp = GetPasswdByName(user); if (!pwp || !pwp->passwd || !AuthCmp(passwd)) return(FALSE); SetPasswd(pwp->entry, pwp->name, pwp->passwd, pwp->key);修正後
case AUTH_SERVER_FILE: pwp = GetPasswdByName(user); if (!pwp || !pwp->passwd) return(FALSE); SetPasswd(pwp->entry, pwp->name, pwp->passwd, pwp->key); if (!AuthCmp(passwd)) return(FALSE);メモ
LOG.LEVEL では以下が指定可能, PHASE(notice), FSM, OS, SYS, AUTH(認証記録), CHAT, CP, PRIVATE(接続名を表示), SECRET(password表示), TIMER(debug用), WARN(debug用), CONS(command のメッセ−ジ,debug用), DUMP(debug用) (c.f. log.h, conslle.c)
LOG.FILE で設定しているが, 実際には /var/log/messages に出る. なんで?
mgetty無しの設定法
PPxP をインスト−ルする/usr/local/etc/ppxp/conf/gettyppp
gettyppp スクリプトを作成する. source が modem になっている点に注意.# source default source modem set LOG.LEVEL PHASE FSM OS AUTH PRIVATE CP CHAT CONS set IP.REMOTE 192.168.254.0/32 set IP.SLOCAL yes set IP.NETMASK 255.255.255.255 set IP.UP hrouteup set IP.DOWN hroutedown set AUTH.PROTO PAP CHAP set AUTH.SERVER file set IP.PROXYARP yes set IP.AUTOROUTE yes set IP.RESOLV no set IP.DNSRELAY no/etc/inittab
# Serial lines s0:2345:respawn:/usr/local/sbin/ppxpd -getty /dev/ttyS0 gettypppinittab 編集後, init q する.passwd ファイル
接続アカウントと login アカウントを区別したかったので, AUTH.SERVER file を指定した. 接続の認証は /usr/local/etc/ppxp/passwd ファイルを参照して行う. 接続user を /etc/passwd に登録する必要はない. パスワ−ドは Base64変換 又は平文で書かれているので, ファイルの permission に注意. 次のようなスクリプトで作成すると良い. あまり一般性は考えていないので, 使う前に見直すこと. 最近の趣味で Ruby でやってみた. Base64エンコ−ドも組み込むと良いかもね.#!/usr/local/bin/ruby S0="0123456789" S1 = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" S2 = "+-/*=,.<>[]{}()@?_!|~^$%&" srand # select a randum char fron str. def rch(str) return str[rand(str.size)] end def genPW(name) s="12345678" s[0]=rch(S1); s[1]=rch(S0); s[2]=rch(S0+S1+S2); s[3]=rch(S2) s[4]=rch(S0+S1+S2); s[5]=rch(S0+S1+S2); s[6]=rch(S0+S1+S2); s[7]=rch(S0+S1) #printf "useradd -g users -s /dev/null -p '%s' %s\n",s,ARGV[0] ## print PPxP passwd file # entry:user:password:flag:group:script printf "%s:%s:%s:%s:%s:%s\n","ppp",name,s,"00000000","","" end ### use as: $0 [UserId] if ARGV.size>0; ARGV.each{|n| genPW(n)} else # 100人分一気に作る. for i in 1..100; n=sprintf("%03d",i); genPW(n); end endIP-masquerade
今までの作業で, PPPクライアントから PPPサ−バ−に ping できるように なっているはず. 以下で, ネットワ−クに出て行けるようにする./etc/rc.d/rc.local
. /etc/rc.d/rc.ipmasq/etc/rc.d/rc.ipmasq
# ip-masquerade for PPP /sbin/ipfwadm -F -f /sbin/ipfwadm -A -f /sbin/ipfwadm -I -f /sbin/ipfwadm -O -f /sbin/ipfwadm -F -a m -S 192.168.254.0/24 /sbin/modprobe ip_masq_ftp.o動作が確認できたら, 適当に制限すること.
Kodama's home / tips.