■通信の実際 joho3(133.87.45.83)から 同じネットワークのホスト(honey : 133.87.45.75) 外部のあるホスト(www.lycos.ne.jp : 202.232.118.54) へ通信しようとした際の事を考える □直接IPアドレスで通信しようとした場合 コマンド ping 202.232.118.54 として通信しようとしたとする この場合,一見DNSサーバを利用しないで通信するように見えるかも 知れないが,実はちゃんとDNSと通信し, ホスト名,ドメイン名を取得している. 少なくとも,tcpdumpで見たログではホスト名,ドメイン名同士で 通信を行っているように見えた. 基本的にPCは他のPCをホスト名やドメイン名で認識しようと しているらしく,常にDNSサーバとは通信を行っているらしい □133.87.45.75 に通信しようとした際の事を考える 1.joho3はIPアドレスが133.87.45.75 のマシンのMACアドレスを知らないため LAN内にブロードキャストを行い,133.87.45.75のマシンに MACアドレスの情報を要求する. (なお,この際に自分のMACアドレスも送信した情報に加えておく) 2.honeyはこの要求に返事をする. 具体的には joho3 のMACアドレスに向け,自分のMACアドレスを 通知する.既にjoho3のMACアドレスはわかっているので, 一意にjoho3に向けて情報を送ることができる 3.これでデータをやりとりする双方が相手のMACアドレスを認識し, 実際に通信をおこなうことができるようになる. ※ IPアドレスとMACアドレスの対応情報は /proc/net/arp に書き込まれる.(Debianの場合) (Windowsならば,MS-DOSプロンプトで「arp -a」とすればよい) しかし,有効時間は最後に通信してからおよそ10分以内である. 対応情報が無い場合は再びブロードキャストして 情報を要求することになる □202.232.118.54(外部のネットワーク) に通信しようとした際の事を考える 1.joho3はネットワークアドレスやネットマスクから判別して 202.232.118.54がLAN内のアドレスでは無いことがわかっているので gatewayであるkurage(133.87.45.1)との通信を行おうとする 2.先程のLAN内のマシンとの通信の時のように kurageを探すためにブロードキャストを行い, kurageもそれに返事をし,双方でMACアドレスを認識する. 3.その後,joho3は宛先「202.232.118.54」のパケットヘッダ, 宛先がkurageのMACアドレスであるフレームヘッダをつけて 直接的にはkurageに向かってパケットを送信する 4.kurageはそのパケットを適当にルーティングして宛先まで送る (ここから先の話は勉強が必要) ※ joho3,aquaのみの変な話 こいつらは自分でネットマスクなどを使用して そのアドレスがLAN内のものなのかどうかを判別することは ないらしく,以下のようなことが起こる (なぜ判別できないのか理由は不明) 1.joho3はIPアドレスが 202.232.118.54のマシンの MACアドレスを知らない上,それがLAN内のマシンであると 思い込んでいるらしく, LAN内にブロードキャストを行い,202.232.118.54のマシンの MACアドレスの情報を要求する. 2.この要求に対しては(親切に)ルータ(kurage)が返事を返すことになる. joho3はアホなので,そのkurageのMACアドレスを 202.232.118.54 のMACアドレスだと思い込む. 3.その後に行うことは結局普通と同じで, joho3は宛先「202.232.118.54」のパケットヘッダ, 宛先がkurageのMACアドレスであるフレームヘッダをつけて 直接的にはkurageに向かってパケットを送信する 4.kurageはそのパケットを適当にルーティングして宛先まで送る (joho3は [202.232.118.54のマシン = kurage] と思い込んで しまっているわけではあるが,最終的に返信されてくるパケットの 送信元アドレスは「202.232.118.54」,宛先アドレスはjoho3 送信元MACアドレスは202.232.118.54のものであり, 宛先MACアドレスはjoho3なので問題なく通信できてしまう) -------------------------------------------------------------- ■netstat に関して  ・IPマスカレードの情報を知る方法 $ netstat -Me   とすると、現在マスカレードしている通信状況がわかる. (-e オプションはなくていいかも)  ・現在の通信状況を表示するには $ netstat とのみコマンドを入力すればよい (デフォルトだと,通信相手やポートはドメイン名やプロトコル名に 変換されるため,いやな場合は -n オプションをつけること)  ・ルーティングテーブルを表示するには $ netstat -r とすること.加えて -n オプションをつけても良い. ■コマンドで /proc/net/arp を表示する方法  $ /usr/sbin/arp -a -a は本来はホスト名を指定して1つだけ表示するものだが その後に何もつけないと全て出力される  $ /usr/sbin/arp -n -n はドメイン名ではなくIPアドレスで表示する オプション ■始めからIPアドレスとMACアドレスを対応させておくには /etc/ethers に 00:03:47:0A:C7:6B 133.87.45.72 などと書き込めば良いらしい  (これを間違って書き込んでいると,とてもやばいのでは)  ただし、/proc/net/arp にエントリが残っている場合はそちらが  優先されるらしい.