6-4. ネットワ−クコマンドの仕組み '97 (1) TCP/IP ネットワ−ク * 通信路の確立 hostA から hostB へ何か通信をしようとする。例えば telnet hostB としよう。 通信す るためには、何らかの通信路が必要である。この通信路は糸電話と同じことである。糸電 話の丸い筒を通してオ−イとかやるのと同じである。 TCP/IP ネットワ−クではこの筒を ポ−トと呼び、たくさん用意されている。そして筒によっては、通信のタイプが決められ ていて、受け答えするためのプログラムが控えている。例えば telnet では相手側のポ− ト番号は 23 番で、telnetd デ−モンが起動されることになっている。 hostA hostB ------------------------------------ ------- ------- hostA から hostB にアクセスするとい | 1| |1 | うイメ−ジから一方向しかデ−タが流れ | 2| |2 | ないような気がするが、双方向に流れる。 | 3| |. | 1,2 .. は これはファイアウォ−ルのパケットフィ | .| |. | ポ−ト番号 ルタリングを理解する上で肝心である。 | 1100|―――――|23 | ------------------------------------ | | 糸電話 | | ------- ------- % telnet hostB → telnetd デ−モンで受ける << 通信路の確立 >> * デ−タ通信のイメ−ジ 上記でホスト2点間の通信路は確立された。ではどうやって TCP/IP ネットワ−クの中を デ−タは通っていくのか。hostA は hostB にデ−タを送るのに、ともかく hostG を通っ ていかなければならないことを知っている必要がある。EWS等のホストはIPアドレス で区別され、もっと具体的にはマシン固有の識別名MACアドレスで区別される。下の図 は hostB に "TELENT" というタイプのデ−タを送る場合に、 送り先情報がどのようにな っていくか示したものである。先ずイメ−ジとして理解して頂きたい。 ------- Ia : hostA のIPアドレス |hostA| ------- Ea : hostA のMACアドレス | ------------------------------ | Ig Ib ------- Eg ------- Eb |hostG| |hostB| ------- ------- | | ------------------------- Ethernet frame -------- -------- IP packet |Ea->Eg| |Eg->Eb| -------- |------| |------| -------- TCP packet |Ia->Ib| |Ia->Ib| |Ia->Ib| |Ia->Ib| -------- |------| |------| |------| |------| -------- |TELNET| | | | | | | | | |TELNET| |------| | | | | | | | | |------| -------- |デ−タ|→ | |→ | |→ | |→ | |→ |デ−タ|→ |デ−タ| -------- -------- -------- -------- -------- -------- -------- | || || | ――――――――――― ――――― ―――――――――――――――― hostA hostG hostB << パケットの流れ >> * パケットのタイプ アプリケ−ション層 | プレゼンテ−ション層| アプリケ−ションによるデ−タ、telnet や ftp など セッション層 | ↓ --------------------|--------------------------------------------------- トランスポ−ト層 | TCP/UDP パケット (プロセスのポ−ト番号が入る) | ↓ ネットワ−ク層 | IP パケット (送出元と宛先IPアドレスが入る) | ↓ デ−タリンク層 | Ethernet フレ−ム(送出元と宛先MACアドレス) | ↓ 物理層 | イ−サネット・ケ−ブルを通って行く UDP( User Datagram Protocol ) ちゃんとパケットが届くやら、順番通り届くやら何の保証もしない。一段上のアプリ ケ−ションで制御してねということになっている。しかしその分パケット構造が簡単 になる。少しぐらいデ−タが欠けても問題ない画像や映像の転送にむく。NFS はファ イル転送に UDP を使っているが、ちゃんとデ−タが欠けることなく届くのは、 アプ リケ−ションがエラ−、再送制御などを行っているからである。 TCP( Transmission Control Protocol ) UDP の反対で信頼性の高い通信を保証する。エラ−制御や再送制御などをちゃんと行 う。その代わりパケットのヘッダ−構造はやや複雑になっている。ヘッダ−部情報の 処理な余計にかかるため、その分転送速度は落ちるとされる。しかし、通常これで問 題になるようなものではない。 IP( Internet Protocol ) UDP 同様信頼性のないプロトコルによるパケットである。パケットのヘッダ−部には 送出元と宛先IPアドレスが記入される。このIPアドレスをル−タが見て次のル− タまで転送して行きながら、最終的に相手先ホストまでパケットを届けることになる。 ICMP( Internet Control Message Protocol ) ネットワ−クにトラブルがあったり、相手ホストが停止していたり故障していたりし た場合のチェックに役立つ。ホストをイ−サネット接続して、最初にやるコマンドは たいがい ping だが、 ping はこの ICMP を利用してIP層での接続チェックをする。 エコ−リプライ・パケットがちゃんと戻ってきたら正常である。 [ Ethernet フレ−ムのおおまかな構造 ] __ IPパケット___ 前 / \ 後 -------------------------------------------------------------- |宛先MAC|発信元MA|TYPE| IP | TCP/UDP | デ−タ | CRC | |アドレス |Cアドレス| |ヘッダ−| ヘッダ−| | | -------------------------------------------------------------- \___________/ \_______/ Ethernet ヘッダ− TCP/UDP パケット ↑ この長さは最長 1480 byte。 Ethernet ヘッダ−部は 14 byte、IP ヘッダ−と TCP ヘッダ−部はそれぞれ 20 byte で ある。IP パケット部が Ethernet フレ−ムのデ−タ部であり、最長 46〜1500 byte まで の長さに制限されている。この長さは MTU( Maximum Transfer Unit ) と言われる。これ 以上 IP パケット部が長い場合は、分割されることになる。 TYPE フィ−ルドはイ−サネ ットの場合 0x0800 となっている。ちなみに Apollo Domain は 0x8019である。最後尾の CRC( Cyclic Redundancy Check )は、チェックサム 4 byte のパリティ・チェックである。 CRC は RS-232C のパリティ・チェックより厳密なチェックだと理解しておけばいい。 [ IP パケットのおおまかな構造 ] ---------------------------------------------------------- |バ−ジョン|プロトコル|チェック |発信元| 宛先 | TCP/UDP | | 4 |区分 |サム |IP | IP | パケット| ---------------------------------------------------------- \_____________________/ IP ヘッダ−部 最初から見ていく。バ−ジョン 4 は現在の IPv4 であるということ。 プロトコル区分は ICMP が 1、TCP が 6、UDP が 17 番である。 チェックサムはヘッダ−部しか対象にしな いことに注意されたい。 デ−タ部がちゃんと届いているかは TCP レベルでのチェックに 任される。そして、次は発信元と宛先のIPアドレスがくる。 [ TCP パケットのおおまかな構造 ] -------------------------------------------------------- |発信元 |宛先 |制御用 |コ−ド|チェック| デ−タ| |ポ−ト番号|ポ−ト番号|連続番号|ビット|サム | | -------------------------------------------------------- \_____________________/ TCP ヘッダ−部 TCP/IP プロトコルの心臓部がこの TCP パケットである。発信元と宛先のポ−ト番号が先 ず入る。先の糸電話の話の telnet の場合、発信元ポ−ト番号はその時決まるが、上記で 例は 1100 番とした、宛先ポ−ト番号は telnet は 23 番と決まっている。制御用連続番 号は2つのフィ−ルドがあるが、出入りするパケットの連続番号である。もしパケットが バラバラに来ても、これで順番にパケットを並べることができる。コ−ドビットは左から URG, ACK, PSH, RST, SYN, FIN の 6 bit あり、立っているビットによって、パケットが どんな状態なのか分かるようになっている。チェックサムはヘッダ−部とデ−タ部を対象 にした値が入る。 [ UDP パケットのおおまかな構造 ] ----------------------------------------- |発信元 |宛先 |チェック| デ−タ | |ポ−ト番号|ポ−ト番号|サム | | ----------------------------------------- \_____________/ UDP ヘッダ−部 デ−タ部もチェックサムは対象にしている。 しかし UDP の場合は実装していない場合も あるらしい。高速な転送をするためチェックを省いたり、NFS のようにアプリケ−ション レベルでデ−タをチェックしたりする場合があるからである。 * コネクションとコネクションレス [ コネクションレスの通信 ] IPパケットによる通信が代表的である。これはアメリカで、核攻撃を受けてある部分の ネットワ−クが破壊されても、通信路をたたれないように、網の目のようなネットワ−ク のどこかをパケットが通って行けるように考え出された(そうではないという話もある)。 IPパケットには送出元と宛先が入っていて、ネットワ−クの要所要所に配置されたル− タにより、経路を決められて相手先に届く仕組みになっている。 [ コネクションの通信 ] 上記とは反対に通信網にバ−チャル・サ−キット、すなわち1本の通信路(チャネル)を 仮想的に確立して通信する方法である。個々のパケットは送出元と宛先は必要でなく、チ ャネルにさえ乗せてしまえば済む。欠点としてはチャネルを確立する時間がかる。チャネ ルがトラブルと、再度別なチャネルを確立して最初から通信をやりなおさなければならな いことがある。電話網の X.25 やフレ−ムリレ−がこの方式である。 [ TCP はコネクション型、UDP はコネクションレス型の意味 ] 上記のIPパケットのコネクションレスの通信の話は、通信経路を問題にしている。今度 はパケットの到着性に注目している。パケットが順番通り、欠けがなく届くように制御す るという意味でコネクション型といっている。その逆で順番もどうやら、パケットの抜け があっても問題としないのがコネクションレス型である。 * セッションとコネクション セッションという用語もよく出てくる。どうも2つの意味があって混乱しているように見 受けられる。1つはネットワ−ク上のデ−タのやりとりの様子を、もう1つはネットワ− ク・アプリケ−ションの論理的接続としての意味である。この意味からするとコネクショ ンは実際の物理的な接続と考えればいい。 ここらの説明として ftp によるファイル転送 で、コリジョンなどで実際の転送が中断されても、ちゃんと転送は完了するのは、セッシ ョンが維持されているからだと、よく書かれている。または telnet が異常終了したよう な場合、相手の telnetd デ−モンの方がそれを知らずにいる場合がある。 相手デ−モン はつなっがていると思っていて、セッションは張られたままになっている。この状態でま た telnet をかけると、接続できませんとなる。こんな経験があるかと思う。 (2) ネットワ−クサ−ビス・プログラム * プログラムの起動 簡単にデ−モンと呼ぼう。デ−モンにはEWS起動時に立ち上げておくプログラムと要求 のあった時だけ稼働するプログラムがある。常時稼働の方は、起動負荷が大きいもので頻 繁にアクセスがあるようなデ−モンが有効である。NFS, WWW, DNS などのサ−バ・プログ ラムである。他 inetd, lpd, sendmail, cron。かな漢字変換にXウィンドウに NIS など もそうである。INDY では % ps -e とやれば一杯デ−モンがリストされる。 要求時のみ稼働するのは、たまにしかアクセスがないサ−ビス、例えば telnetd や ftpd デ−モンなどが対象になる。ではどうやって telnetd を起動させるのか。これにはinetd というス−パ−・デ−モンを常時稼働させておき、 telnet アクセスが来たか監視させて おくのである。何を監視させるかは /etc/inetd.conf に記述することになっている。 普 通は以下のようにずら−と書いてあるので、必要ないのはコメントにする。 デ−モンのタイプ ----- 常時稼働 ( named や httpd デ−モン ) | --- 要求時のみ稼働 ( inetd デ−モンが要求を監視 ) /etc/inetd.conf << サ−ビス名とプログラムを登録。 --------------------------------------------------------- | | |telnet stream tcp nowait root /etc/telnetd telnetd |#ftp stream tcp nowait root /etc/ftpd ftpd << FTP はサ−ビスし | | ない。 $ httpd & ↓ $ /usr/ucb/netstat -a << アクティブソケットの一覧。 Active connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 *.80 *.* LISTEN << httpd。 tcp 0 0 *.telnet *.* LISTEN ↑ netstat -an とすると番号で出る。 注.telnet は一覧に出てくるが、ftp は出てこないことに注意。 * ポ−ト番号との関係 上記 netstat -a の Local Address で 80 は httpd のデフォルトのサ−ビスポ−ト番号 である。telnet の方は 23 番である。これは /etc/services ファイルに書かれている。 /etc/services << ポ−ト番号とサ−ビス名 -------------------- |ftp-data 20/tcp |ftp 21/tcp 注.このファイルを変更した場合は必ず |telnet 23/tcp inetd を再起動しなければならない。 | | 知識として、ポ−ト番号は16ビットで 0〜65535 という番号になる。 0〜255 は "よく 知られたポ−ト"( Well-known Port ) という。 0〜1023 はス−パユ−ザが使用すること になっていて、ル−トの権限でデ−モンが稼働することになる。 5000 番以上はユ−ザが 自由に定義して使用する領域になっている。 /etc/services に書かれているポ−ト番号というのは、どこからかアクセスされた時にサ −ビスを提供するポ−トの番号である。アクセス元のポ−ト番号は、 動的に決まり 1024 からの番号を使うようになっている。幾つかの例外があり、 ネ−ムサ−バの named 同士 のやりとり、それにネットニュ−スの NNTP はアクセス元も先も同じポ−ト番号を使うこ とになっている。 通常外部ユ−ザに対しては、あまりル−ト権限のデ−モンにアクセスしてもらいたくない。 httpd はポ−ト番号 80 番で root で稼働しているが、アクセスの際は nobody の権限で アクセスするようになっている。 sendmail も電子メ−ルを中継するだけであればル−ト 権限は必要ない。 サ−ビスの サ−バ側 | Server Client | クライアント | 備考 プロトコル デ−モン | Type Port Port | 側プログラム | ----------------------|---------------------|--------------|------------------- RIP routed | UDP 520 * | routed | SMTP sendmail | TCP 25 * | sendmail | SYSLOG syslogd | UDP 514 * | syslogd | ----------------------|---------------------|--------------|------------------- DNS named | TCP 53 * | named 等 | ゾ−ン転送に使用 DNS named | UDP 53 53 | named | named 同士 DNS named | UDP 53 * | resolver | resolv.conf との間 ----------------------|---------------------|--------------|------------------- IDENT identd 等 | TCP 113 * | sendmail 等 | HTTP httpd 等 | TCP 80 * | netscape 等 | HTTPS httpsd 等 | TCP 443 * | netscape 等 | 暗号化 HTTP ----------------------|---------------------|--------------|------------------- TELNET telnetd | TCP 23 * | telnet | RLOGIN rlogind | TCP 513 * | login | FTP ftpd | TCP 21 * | ftp | 制御用コネクション FTP ftpd | TCP * 20 | ftp | デ−タ転送用 〃 ----------------------|---------------------|--------------|------------------- RPC portmap 等| TCP/UDP 111 * | NIS,NFS | NFS nfsd 等 | UDP 2049 * | NFS | ・RIP, SMTP, SYSLOG, DNS のデ−モンはサ−バでもあり、クライアントでもある。 ・HTTP, HTTPS のクライアントというのは Netscape Navigator や Mosaic などである。 ・IDENT は sendmail-8.8.5 にクライアント機能が実装されている。 ・TELNET, RLOGIN, FTP のデ−モンは inetd デ−モン下にあり、ここから起動される。 ・RPC や NFS のデ−モン名はマシンによって異なる場合がある。RPC では INDY, Apollo, SunOS 4.1.4 も portmap という名前だが、Solaris 2.5.1 は rpcbind である。 ・SSL 暗号化メ−ルのプロトコル。POPS - 995, SMTPS - 25, IMAPS - 993。SSL-VPN装置 の検討で知った。メ−ルソフトが SSL に対応してないといけない。 * サ−ビスの注意 ・rlogin 相手ホストの inetd.conf に login がないと効かない。 /etc/inetd.conf 相手ホストで rlogind デ−モンが起動する。 ---------------------------------------------------- |login stream tcp nowait root /etc/rlogind rlogind ・portmapper Sun の NIS などに関係する。 Sun Microsystems 社が独自に作ったネットワ−クプログラムル−チン( RPC )でのプ ログラム番号と、対応するポ−ト番号を管理する。このプログラム自体はプログラム 番号 100000、ポ−ト番号 TCP 111、UDP 111 を使う。NIS や NFS の蛸足プログラム の元凶である。詳細は "6-5. RPC, NFS, Multicast など" を見られたい。 ・ftpd ftp アクセスのタイムアウト時間。 ftp アクセスして、しばらく何もせず放っておくといつの間にかセッションは切れる。 デフォルトでは900秒、つまり15分間が Timeout 時間である。Apollo からINDY へ ftpをかけると、なぜか数分で切れてしまう。時刻が同期していないためか?。と りあえず Timeout を1時間にしたれと、 INDY の /etc/inetd.conf をいじってみた。 一応これで Timeout は伸びた。ftpd に -l 指定すると、ログを syslogd でとれる。 /etc/inetd.conf ----------------------------------------------------------- |ftp stream tcp nowait root /usr/etc/ftpd ftpd -t3600 * INDY IRIX 5.3 での /etc/inetd.conf と /etc/services これらのファイルはどのメ−カのEWS、UNIXマシンでも、内容はほぼ同じ。ファイ ル名にファイルの置場所の /etc ディレクトリも同じである。 /etc/inetd.conf ------------------------------------------------------------------------- |ftp stream tcp nowait root /usr/etc/ftpd ftpd -l |telnet stream tcp nowait root /usr/etc/telnetd telnetd |shell stream tcp nowait root /usr/etc/rshd rshd |login stream tcp nowait root /usr/etc/rlogind rlogind |exec stream tcp nowait root /usr/etc/rexecd rexecd |finger stream tcp nowait guest /usr/etc/fingerd fingerd |#bootp dgram udp wait root /usr/etc/bootp bootp |tftp dgram udp wait guest /usr/etc/tftpd tftpd -s ... |ntalk dgram udp wait root /usr/etc/talkd talkd |tcpmux stream tcp nowait root internal |echo stream tcp nowait root internal |discard stream tcp nowait root internal |chargen stream tcp nowait root internal |daytime stream tcp nowait root internal |time stream tcp nowait root internal |echo dgram udp wait root internal |discard dgram udp wait root internal |chargen dgram udp wait root internal |daytime dgram udp wait root internal |time dgram udp wait root internal |sgi-dgl stream tcp nowait root /rcv /usr/etc/dgld dgld -IM -tDGLTSOCKET |#uucp stream tcp nowait root /usr/lib/uucp/uucpd uucpd |# |# RPC-based services << 以下 Sun RPC ベ−スのサ−ビス。 |# These use the portmapper instead of /etc/services. |mountd/1 stream rpc/tcp wait/lc root /usr/etc/rpc.mountd mountd | | 以下続く /etc/services ---------------------------------- |tcpmux 1/tcp # TCP port multiplexer (RFC 1078) |echo 7/tcp << ping が使う。 |echo 7/udp |discard 9/tcp sink null |discard 9/udp sink null |systat 11/tcp users |daytime 13/tcp |daytime 13/udp |netstat 15/tcp |qotd 17/tcp quote |chargen 19/tcp ttytst source |chargen 19/udp ttytst source |ftp-data 20/tcp << NcFTPを使う場合は必要なし。 |ftp 21/tcp |telnet 23/tcp << コメントにすると自ホストからの telnetもで |smtp 25/tcp mail きなくなってしまう。 |time 37/tcp timserver |time 37/udp timserver |domain 53/tcp nameserver |domain 53/udp nameserver |mtp 57/tcp # deprecated |bootp 67/udp bootps # bootp server |bootpc 68/udp # bootp client |tftp 69/udp |rje 77/tcp netrjs |finger 79/tcp | | |pop-3 110/tcp |sunrpc 111/tcp rpcbind |sunrpc 111/udp rpcbind |auth 113/tcp authentication | | |# UNIX specific services |# |exec 512/tcp |biff 512/udp comsat |login 513/tcp << rlogin のサ−ビスである。 |shell 514/tcp cmd |syslog 514/udp |printer 515/tcp spooler # line printer spooler |talk 517/udp |route 520/udp router routed |timed 525/udp timeserver | | 以下続く * Apollo の /etc/services ファイル `2h/08/E $ catf /etc/services # /etc/services (DOMAIN/OS version SR10.2) # @(#)services 1.2 - 89/09/29 # # The port numbers listed here are not necessarily available on # any particular Domain/OS or HP-UX operating system; # some OSs may also use other ports. # # Network services, Internet style # rje 5/tcp rje 5/udp echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp netstat 15/udp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver rlp 39/tcp resource # resource location rlp 39/udp nameserver 42/tcp name # IEN 116 nameserver 42/udp whois 43/tcp nicname whois 43/udp domain 53/tcp nameserver # name-domain server domain 53/udp nameserver mtp 57/tcp # deprecated tftp 69/udp rje 77/tcp netrjs finger 79/tcp finger 79/udp link 87/tcp ttylink supdup 95/tcp hostnames 101/tcp hostname # usually from sri-nic tsap 102/tcp #csnet-cs 105/? pop 109/tcp postoffice sunrpc 111/tcp portmap sunrpc 111/udp portmap auth 113/tcp authentication sftp 115/tcp uucp-path 117/tcp nntp 119/tcp readnews untp # USENET News Transfer Protocol ntp 123/tcp ntp 123/udp ncs 135/udp snmp 161/udp # # SysV.3, BSD4.3, and Domain/OS specific services # exec 512/tcp biff 512/udp comsat login 513/tcp who 513/udp whod shell 514/tcp cmd # no passwords used syslog 514/udp printer 515/tcp spooler # line printer spooler talk 517/udp ntalk 518/udp efs 520/tcp # for LucasFilm route 520/udp router routed timed 525/udp timeserver tempo 526/tcp newdate courier 530/tcp rpc conference 531/tcp chat netnews 532/tcp readnews netwall 533/udp # -for emergency broadcasts uucp 540/tcp uucpd # uucp daemon new-rwho 550/udp new-who # experimental remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem rmonitor 560/udp rmonitord # experimental monitor 561/udp # experimental genesil 599/tcp # for remote genesil DAServer 987/tcp # HP-UX SQL distributed access phone 1167/udp # HP-UX phone service postmsg 1234/tcp # HP-UX postmsg service v2d 1210/tcp rlb 1260/tcp # HP-UX remote loopback diagnostic ingreslock 1524/tcp orasrv 1525/tcp oracle nft 1536/tcp # HP-UX NS network file transfer nfsd 2049/udp # HP-UX NFS remote file system install 2105/tcp # HP-UX install service rfa 4672/tcp # HP-UX NS remote file access mserve 6060/tcp # HP-UX broadcast messages spc 6111/tcp # HP-UX sub-process control i-server 7777/tcp # HP-UX integration service emacs_server 23750/tcp # HP-UX emacs server # # HP-UX installation services # netdist 2150/tcp ninstall # HP-UX ninstall/netdisk netdist 2150/udp ninstall netdist 5659/tcp ninstall # HP-UX good system integration ninstall/net netdist 5659/udp ninstall dist netdist 1121/udp ninstall # HP-UX special case integration ninstall netdist 1121/tcp ninstall # # Window system services # # The X10_LI server for each display listens on ports 5800 + display number. # The X10_MI server for each display listens on ports 5900 + display number. # The X11 server for each display listens on ports 6000 + display number. # Do not associate other services with these ports. # Refer to X Window System documentation for details. # x10_li 5800/tcp X10_LI # X Window System, Version 10, little-endian x10_mi 5900/tcp X10_MI # X Window System, Version 10, big-endian x11 6000/tcp X11 # X Window System, Version 11, display 0 x11 6000/udp X11 # X Window System, Version 11, display 0 x11_1 6001/tcp X11_1 # X Window System, Version 11, display 1 x11_1 6001/udp X11_1 # X Window System, Version 11, display 1 (3) ftp コマンドの性質 * 通信路の確立 相手ホストに ftp しようとすると、 相手先の接続ポ−ト番号は 21 番と決められている。 自分側のポ−ト番号は任意に決まる。しかしデ−タを転送する場合、転送用のプログラム が内部で起動され、このための通信路が確立(コネクションを張る)される。この時、相 手側 ftpd デ−モンがこちらのポ−ト番号を決めてくる。 下記の例では hostB が hostA にポ−ト 1219 番をあけろと指示している。次に get, put, ls などやると 1219 番にな るとは限らない。Apollo から INDY への ftp では1番ずつ番号が上がって行った。 このことは、hostA 側でパケットフィルタリングのファイアウォ−ルを設定する際に問題 になる。相手がどんな番号を指定してくるか分からないので、結局全部のポ−トを外から アクセスできるようにするしかなくなる。そうなるとパケットフィルタリングは成りたた なくなってしまう。そこで通常の ftp コマンドを使うのでなく、 hostA クライアント側 からポ−ト番号を決めることができる FTP ソフト、例えば NcFTP を使うのである。 ------- ------- |hostA| $ ftp hostB |hostB| □ hostB サ−バ ------- ------- | ----------- a. |1135| ----------------> | 21 | | | 制御用コネクション ----------- : put & get FILE : ■ Router パケットフィ |1135| ----------------> | 21 | | ルタリング b. |1219| <--------------- | 20 | -------------- デ−タ用コネクション | □ hostA クライアント 192.9.200.1 hostA $ ftp -d hostB | ftp> get file ---> PORT 192,9,200,1,4,195 << 4*256+195 = 1219 ポ−ト番号 [ a の状態 ] $ /usr/ucb/netstat Active connections Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 hostA.1135 hostB.ftp ESTABLISHED % netstat Active Internet connections Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 hostB.ftp hostA.1135 ESTABLISHED [ b の状態 ] ここででかいファイルを hostB から hostA に転送する。 転送している間に netstat コ マンドを素早く入れる。ちなみに小さなファイルでは、netstat コマンドを入れる暇がな い。原始的、やめて−!。sleep によるシェル・スクリプトをちょっと書いてやってね。 $ /usr/ucb/netstat tcp 7032 0 hostA.1219 hostB.ftp-data ESTABLISHED tcp 0 0 hostA.1135 hostB.ftp ESTABLISHED % netstat tcp 0 62312 hostB.ftp-data hostA.1219 ESTABLISHED tcp 0 0 hostB.ftp hostA.1135 ESTABLISHED * NcFTP について NcFTP ソフトが通常の ftp コマンドと違うのは、 デ−タ転送のためのポ−トをクライア ントが決めることである。決めると言っても任意のポ−ト番号であり、例えば 21 番とい うようにあらかじめ決められている訳でない。つまり発信元も、相手先ポ−トもその時に 決められるのである。「UNIX MAGAZINE」'95/01, P.129〜130 にバ−ジョン 1.7.6でのイ ンスト−ルの注意が記されている。ちなみに「INTERNET magazine」のおまけ CD-ROMに入 っていた NcFTP のバ−ジョンは 2.2.2 だった。 PDEFS = -DPASSIVEMOD << こうして make をかけるとパッシブ・モ−ドの FTP ク CC = gcc ライアントの ncftp コマンドができる。 任意 -------- ポ−ト 21番 -------- こっちは ftp のサ−バ側。サ−バ側の ftpd |ncftp | *------------> | ftpd | デ−モンは変更しなくてもよい。通常のもの | | | | でよい。 |client| *------------> |server| -------- 1029 -------- * FTP ソフトいろいろ `21/03 追記 フリ−ソフト FFFTP > http://www2.biglobe.ne.jp/~sota/ にある。GUIタイプ、Windows 用。 定番の FTP のフリ−ソフト。UNIXから Windows へのコピ−は[A] [EUC] で S-JIS になる。 フリ−ソフト RootFTP > http://ext.comax.co.jp/。GUIタイプ、Windows 用。雑誌を見ていたら FFFTP より 使い勝手があると紹介されていた。 GNU の FTP ソフト > % wget http://www.tcp.co.jp/iii.html"、% wget ftp://ftp.iij.ad.jp/pub/ooo.taz" 面白い、こんなようにコマンドでもってWWWサ−バにもアクセスできる。 「UNIX MAGAZINE」2000/04, P.123〜132, "UNIX知恵袋 GUI FTP クライアント"。 > gFTP がおすすめ。FreeBSD, Linux 用。プロキシ−に対応している。 * anonymous FTP サイトを作ってみる INDY の IRIX 5.3 で anonymous FTP を作ってみる。% man ftpd, % man passwdでマニュ アルを見てその通りやったらできた。jiro というディレクトリを ftp サイトにしてみた。 /jiro/bin/ls は大事である。これがないと ftp アクセスしてもリストすることができな い。get や put は ftpd の中に実装されている。何で ls がないのだ?。/jiro/etc/ に passwd と group ファイルを入れるとか書かれているが、別になくても関係ないぞ。まあ もし必要になれば入れればいい。基本的には /etc/passwd をコピ−して、 必要なエント リだけにする。 $ ftp indy2 Name (indy2:ikken): ftp 331 Guest login ok, type your name as password. Password: 230 Guest login ok, access restrictions apply. ftp> pwd 257 "/" is current directory. << chroot がかかっている。 ftp> ls << この ls は /jiro/bin/ls である。 /etc/passwd ----------------------------------------- |ftp:*:200:12::/usr/people/jiro:/dev/null ↑ % su root /bin/csh でも * でも関係なし。でも安全の % cd /usr/people ため、/dev/null にしておくのがいいだろう。 % mkdir jiro % chown ftp jiro [jiro] --- [bin] -- ls % chmod 555 jiro |- [dev] -- zero |- [lib] -- libc.so.1, rld % cd jiro |- [etc] -- passwd, group << ?。 % mkdir bin; chmod 555 bin | % cd bin |- file1 (Permission:ftp,user) % cp /sbin/ls .; chmod 111 ls |- file2 | % mkdir lib; chmod 555 bin |- [pub] % cd lib % cp /lib/rld . % cp /lib/libc.so.1 . % chmod 555 * % mkdir dev; chmod 555 dev % mknod zero c 37 0 % chmod 444 zero (4) telnet コマンドの例 * 仕組み telnet を相手ホストにかけると、相手ホストでは inetd デ−モンが待機していて、先ず アクセスを受ける。そして inetd デ−モンが /etc/inetd.conf の設定を見て telnet の 項目があれば、telnetd デ−モンを起動する。telnet は複数かければ、 その数分だけの telnetd デ−モンができる。telnet をかけると login プロンプトがすぐに出てくる。こ のロッグインは inetd.conf に記述されている rlogind ではない。/usr/bin/login など の login コマンドが起動される。ftp の場合も同様である。inetd.conf で loginなんて 書かないでちゃんと rlogin と書けばいいのに、非常に紛らわしい。これらテストをする のは、UNIXマシンで自身のホストに telnet をかけてみればいい。内容的には、他の ホストにアクセスしたのと同じことである。 [ localhost に telnet の例 ] /etc/inetd.conf ---------------------------------------------------- |telnet stream tcp nowait root /etc/telnetd telnetd |#login stream tcp nowait root /etc/rlogind rlogind << rlogin で起動される。 $ telnet localhost login: << login 待ちの時のプロセスの状態。 .. Wait uid = 7265CE2D.8002CBED (telnet) .. Wait uid = 7265CD66.5002CBED (inetd) .. Wait uid = 7265CE2E.C002CBED (telnetd) .. Wait uid = 7265CE31.E002CBED (login) << telnetd から login が起動される。 * /etc/inetd.conf の変更 /etc/inetd.conf ----------------------- << コメントにして telnet が効かなくする。 |#telnet stream ... inetd デ−モンを再起動するか SIGHUP を送る。 $ /bin/ps -ax 1083 ? S 0:00 /etc/inetd $ /bin/kill -HUP 1083 << inetd デ−モンに SIGHUP を送る。 $ telnet hostX << 使えなくなった。 Trying 192.10.10.1... ftp: connect: Connection refused * inetd デ−モンを停止した場合 $ telnet telnet> open localhost Trying 127.0.0.1... telnet: connect: Connection refused telnet> q << quit で telnet から抜ける。 * telnet のポ−ト番号を変えてみる /etc/services ----------------------- |#telnet 23/tcp |telnet 2003/tcp << 23 を 2003 番に変更する。 $ telnet localhost 2003 << ポ−ト番号を指定してみる。 /etc/services ファイルを変更したら、必ず inetd デ−モンを再起動すること。 再起動 しないと実際のポ−ト番号が変わらない。または $ kill -HUP inetd_id とやる。ポ−ト 番号が変わったかどうか確認するには $ /usr/ucb/netstat -rn とやればいいだろう。さ てこれで、ポ−ト番号を指定しないと相手の telnetd に接続できない。 普通ポ−ト番号 を指定しなくても、ちゃんと telnet アクセスできるのは、 telnet の場合ポ−ト番号は 23 番を使うと決められているからである。 ポ−ト番号を管理調整し取り決めをする組織 がちゃんとある、IANA( Internet Assigned Numbers Authority ) という。 * Windows パソコンから telnet する DOS窓から >telnet 192.168.1.1 25 とメ−ルサ−バにアクセスしようとしたら、拒否 された。OSはWindows 2000、隣の部署の人ができんと言って相談してきて、自分のパソ コンでやってもできんかった。できると思っていたがパソコンからは ping しかやってい なかった。 常駐しているウィルスチェックの McAfee VirusScan Enterprise が悪さ?を していた。画面下の VirusScanのアイコンをマウスで右クリックをして、スキャンを無効 を選んだら直ぐに telnet 25 はできるようになった。 いちいち無効にしないとできんの では困るので、[VirusScan コンソ−ル]->[タスク]->[プロパティ]で [アクセス保護のプ ロパティ]を出し、"〆大量メ−ル配信型ワ−ムにメ−ルを送信させない" のチェックを外 してみた。これがポ−ト25番を監視していた。とても分かりにくい話だ。`27/04 * Apollo で localhost に telnet した時の状態 $ netstat 前 Active connections Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 node_aaaaa.x11 node_aaaaa.1044 ESTABLISHED tcp 0 0 node_aaaaa.1044 node_aaaaa.x11 ESTABLISHED $ netstat 後 ( 最初の2項目は省略 ) tcp 0 0 localhost.telnet localhost.1671 ESTABLISHED tcp 0 0 localhost.1671 localhost.telnet ESTABLISHED tcp 0 0 node_aaaaa.x11 node_aaaaa.1044 ESTABLISHED tcp 0 0 node_aaaaa.1044 node_aaaaa.x11 ESTABLISHED 参考:アクティブソケットの一覧 $ netstat -a Active connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp 0 0 *.spc *.* LISTEN tcp 0 0 *.time *.* LISTEN tcp 0 0 *.daytime *.* LISTEN tcp 0 0 *.ftp *.* LISTEN tcp 0 0 *.exec *.* LISTEN tcp 0 0 *.shell *.* LISTEN tcp 0 0 *.login *.* LISTEN tcp 0 0 *.telnet *.* LISTEN tcp 0 0 node_aaaaa.x11 node_aaaaa.1044 ESTABLISHED tcp 0 0 node_aaaaa.1044 node_aaaaa.x11 ESTABLISHED (5) ICMP パケットについて * ICMP( Internet Control Message Protocol ) このパケットは、コンピュ−タ内部では基本的にIPパケットとして扱われる。下の図が ICMP パケットのおおまかな構造である。IP ヘッダ−部のプロトコル区分 Protocol は 1 が ICMP である印しである。それ以外の IP ヘッダ−部の項目は TCP や UDP パケットの ものと変わりはない。ICMP であるところはICMP メッセ−ジで、ヘッダ−部とデ−タ部に 別れる。最初の Type が ICMP パケットの内容の種類になる。 ping コマンドの送信に使 われる Echo Request は8番、戻りで使われる Echo Replay は0番である。次の Codeは Type の詳しい状態の説明で、 Network Unreachable を示すのが0番という具合になって いる。ping では RTT( Round Trip Time )というタ−ゲット・ホスト間の往復時間を計測 してくれる。これは ping コマンドが、 ICMP メッセ−ジのデ−タ部に発信時の時刻を入 れて、パケットが帰ってきた時刻とから算出しているのである。 ICMP メッセ−ジ:ヘッダ−部 ←|→ デ−タ部 _____________________________ / 8byte 56byte \ --------------------------------------------------------------*------------- |Version| TTL |Protocol|Check|発信元|宛先|Type|Code|Check| |時刻| | | 4 | 値 | 1 |Sum |IP |IP| | |Sum | |情報| | ---------------------------------------------------------------------------- \__________________/ 8bit 8bit 8byte IP ヘッダ−部 ↑ ping コマンドの場合、時刻情報を入れる ICMP の Type フィ−ルドを全部でないが列挙しておく。Echo Reply と Echo Request は ping で使われていると説明した。Source Quence は混んでいるので、 デ−タを送らない でくれということらしい。Time Exceeded は traceroute コマンドで使われている。 Echo Reply(0), Destination Unreachable(3), Source Quence(4), Redirect(5), Echo Request(8), Time Exceeded(11), Parameter Problem(12), Timestamp Request(13), Timestamp Reply(14), Mask Request(17), Mask Reply(18) * ping コマンド % ping localhost ↓ICMP のデ−タ部のデフォルトのサイズは 56 byte。 PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0 ms ----localhost PING Statistics---- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0/0/0 ms % ping -s 100 192.168.1.5 << ICMP のデ−タ部サイズを 100 byte にする。 PING 192.168.1.5 (192.168.1.5): 100 data bytes 108 bytes from 192.168.1.5: icmp_seq=0 ttl=255 time=0 ms 108 bytes from 192.168.1.5: icmp_seq=1 ttl=255 time=0 ms | % ping -s 1 localhost << -s 0 としたら illegal packet size と出た。 PING localhost (127.0.0.1): 1 data bytes 9 bytes from 127.0.0.1: icmp_seq=0 ttl=255 9 bytes from 127.0.0.1: icmp_seq=1 ttl=255 * traceroute コマンド タ−ゲット・ホストへの到達経路を調べるコマンドである。UDP と ICMP を組み合わせて うまいこと経路を求めるようになっている。以下は INDY IRIX 5.3 で tracerouteを実行 したところである。初め結果が 1 * * * と出て、ファイアウォ−ルで UDP パケットが止 められていた。それで FireWall-1 で [udp-high-ports] サ−ビスを、外ヘの通過を許可 に設定した。このサ−ビスは UDP Ports 1024-65535 番のパケットを対象とする。止めら れたパケットは UDP 33435,33436,33437,... というのだった。 ちょうど最初に 1 * * * で3個のパケットを出しているのだが、 これらが 33435,33436,33437 の番号に対応する。 traceroute はあくまでも到達経路を出すのであって、 ネットワ−クのスル−プットを調 べるものではない。 traceroute は UDP の 33435 番から、3個を一組でパケットを出す。 最初のこれらのパ ケットには TTL 値を1にセットして送出する。 1番目のル−タにパケットが到着すると、 ル−タはその UDP パケットの TTL 値を−1する。結果 TTL=0 になり、これでこのパケ ットはこれ以上進むことができなくなり、ICMP パケットに Time Exceeded のフラッグを 立てて、送出元のホスト、ここでは INDY にパケットを送る。そうして3個のパケットの 応答が戻ってきたら TTL 値を2にして、また3個の UDP パケットを送る。UDP の番号は 33438,33439,33440 となる。今度はル−タ2までいくことになる。この繰り返しで、下の 図ではル−タ6までいく。 そして最後7にパケットが行くと、そのときの UDP パケットが 33444 としようか。7の コンピュ−タでは 33444/UDP で何もサ−ビスしていない。33435 番から UDP パケットを を送出したのは、もともとタ−ゲット・ホストでそんな番号のサ−ビスはないことを期待 したためである。普通のUNIXではそのようなサ−ビスをするデ−モンはなく、タ−ゲ ット・ホストの 33444/UDP ポ−トからの反応はない。それでル−タ6は、ICMP パケット の Code エリアに Port Unreachable を意味する3を記して、 元のホスト INDY に ICMP パケットを送って traceroute コマンドは完了する。TTL( Time To Live ) はル−タを通 過していける数、ホップ数ともいうが、通常のIPパケットは 255 という値をとる。 indy 1 2 3 4 5 6 7 www.tcp-ip.or.jj traceroute の RTT は累積値 ■→□→□→□→□→□→□→■ ホスト でない。瞬間、瞬間でのネッ トワ−クの込み具合は異なる。 indy% traceroute -n www.tcp-ip.or.jj traceroute to www.tcp-ip.or.jj (157.14.130.233), 30 hops max, 40 byte packets 1 192.168.1.2 2 ms * 1 ms ファイアウォ−ル 2 202.241.128.1 3 ms (ttl=63!) 3 ms (ttl=63!) 3 ms (ttl=63!) 自社側ル−タ 3 202.241.128.9 37 ms (ttl=62!) 76 ms (ttl=62!) 48 ms (ttl=62!) 相手側ル−タ 4 157.14.171.1 40 ms 37 ms 37 ms 5 157.14.209.1 152 ms 317 ms * 途中ル−タ 6 157.14.250.1 149 ms 136 ms 148 ms 7 157.14.130.233 166 ms * 68 ms タ−ゲットホスト indy% ping -c 3 www.tcp-ip.or.jj << -c は ICMP パケットを送る数の指示。 PING www.tcp-ip.or.jj (157.14.130.233): 56 data bytes 64 bytes from 157.14.130.233: icmp_seq=0 ttl=249 time=193 ms 64 bytes from 157.14.130.233: icmp_seq=1 ttl=249 time=76 ms 64 bytes from 157.14.130.233: icmp_seq=2 ttl=249 time=69 ms ----www.tcp-ip.or.jj PING Statistics---- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 69/112/193 ms << RTTの最小/平均/最大値。単位ミリ秒。 % traceroute -h オプションはいろいろある。 Usage: traceroute [-dnrv] [-w wait] [-m max_ttl] [-p port#] [-q nqueries] [-t tos] [-s src_addr] [-g gateway] host [data size] Cobalt Qube3 は /usr/sbin/traceroute、Apollo は /usr/local/bin/traceroute にある。 NetCache、Cisco 2514、Summit24 にも traceroute コマンドがある、NetScreen-50 には trace-route と言う名前で入っている。パソコンやEWSなどから telnet で装置に入っ て利用する。Windows 98 や Windows 2000 にはDOSコマンドの tracert がある。 * ソ−スル−ティングのテスト □ PC3 Windows 2000 のDOS窓で、ping と入れるとソ−ス |.2 ル−ティングのオプションが2つ出て来る。-j Loose ------------------- 192.1.3.0 source route along host-list と -k Strict source |.1 route along host-list。Apollo でも$man ping とや R2■ □ PC2 ると -r オプションがらしいのだが、どうも意味合い |.3 |.2 は違うみたいだった。 ------------------- 192.1.2.0 |.1 R1,R2 はル−タまたはレイヤ3スイッチで経路設定は R1■ □ PC1 何もなし。Cisco 3750を使ってみたが、できなかった。 |.1 |.2 ひょっとすると 3750 はデフォルトでソ−スル−ティ ------------------- 192.1.1.0 ング指定のパケットは通さないようになっているのか。 PC1, PC2, PC3 は経路設定は何もなしか、デフォルト経路をどこかあちゃらに向ける。パ ソコンだとデフォルト経路のIPアドレスをともかく入れないけないので。UNIXマシ ンであれば何も設定なしにできるが。 この状態で PC1 から ping 192.1.2.1, 192.1.2.2 はNGとなる。PC1 から PC3 への方へもNGである。 それが下のように、どこを通って 行くかあらかじめ指定してパケットを送ると、届くのでないか。と予想するのだが、どう も検証ができない。多分下の2番目のは、パケットが R1 に届くと、そこで次はどこへ向 けてパケットを送るのかなと見て 192.1.2.3 だと、 そして R2 に届いてまた今度はどこ かなと見て 192.1.3.2 へ、これでめでたし到着。しかし戻りのパケットの中にも、 同じ く途中の通過ル−タのIPアドレスが書かれなければならない訳で、本当にそんなことが できるのかなと思う。そもそもソ−スル−ティングは経路情報がなくても、送信パケット に経路を載せておけば行くという代物。もし ping で動作確認ができたとしても、Telnet や FTP など実際のアプリケ−ションでできるのってあるのか。よく調べたらあるのかも。 PC1> ping -j 192.1.1.1 192.1.2.2 << 192.1.2.2 へのパケット。 PC1> ping -j 192.1.1.1 192.1.2.3 192.1.3.2 << 192.1.3.2 へのパケット。 ------------------------------------------------------------------------------------ [ 付録 ] Apollo コンピュ−タで traceroute * 昔にコンパイルした traceroute $ /usr/local/bin/traceroute 1.1.1.1 rootのアカウントでコマンドを実行 traceroute: icmp socket: Permission denied しないとダメ。一般ユ−ザでやった ら実行権限がないと出た。 $ login login: root Password: Using local registry. Can't use network registry: - Registry server unavailable (from RGYC / Server) ソフト traceroute は自分でコンパイルしたものだから、一般ユ−ザでも実行できるよう にできるはずだけど。たまには root でログインできるかどうか確認するのもいいかなと。 $ lusr root.staff.none.12345 //node_67890 このマシンはディスクレス機でノ− ド番号は 12345、親機は 67890。 $ /usr/local/bin/traceroute 1.1.1.1 traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 38 byte packets 1 192.168.1.1 (192.168.1.1) 10 ms 3 ms 3 ms 2 * * * 3 * * * 反応が返ってこない。何かおかしい。 このマシンのIPアドレスは 192.168.1.9、ネットワ−ク上にはファイアウォ−ルがあっ て 192.168.1.1。静的経路やデフォルト経路がおかしいか。それはないみたい。 $ /usr/ucb/netstat -rn Routing tables Destination Gateway Flags Hops Ref Use Interface 192.168.1.1 USG 1 0 252898 eth0 192.168.1 192.168.1.9 U 0 0 0 eth0 127 127.0.0.1 U 0 0 0 lo0 このマシンの 192.168.1.9 から外への traceroute が使うポ−トが、 ファイアウォ−ル で閉じらているのでないか。FortiGate の サ−ビス に TRACEROUTE あり、TCP/33434 と UDP/33434。これを LAN->WAN の該当のところに サ−ビス TRACEROUTE 追加した。だめだ った。サ−ビス UDP(UDP/0-65535) を追加したら traceroute の結果が続々でてきた。 $ /usr/local/bin/traceroute -n 1.1.1.1 traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 38 byte packets 1 192.168.1.10 3 ms 4 ms 3 ms 2 192.168.1.1 3 ms 3 ms 3 ms | traceroute コマンドで何もオプション指示しないとドメイン名も調べて表示する。-n を 付けるとドメイン名は調べずにIPアドレスで表示する。 $ catf /etc/resolv.conf 一応このマシンではDNSを参照するようにして #domain nissei-gtr.co.jp ある。それで traceroute でドメイン名も表示さ nameserver 2.2.2.2 れる。 $ nslookup これは /nix/com/nslookup。コマンドサ−チル− Default Server: ns.nix.co.jj ルの $ csr -a /nix/com で、/nix/com も探すよ Address: 2.2.2.2 ようにしてある。 * デフォルトル−トを変えるには デフォルトル−トを 192.168.1.10 にしないといけない?。そんなはずはないけど一応疑 ってみた。 192.168.1.10 は全ネットワ−クの経路制御をしているレイヤ3スイッチであ る。ここはデフォルトル−トが2つできるという変な現象が起きるという注意である。 $ /etc/route add net 0.0.0.0 192.168.1.10 1 add net 0.0.0.0: gateway 192.168.1.10 $ /usr/ucb/netstat -rn Routing tables Destination Gateway Flags Hops Ref Use Interface 192.168.1.1 USG 1 0 252898 eth0 192.168.1.10 USG 1 0 0 eth0 192.168.1 192.168.1.9 U 0 0 0 eth0 127 127.0.0.1 U 0 0 0 lo0 $ /etc/route delete net 0.0.0.0 192.168.1.1 1 delete net 0.0.0.0: gateway 192.168.1.1 $ /usr/ucb/netstat -rn Routing tables Destination Gateway Flags Hops Ref Use Interface 192.168.1.10 USG 1 0 0 eth0 192.168.1 192.168.1.9 U 0 0 0 eth0 127 127.0.0.1 U 0 0 0 lo0