Last Update: "2005/04/27 09:04:29 makoto"
mgetty+sendfax
pppd サーバを作る mgetty
電話回線を使って外出先などから、自分の機械に接続出来るようにしておくと何かと便利な
ことがあります。/usr/pkgsrc/comms/mgetty-sendfax/ を使うと、そういう機能を追加出来ま
す。
ここで使う mgetty は、とても面白いソフトウェアで、modem への着信をずうっと監視して
いて、通常の Login:, ppp 接続, fax などを判別して着信を切換えてくれます。このうち
ppp で使う時には -DAUTO_PPP の設定で組立てられていることが必要ですが、pkgsrc で make
すると、それは既に組込済となっています。まず、/usr/pkgsrc/comms/mgetty-sendfax/ で
make と make install をしておきます。
設定の概要
設定に関係するものは次の四点です。
1. /dev/tty00 または /dev/tty01 モデムの接続を確認します。
2. /etc/ttys 上記 tty00 等を mgetty に監視させます
3. /usr/pkg/etc/mgetty+sendfax/mgetty.config mgetty の速度など
/usr/pkg/etc/mgetty+sendfax/login.config mgetty 切換の設定
4. /etc/ppp/options pppd の設定
/etc/ppp/pap-secrets pppd のパスワード
これらについて順を追って説明します。以下で cu という字が出て来ますが、他の機械
を呼ぶための道具で cu(1) に説明があります。Call Up の略です。
/etc/tty00 --モデム
1. /etc/tty00 または /etc/tty01 -- モデムについて
モデム口 (電話の印の書いてある口)、または内蔵モデム は /dev/tty00 で見えます。またプリ
ンタ口につないだ場合は /dev/tty01 で見えます。tty00 の場合、所有者が root.wheel になっ
ているので cu した時に Permission Denied になってしまいます。その時は (root で)
chown uucp.wheel /dev/tty00
としておきます。そうして同じく root になって、
cu -l /dev/tty00 -s 115200
のようにしてから at と入力すると OK が表示されてその口とモデムがつながっているかが確
認出来ます。( ~. で抜けて下さい)
利用する口 | tty 名 | 注 |
内蔵モデム | /etc/tty00 | 使うにはカーネルの変更(入替)が必要 |
モデム口 | /etc/tty00 | |
プリンタ口 | /etc/tty01 | |
内蔵モデムを使うには kernel の変更が必要ですので【内蔵モデムについて】の節を参照し
て下さい。
/etc/ttys
mgetty に モデムのつながった口を監視させるために /etc/ttys を変更します。上記の表
のうち、自分の使おうとしている口に対応して tty00 または tty01 の行を次のように変更し
ます。
tty00 "/usr/libexec/getty std.38400" vt100 off secure
↓
tty00 "/usr/pkg/sbin/mgetty" unknown on
あるいは debug が必要な時は、例えば
tty00 "/usr/pkg/sbin/mgetty -x 4" unknown on
などのように debug 水準を設定しておきます。
/etc/ttys を変更した時には init に、それをもう一度読むように kill -1 1 をして signal
を送ります。-x 4 を追加した時などには更に mgetty の方を kill します。
mgetty.config, login.config
これらは /etc の下ではなく /usr/pkg/etc/mgetty+sendfax/ の下のものを設定します。
mgetty.config はそのままでもいいはずですが、速度だけは変更しておきます。一例としては
次のようにします。
+-------- /usr/pkg/etc/mgetty+sendfax/mgetty.config --------
| speed 38400
| ↓
| speed 115200
+------------------------------------------------------------
login.config は ppp に使うだけなら、次のように実質一行だけを加えておきます。
+-------- /usr/pkg/etc/mgetty+sendfax/login.config ----------------
| # Automatic PPP startup on receipt of LCP configure request (AutoPPP).
| /AutoPPP/ - a_ppp /usr/sbin/pppd
+-------------------------------------------------------------------
これを少し説明しますと、
/AutoPPP/ の文字列自体は一種のおまじないです。「ppp で接続要求があった時には」の意味です。
- には通常は userid を指定しますが、ppp の時は不要ですので - と書いておきます。
a_ppp は utmp_entry と言って who や last で見た時に表示される名前で、何でもいいので
すが、こう書いておきます。そうして最後に
/usr/sbin/pppd を起動する、と指定します。
実際には、この後に pppd に渡す引数も書くことが出来るのですが、/etc/ppp/options にも同じ
内容が指定出来るので、ここの例では空にしています。
まずは login して見る
ppp の設定をする前に別の機械から電話をかけて見て、login: が表示されるか確認します。
どのような方法でもいいのですが、もし他の Unix 機からだったら、
# cu -l /dev/tty00 -s 115200
at ... OK と出る
atdt123-4567 ... 数字は電話番号です。御自分のものを使って下さい。
などのようにして見ます。ここで login: のような表示が出れば、ここまではうまく行ってい
ることになります。もし着信側で /var/log/mgetty.tty00 (等)を見張っていると、
08:49:32 y00 mgetty: experimental test release 1.1.26-Apr16
08:49:32 y00 check for lockfiles
08:49:32 y00 locking the line
08:49:32 y00 WARNING: DSR is off - modem turned off or bad cable?
08:49:32 y00 lowering DTR to reset Modem
08:49:33 y00 clean_line: only 500 of 907 bytes logged
08:49:33 y00 send: \dATQ0V1H0[0d]
08:49:33 y00 waiting for ``OK'' ** found **
08:49:33 y00 send: ATS0=0Q0&D3&C1[0d]
08:49:33 y00 waiting for ``OK'' ** found **
08:49:33 y00 mdm_send: 'ATI'
08:49:33 y00 Generic Rockwell modem (56000)
08:49:33 y00 mdm_send: 'ATI3'
08:49:34 y00 mdm_send: 'ATI4'
08:49:34 y00 additional info: 'Apple Internal Modem'
08:49:34 y00 modem quirks: 0004
08:49:34 y00 mdm_send: 'AT+FCLASS=2' -> OK
08:49:34 y00 mdm_send: 'AT+FCLASS=0' -> OK
08:49:34 y00 mdm_send: 'AT+FAA=1;+FCR=1' -> OK
08:49:34 y00 mdm_send: 'AT+FBOR=0' -> OK
08:49:34 y00 mdm_send: 'AT+FLID="49 115 xxxxxxxx"' -> OK
08:49:34 y00 mdm_send: 'AT+FDCC=1,5,0,2,0,0,0,0' -> OK
08:49:34 y00 waiting...
のような表示から
11:55:15 y00 wfr: waiting for ``RING''
11:55:15 y00 send: ATA[0d]
11:55:15 y00 waiting for ``CONNECT'' ** found **
11:55:35 y00 send:
11:55:35 y00 waiting for ``_'' ** found **
11:55:47 ##### data dev=tty00, pid=436, caller='none',
conn='115200', name='', cmd='/usr/bin/login', user='hogehoge'
のようになって接続元に foo!login: が表示されるはずです。この login: は mgetty 途中で
横取りした上で、表示しているのですが、普通に login 出来ます。では更に ppp 着信の設定
をします。
/etc/ppp/options
ここで使っている pppd というソフトウェアは発信にも着信にも使えて、殆んど対称的に動
作します。そのため、前に【ppp 接続について -- 手動】という節で、発信の方法で説明した
ppp の項も参考になります。以前の説明で、発信の時には、(相手の電話番号を指定して掛け
たのですから)そのつないだ相手が本物かは認証しないで信用する(noauth) としました。しか
し、今回のように、着信して来た場合には auth で「相手を認証する必要がある」という違い
はあります。例えば次のように指定します。/etc/ppp は初めは無いはずですので
mkdir /etc/ppp
しておきます。その上で、次のような内容を用意します。
+---------/etc/ppp/options --------------------
| +pap
| auth
| debug
| proxyarp
+----------------------------------------------
proxyarp は、「代理 ARP をする」という意味で 「Address Resolution Protocol が来た時
には代理で行なう。そうすると、Ethernet 側につながっているのと同じように見える」とい
う設定です。これは必要に応じて有無があります。
IPv6 対応には ipv6cp-use-persistent というのが使えませんでしたので次のようにすれば
いいかなと思いますが、あまりうまく行っていません。
+---------/etc/ppp/options --------------------
| +ipv6
| ipv6cp-use-ipaddr
| +pap
| auth
| debug
| proxyarp
+----------------------------------------------
/etc/ppp/pap-secrets
ppp 認証用の user_name, server_name, password または crypt() で暗号化したもの、ip
address の順に指定します。
+---------/etc/ppp/pap-secrets ----------------
| my_login * oYdufIp0r1Kd6 *
+----------------------------------------------
crypt() を使った暗号化については【ppp 接続について -- 手動】の節から始まる
【/etc/ppp/pap-secrets】認証の項目を参照して下さい。
確認方法
着信側で
tail -f /var/log/mgetty.tty00
のようにして見張っています。その中で、次のような文字があれば、pppd を起動する
ところまでは行っています。
##### data dev=tty00, pid=434, caller='none', conn='115200', name='',
cmd='/usr/sbin/pppd', user='/AutoPPP/'
cmd=' の後が /usr/bin/login では pppd に渡っていません。その時はまず、上に書いた
/usr/pkg/etc/mgetty+sendfax/login.config の設定を確認します。
僕の場合は
+-------
| * - - /usr/bin/login @
| /AutoPPP/ - a_ppp /usr/sbin/pppd
+-------
と書いてあって、/AutoPPP/ の前に * に一致しているのに気付くのに時間がかかったこと
があります。(表示の字が小さくて * を # と見ていました。それを
/usr/pkg/etc/mgetty+sendfax/mgetty.config の中で、
debug 8
として、やっと見付けたという経験をしてしまいました。)
+-------
| /AutoPPP/ - a_ppp /usr/sbin/pppd
| * - - /usr/bin/login @
+-------
|