Kodama's home / tips.

PPxP を用いた dial up サ−バ−

方針

tty の監視は mgetty で行い, 着信したら PPxP で PPP 接続を開始する. PPP 回線は 192.168.254.0/24 で行うが, PPP サ−バ−でアドレス変換(IP-masquerade)を行い, ネットワ−ク上にはこのアドレスは流さない. Plamo Linux/kernel2.0.38 での作業例.

kernel を再構築

kernel は 2.0.38 としてみた. IP-masquerade できるように注意. 解説は省略.

基本設定

普通にネットワ−クにアクセスできる程度には整備しておく. ネットワ−クサ−ビスは停止. /etc/hosts.allow は最小限に. login アカウントも管理作業用のみとしよう. 接続アカウントは ppxp に管理させるので, UNIX の login アカウントは不要. root login は無効にして, /etc/securetty も全て消し, 必要なら su しよう.

userlink インスト−ル

Plamo Linux だと /usr/src/modules にソ−スがあった. userlink.txt の記述に従ってインスト−ルする. kernel ソ−スを参照するので, 注意. /etc/rc.d/rc.local で userlink を有効にするため, /sbin/modprobe userlink を書き加える.

mgetty の設定

着信のみに徹するなら mgetty 無しで, ppxpd の getty モ−ドを用いても良い.

/usr/local/etc/mgetty+sendfax/mgetty.config

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 相手モデムのキャリアに従う

/usr/local/etc/mgetty+sendfax/login.config

AutoPPP を有効にする ppxpd を起動 ppp スクリプトを実行させる
#/FIDO/ uucp    fido    /usr/local/lib/fnet/ifcico @
/AutoPPP/ -     a_ppp   /usr/local/sbin/ppxpd -direct ppp
#*      -       -       /bin/login @

/etc/inittab

# Serial lines
s0:2345:respawn:/usr/local/sbin/mgetty ttyS0

inittab 編集後, 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 no
c.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 gettyppp

inittab 編集後, 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
end

IP-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.