Program Note

Java(サーブレット,JSPなど),Linuxその他のメモ書きです。
まとまった情報ではないので、何かお探しの方はSearchで検索することをおすすめします。

2002年7月7日 1:22:11

[ネットワーク]2099番アクセスの真実

2099番のアクセスの正体分かりました。別に不正アクセスでも何でもないようです。
というのも、昔このサイトはYahooの80番塞ぎの対策のため、2099番で運用していたのでした。
誰かがそのアドレスを登録したままなのでしょう。いやいや、大騒ぎしたのがお恥ずかしい・・・。

[ネットワーク]「あるWebサイト」を見ると113番に大量にSYNが飛んでくる

どうも、これは勘違いじゃなさそうなんだよなー。
ある熊本の映画館情報を載せたサイトにアクセスすると113番宛のTCPパケットが大量に飛んできている。
何をしたいのかねー。ちなみに113番はidentやauthで使われます。FTP等でファイルをダウンロードするときにident認証を使うところがあるらしいが、Webサイトのページを開いただけでこんなに送ってくるものかねぇー・・・

2002年7月2日 19:36:17

[ネットワーク]2099番アクセス

最近、多い2099番アクセスはどうも以下のソフトの管理用ポートをねらってるのかなーなんて思ってみたり。
http://nwizard.ashisuto.co.jp/outline/index_v41.htm
http://nwizard.ashisuto.co.jp/outline/faq/faq.htm#dousa-A7
ここのQ&Aにそのあたりが書かれてます。
なぜか、210.199.215.14から、このアクセスが不定期にあるんだよね。なんだろ。何かのいやがらせか(笑)
※Webの巡回に2099番なんて関係ないからなー、意味不明である。
 そういや、最近1433番のアクセスも多いね。最近、パッケージソフトでMSDEって多いから、それねらいかな。
 ウワサの次期OSに似た物が標準搭載されるらしいので、今後増えるかもなー(笑)

2002年6月15日 13:24:29

[ネットワーク]ブロードキャストとか

受け付けないパケットのログを取るようにしてみたが、これが膨大な量のログになっている。自分に関係ないパケットがかなり飛んできていることがわかった。他のプロバイダ使っていたときはそんなのよく知らなかったから確かめてないのだけど、これってYahooBBがケーブルテレビと一緒でLANと同じネットワーク形態になっているからなのかも・・・。

たとえば、宛先が239.255.255.250:1900のログが大量に残っている。これはIPアドレス239.255.255.250の1900番ポートへの通信ということだ。ポート番号1900番(UDP)はMSMessengerのポートらしい。俺はそんなの使ってないが・・・。
ではIPアドレス239.255.255.250とは何か?当然、自分のマシンはこんなIPではない。

実はこれはブロードキャストを表すIPで、ここにパケットをとばすと、同じネットワークアドレスのマシンに同報通信されるというものである。
ブロードキャストに使うIPには決まりがあるらしい↓
http://www.zdnet.co.jp/help/howto/win/win2000/0010exchange/03/14.html
これまたよく飛んでくるIGMPパケットについても少し書いてある。

IPからかえってきたホスト名がYahooBBの他のユーザーの物だったので、その人がMessengerを立ち上げているのだろう。
Linuxのsyslogの514番(UDP)ブロードキャストも飛んできてたな。
それってよく知らないけど大丈夫なのだろうか。サービス名からするとすごくやばそうだが(笑)
※後で見てみたらルーターのログを送る機能などで使われてるみたいだけど、受け取ったやつを処理すればログが見れてしまうのだろうか(笑)それになぜブロードキャストで送るのか?!

2002年6月8日 19:42:50

[qmail]me,bouncehostファイルの指定

メールの宛先のユーザーがいない場合に、送り主にエラーメールを返すが、その時のメールに表示されるホスト名を指定するのがbouncehost。
このファイルが無い場合はmeファイルにかかれているホスト名を使う。
meファイルにはホスト名を指定するので、xxxx.a-tak.comという形の物を入れなくてはいけない。
bouncehostを指定していない場合はMAILDAEMON@xxx.a-tak.comというアドレスからメールが送られるような形になるので、そういう風にしたくない場合に使う。

[qmail]localsファイルの指定

localsファイルはどのドメインからのメールをローカル処理とするかをしているするファイルらしいです。
これを指定しない場合meファイルが使われます。ドメインなんで、ホスト名まで指定しているmeファイルを使われては困るということで、localsファイルに記述しましたが、メールが届かなくなりました。

・・・って同じ間違い前もやってますね。
localsファイルを使ってはいけないようです。

[linux]スクリプトの最後は必ず改行する

スクリプトの最後の行は必ず改行しないと、うまく動かないことがあるみたい。
pop3メールのログをとるスクリプトを書いたが最後に改行を入れてなかっただけで、どうやってもログをとってくれないことがありました。

2002年6月5日 21:33:14

[Java]型拡張や型縮小

勝手に型変換がかかるのはVBだけかと思ってましたが、Javaでも面倒を無くすため(?)勝手に型変換が行われるようです。
しかし、勝手に型変換されるのは小さい物から大きいもの(intからlongなど)だけで、縮小変換に関しては(int)などのように明示的キャスト指定しないといけません。ただ、縮小変換は気をつけないと思いも掛けない結果になります。
自分は小数を含むdouble型の数値を整数にしようと思い(int)を使いまくってたところ、思いも寄らぬ結果になりました。たとえば、
int day;

day = (int)12345678901234567890.0;
System.out.println(day);
極端な話こんなソースを書いてましたが、実行すると結果は
2147483647
となります。
もし今回のように、無理矢理double型からint型に置き換えると、int型に入れることが出来る最大値が入ります。2147483647というのがint型で表せる一番大きい数値です。
ですから、本来は小数点以下を切り捨てたいときはMath.floorなどを使うべきでしょう(^_^)

数値リテラル(ソースに直に書いている数値)にも型があります。上の例のように小数点を含めると、その数値はdouble型として扱われます。ためしに上のソースで小数点以下の.0を外すとエラーになります。小数点以下がない数値リテラルは整数型として扱われ、整数型では最大でlong型の9223372036854775807までの数値しか表せないからです。

また、足し算、かけ算などで範囲を超える数値になってしまった場合も、予想もしないことになります。たとえば、
int day2;
day2 = 2147483647 + 1;
System.out.println(day2);
これの結果は「-2147483647」です。たし算しているにもかかわらずです。
なぜこうなるか、すぐには私も説明できません(笑)。
数値をビット列にしたときに、どういう結果になるかを考えればたぶんわかるでしょう(笑)Javaのint型は32ビット符号付きです。
31ビットで数値を表し、1ビットで符号を示します。関数電卓とかあれば、2進数モードで1を31個打ち込んで10進数に変換すれば、2147483647になります(^_^)
確か、最初か最後のビットに「1」がついているときにマイナスだ、という判断になっていたと思います。
10進数で2147483647を表すビット列に1を足したときにどのようなビットの並びになるか見ればわかるでしょう。
面倒なので、ここではやりませんが(笑)

今回、FreeTalkにあるヴァナ・ディール時間表示アプレットを作っていてハマりました(笑)
Date.getTimeクラスはミリ秒単位の数値を返してくるので、とても大きな数値を扱うことになります。
そして、間違った範囲にたいしてint型でキャストを掛けていたので、見事に今回の罠に引っかかったわけです(笑)
まあ、いろいろ作ってみると勉強になりますね(^_^)
その点JavaScriptは適当に処理してくれるので楽だったわけですね。

2002年5月13日 23:33:11

[Javaというか.NETというか]インターフェースについて考えてみた

Interfaceって実装ができんAbstractなクラスみたいなものか?じゃあ、いらん!とか思っていたが、いろいろ調べてみると必要性が何となく分かってきた。
機能は一緒だけど用途が違うわけです。インターフェースだけにインタフェースとして使うわけです・・って訳分からんか。

たとえば、下の例。
マイクロソフトのwmv形式に対応したムービー再生ソフトを作ることを想像して欲しい。
wmv形式を再生するにはMicrosoftクラスを継承して、自分でクラスを作らないといけないとする。
playメソッドを作って、それを実行することでムービーが再生されるようなクラスにしてみる。
Microsoftクラス
↓継承
wmvクラス
Class wmv extends Microsoft {
 public void play() {
    ~再生処理~
  }
}
Class PlayList {
 Public static main(String arg[]) {
   wmv p1 = new wmv();
  Player py = new Player();
  py.startMusic(p1);
}
Class Player {
  Public void startMusic(wmv music) {
  music.play();
 }
}
クラスPlayListが始まりのきっかけとなるクラスで、wmvクラスやPlayerクラスをインスタンス化し、Playerクラスで再生を行う。
このPlayerクラスはwmvクラスと密接に関係を持っている。引数の型がwmv型だからだ。これじゃ、他の用途に使えん!!
たとえば、QuickTimeを再生させたくなった場合、QuickTime形式を再生するにはAppleクラスを継承して、自分でクラスを作らないといけないとする。
Appleクラス
↓継承
QuickTimeクラス
Class QuickTime extends Apple {
 public void play() {
    ~再生処理~
  }
}
これで、Playerが両方で使えたらと思うのは当然。
こういう時はポリモーフィズムで実現するのがベストだが、親のクラスが違うから、継承によるポリモーフィズムは使えません。
無理矢理、MicrosofとAplleクラスのソースを書き換えて、その上にMovieというクラスを作ってしまう?
それもありかもしれませんが、MicrosoftやAppleクラスがMovieに特化したものでなければ、なんだかオブジェクト指向ぶちこわしな継承構造を作ってしまうようでよろしくありません。そもそも、その二つのクラスのソースがさわれない場合はどうしようもありません。

じゃあ、あきらめてそれぞれ、別々にクラスを作って、メソッド作って、・・って似たようなプログラム二つ作るのと同じなんじゃ?、ということなるでしょう。

そんな時どうするか、共通のインターフェースを作成するという手法を使います。
interface Iplay {
 void play();
}
こんなインターフェースを作って、wmvとQuickTimeに実装します。
wmvとQuickTimeのplayメソッドはIplayインターフェースのplayメソッドを実装するという形になる。
Class wmv extends Microsoft implements Iplay {
 public void play() {   /*Iplayのplayメソッド実装*/
    ~再生処理~
  }
}
Class QuickTime extends Apple implements Iplay {
 public void play() {  /*Iplayのplayメソッド実装*/
    ~再生処理~
  }
}
Class PlayList {
  public static main(String arg[]) {
     Iplay p1 = new wmv();     /*二つともIplay型の変数に代入できる*/
     Iplay p2 = new QuickTime();
    Player py = new Player();
 
  py.startMusic(p1);
  py.startMusic(p2);
  }
}
Class Player {
  Public void startMusic(Iplay music) {  /*Iplay型を実装していれば何でも受け付けOK*/
    music.play();
 }
}
ところで、Playerクラスで、playメソッドを実行していますが、もし渡されたオブジェクトにplayメソッドが無かった場合はどうなんでしょう?

・・・という心配は必要ありません。インターフェースのルールで、インターフェースをImplementsした場合は、そのクラスは必ずインターフェースに定義してあるメソッドを必ず定義しないといけないようになっているからです。
また、インターフェースはいくつでも実装(implements)できるので、今回のように既に継承を行っているクラスでも問題なく適用できます。
うまいこと出来てますね。
Playerクラスを見ると最初の例と違って、Iplayインターフェースを実装しているクラスならば、何でも受け取れるので、mpegだって、RealPlayerだってOKです。
まあ、こんな感じでインターフェースだけに、二つ(とも限らない?)のクラスをつなぐインターフェースとして意味があるわけです。
Abstract Classにこんな芸当はできません。やはり、継承の為のひな形であるAbstract Classとインターフェースの用途は大きく違います。

2002年5月11日 23:24:11

[ipchains]SYNパケットは受け付けない

外からコネクションを掛けてくるものを防ぎたい場合は「-y」オプションを使う。
-yはSYNパケットを示すので、これをDENYしておけば、よろし。
以下を参照しました。

http://www.gcd.org/sengoku/Welcome.ja.html
http://hp.vector.co.jp/authors/VA000770/docs/NikkeiLinux00-11/Welcome.ja.html
もちろんWebとか立てるなら、そこに関するSYNは拒否したらダメだぞ(^_^)

[Linux]セキュリティー高めるため読んでおくと為になるページ

ステルススキャンについて調べていたところ、こんなページ見つけました。
なるほど、そういうことなのか。
為になります。「家庭内LANハードウェア以前」が笑えます(^_^)
http://www.geocities.co.jp/SiliconValley-Cupertino/5128/index.html

ブラウザだけでURLエンコードされた文字を解析(^_^)

最近のバージョンのanalogは、検索文字列が文字化けしたような形になって、何で検索してうちのサイトに来たのかわからない。
%df%deとかいう文字の羅列はURLエンコードという形で日本語をアスキー形式に置き直したもの。
これを簡単に日本語に直す裏技を発見!(笑)

やり方はYahooで何か適当なキーワードで検索した後、URL欄の「query?p=」の後に、解読したい文字をペースト!あーんどEnterキー
それを日本語にデコードして、Yahooが検索してくれるので、結果を見れば元々の文字が分かります(^_^)
あ、これnamazuでも一緒のこと出来るや。

2002年5月11日 0:27:26

[Linux]AWStats

思わずrootで、rm -frでanalogのフォルダ消しちゃいました(笑)
最近のanalogは日本語をURLエンコードのまんま(?)で出力しちゃうし、クロスサイトスクリプティング問題も見つかってるので、AWStatsに変えてみました。
日本語で紹介している素晴らしいサイトがあったので、それを参考にAWStats4.0を入れてみます(ここは3.0のインスト方法なので、4.0とはちょっと違うみたいですが)。

「LinuxとフレッツISDN/フレッツADSLによるInternet Serverの構築」
http://www.ryu.dyn.to/
http://www.ryu.dyn.to/Tools/AWStats.html

結局、バージョンが違うので英語のマニュアルを元に設定して、とりあえず、画面は出るようになりましたが、さっぱりログを拾ってこずに、すべての値が0の状態(涙)
今日はひとまずこれにて終わる。
画面がかっこいいので使えるようにしたいんだけどね。
(でも、ほんと日本語表示が直訳です。「いつ」、「だれ」って(笑))

2002年5月9日 22:24:14

[ipchains]input,outputとデバイスの意味づけ

inputのデバイス指定はパケットが入ってくるデバイス
outputのデバイス指定はパケットが出て行くデバイス

内から外のみを許したい場合は

ipchains input -i 内側デバイス名 -j ACCEPT
ipchasins forward -i 外側デバイス名 -j ACCEPT
ipchains output -i 外側デバイス名 -j ACCEPT

という感じで設定する。

最近、Linuxサーバーブーム(笑)でありがちな以下のような構成の場合、
インターネット ----
LANカード
(eth0)
Linuxルーター

Webサーバー
----
LANカード
(eth1)
クライアントマシン
インターネットに公開しているサーバーへのアクセスはinputとoutputのみで調整できる。

input -p tcp --dport http -i eth0 -j ACCEPT
output -p tcp --sport http -i eth0 -j ACCEPT

outputも指定しているのは、インターネット側からリクエストされた接続に対し、レスポンス(返答)を返さないといけないため。
ルーター専用機であれば、このあたりは自動でやってくれるはずだが、Linuxはちゃんと設定しておかないとだめ。

サーバーまでではなく、クライアントマシンまで届く必要があるパケットはforwardも指定する。DNSが参照できるようにする。
input -p udp --sport 53 -i eth0 -j ACCEPT
forward -p udp --sport 53 -i eth1 ACCEPT
output -p udp --sport 53 -i eth1 ACCEPT

forwardとoutputのデバイス指定は出力先のデバイスを選択する。今回はクライアントマシン側のeth1デバイスを指定。
それと、最後のoutputの時のソースIPはeth1のIPになるんだね。逆に内から外だと、ソースIPはeth0のIPになります。
IPを元にフィルタリングしている場合は注意。

[ipchains]パケットログの記録

ipchainsの-lオプションでsyslogに出力されるログについては以下の「パケットログの記録」の章に説明されている。
http://www.linux.or.jp/JF/JFdocs/IPCHAINS-HOWTO-4.html#ss4.1
ここを見て分かったが、ログにあるPROTOはプロトコルを表す番号で、対応するプロトコルは/etc/protocolsに入っている。ま、こんな感じ。
ip 0 IP
icmp 1 ICMP
igmp 2 IGMP
ggp 3 GGP
ipencap 4 IP-ENCAP
st 5 ST
tcp 6 TCP
egp 8 EGP
pup 12 PUP
udp 17 UDP
hmp 20 HMP
xns-idp 22 XNS-IDP
rdp 27 RDP
iso-tp4 29 ISO-TP4
xtp 36 XTP
ddp 37 DDP
idpr-cmtp 39 IDPR-CMTP
ipv6 41 IPv6
ipv6-route 43 IPv6-Route
ipv6-frag 44 IPv6-Frag
ipv6-crypt 50 IPv6-Crypt
ipv6-auth 51 IPv6-Auth
ipv6-icmp 58 IPv6-ICMP
ipv6-nonxt 59 IPv6-NoNxt
ipv6-opts 60 IPv6-Opts
rspf 73 RSPF
vmtp 81 VMTP
ospf 89 OSPFIGP
ipip 94 IPIP
encap 98 ENCAP

ポート番号が65535の物というのはプロトコルがTCP,UDP,ICMP以外の物はそうなるみたい。ICMPではICMPのタイプを表す。

2002年5月9日 1:38:25

[Linux]ポートフォワーディング(静的ポートフォワーディング?)

この前からコンテストが始まった「Terrarium」をやってみようかなーということで、試してみるがさっぱり他の生物が自分の所に来ない。
たぶん、ファイアウォールの設定だろうなーということで、適当な設定のファイアウォールをある程度ちゃんとやり直すことに。
ipchainsで「-l」オプションをつけて、ログを見ながらポートをあけて、普通にインターネット環境とサービスの公開は出来る状態になったが、テラリウムで使用するポートを開けても、やっぱり生物はやってこない。
確かにポートの穴は空いてるのに、ログにすら出ないと言うことは何も来ていないということか?!と思い、ちょっと自分の勘違いに気づきはじめる。
「もしかして、内向きの接続ってipchainsだけではダメなのか?」ということで、会社の友人に聞くが、やはりダメだということで(笑)
ファイアウォール内のマシンに外からセッションをはることは、基本的には出来ない」らしい・・

Linuxではipmasqadmというものがどうも必要らしい。
これで、あるポートに通信が来たときに、指定したマシンに転送をかけるようだ。IPフォワーディングで同じ事が出来ると思ってた(^_^)
内部ネットワーク内のサーバーに外から接続できるようにするには、ポートフォワーディングを行うこと。
確かに聞いたことあったけど、NATとなんか混同してたみたい。さらに恥の上塗り(笑)
ついでにIPマスカレードはこういうことだったんですね。

#よく読んでたここにもしっかり書いてあった。そういやNATと同じだと思ってたから読まなかったんだった(汗)

[Linux]サービス名とポートの対応指定

Vineの場合/etc/servicesの中に記述がある。
ここのサービス名を書き換えると、netstatなどを実行した際にその名前で表示される

2002年5月8日 0:05:08

[Linux]外からポートスキャンをかけてくれるサイト その2

下で紹介したページがなぜかアプレットのエラーで使えなくなってたので、他を探してみた。

こちらのサイトに使い方と共に、ポートスキャンをかけくれるサイトの紹介がありました。

鷹巣の自宅サーバー
http://sakaguch.com/top.html
http://sakaguch.com/ServicePort.html

Sygate Online Services
http://scan.sygatetech.com/
ここって、よく使うポートだけじゃなくて、1番から順番にしらみつぶしにポートスキャンすることもできるという強力なサイトです。
当然、自分自身のIPにしかスキャンできませんよ。

2002年5月1日 1:12:54

[Linux]外からポートスキャンをかけてくれるサイト

自分のファイアウォールの設定がちゃんと出来ているかは、内部LANからではわかりません。外からポートスキャンを掛けてもらえば一目瞭然ですが、毎回友達に頼んでスキャンしてもらうのも大変。
で、ポートスキャンしてくれるページを見つけました。
これは便利です。

パーソナルセキュリティー研究所
http://210.143.99.143/~p-sec/pscan.html

2002年4月29日 0:18:23

[ipchain]固定IPではない環境でリモート側のIPを取得してスクリプト内で使いたい

たとえば、固定IPではない環境で、Linuxでルーター兼ファイアウォールを構築する場合は、ローカルのIPは分かったとしてもリモート(インターネット側)のIPは時々変わってしまう。
そんな時は、以下のようなスクリプトでリモートIPを取ってきて、ファイアウォールのルールに適用すれば良い。
(サンプルは以下のリンクにあり。ファイアウォール構築目的なら、これをそのまま使った方がいいのかもしんない)
#EXTDEVはインターネット側のインターフェースのデバイス名を記述
EXTDEV=eth1
#Vine Linuxの場合、上の方のコメントアウトを外して、下の方を#でコメントアウトする
#EXTERNALIP=`ifconfig $EXTDEV | grep "inetアドレス:" | \ awk -F: {'print $2'} | cut -d\ -f 1`
EXTERNALIP=`ifconfig $EXTDEV | grep "inet addr:" | \ awk -F: {'print $2'} | cut -d\ -f 1`
いろいろなコマンドを併用してifconfigで出力されたリモートIPの文字列からIPアドレスだけを取得している。
grepは文字列を検索するのに利用されるコマンド。
awkはここ。

これで、ちゃんとしたファイアウォールが作れるね(^_^)

ちなみにRedHatLinux社のページに、これを使ったファイアウォールのルール設定スクリプトがある。
http://www.redhat.com/support/resources/tips/firewall/firewallservice.html

[vi]便利なショートカット

一番最後の行にジャンプ G
n行目にジャンプ nG
文字列検索 /検索文字列
続けて検索 /
コピー Y
ペースト p
一画面下 ctrl + f
一画面上 ctrl + b
行頭に移動 0
行末に移動 $
これだけあればなんとかなるっしょ。

2002年4月26日 23:09:11

[リンク]豆蔵のページ

UMLとかオブジェクト指向とか為になります。
http://www.mamezou.com/
最近、さっぱりJava触ってないです。
残業しまくりなのと.NETをよく使ってるので。

[Linux]なぜか名前解決できず→nslookupで復活?!

会社からどうしても家に繋がらなかったのだが、なぜかnslookup2発目で名前解決成功、wwwにも繋がるようになる。
なんでだろう?

2002年3月25日 0:42:21

[Jamchi]どうでもいいんですが・・・

Jamchiってどっかの言葉で「駅伝」を意味する言葉らしい・・・
ほんと、どうでもいいんですけどね。

2002年3月10日 13:38:54

[OpenSSH]アップグレード

セキュリティーホールが見つかったようなので、アップグレードしてみる。
以下を参照して行ってみた。前回は、sshのインストールの方法のリンクを貼っていたので、なんか勘違いしてたのかも。
RPMでインストールしようとしたら、opensslのバージョンが違うとか、なんとかかが無いとか言ってきた。以下のリンクを元にそれも落としときましょう。
http://www.unixuser.org/~haruyama/security/openssh/INSTALL_nihongo.txt

2002年3月7日 21:48:41

[qmail]こ、これか!!

メール送信の激遅現象の原因はこれかも
http://www.debian.or.jp/Lists-Archives/debian-users/200106/msg00261.html
qmailはhostsファイル見ないらしい・・・・
tcpserverに「-H」オプションをつけるといいみたいね
というわけでtcpserverのマニュアル日本語訳
-Hをつけるとリモートホスト名を調べないらしい。何かあったときに危険と言えば危険だな・・・。
でも、かなり激早に。というか、最初dynodns時代に早かったのはなぜ?

2002年3月5日 2:11:16

[qmail]また送信が遅くなる

ホスト名を変更してからか、またメールの送信まで一分近くかかるようになってしまった。
やっぱり前回のリンク先にあった情報のようにネームサーバーの設定がまずいのかも。

Received: from unknown (HELO xxx) (x.x.x.x)
by yahoobbxxxxxxxxxx.bbtec.net
with SMTP;
ってメールのヘッダに出てる。普通はunknownになっていない。
自分はネームサーバーは立ててないので、そこをどのようにするか考えないといけない。