メモ: 2008年6月アーカイブ
前回のこのエントリーの続きといいますか、シリーズになっちゃってる感が否めないですがw
珠玉のエロ画像でbashのお勉強です。井上和香、唇がエロくて大好きです。そんな (っ´∀`)っ ゃー が寝ながら画像getして翌朝ムフフと楽しみたいという動機で今回はワンライナーで連番のエロ画像を取得します。
今回のターゲットはココ。
ttp://intervalues6.com/w/waka.html
ttp://intervalues6.com/w/waka2.html
ttp://intervalues6.com/w/waka3.html
ttp://intervalues6.com/w/waka4.html
これらにリンクされている画像を普通にwgetで
$ for i in `echo {1..100}`; do sudo wget http://intervalues6.com/w/waka$i.jpg; done
なんてダウンロードしようと思ったのですが、ここのサーバはちゃんとリファラ対策をしています。
なので、wgetでリファラくっつけてダウンロードするには
$ for i in `echo {1..100}`; do wget --referer=http://intervalues6.com/w/waka.html http://intervalues6.com/w/waka$i.jpg; done
こうします。waka[2-4].htmlからリンクされている画像であっても、サーバサイドでは
「どこぞのドメインからのリファラを許可するか」しか見ていないので、すべてwaka.htmlからのリファラでいけます。
なお、実際にダウンロードしてみるとわかるのですが、waka92.jpg以降が404なので、idol.htmlにリダイレクトされていますので、適宜これを削除します。
$ rm -f idol.html*
================================================================================
今日のワンポイント
wgetコマンドで画像直getできなかったら、同じドメインの適当なURL(存在するファイルで)で
リファラをくっつけてやろう
================================================================================
次に、curlコマンドで同じことをやってみます。
curlコマンドの -e オプションで、リファラをくっつけてやります。
-O オプションがないと、ファイルとして保存できません。
$ for i in `echo {1..100}`; do curl -e http://intervalues6.com/w/waka.html -O http://intervalues6.com/w/waka$i.jpg; done
さてこれだと
$ ls
waka100.jpg waka18.jpg waka26.jpg waka34.jpg waka42.jpg waka50.jpg waka59.jpg waka67.jpg waka75.jpg waka83.jpg waka91.jpg waka9.jpg
waka10.jpg waka19.jpg waka27.jpg waka35.jpg waka43.jpg waka51.jpg waka5.jpg waka68.jpg waka76.jpg waka84.jpg waka92.jpg
waka11.jpg waka1.jpg waka28.jpg waka36.jpg waka44.jpg waka52.jpg waka60.jpg waka69.jpg waka77.jpg waka85.jpg waka93.jpg
waka12.jpg waka20.jpg waka29.jpg waka37.jpg waka45.jpg waka53.jpg waka61.jpg waka6.jpg waka78.jpg waka86.jpg waka94.jpg
waka13.jpg waka21.jpg waka2.jpg waka38.jpg waka46.jpg waka54.jpg waka62.jpg waka70.jpg waka79.jpg waka87.jpg waka95.jpg
waka14.jpg waka22.jpg waka30.jpg waka39.jpg waka47.jpg waka55.jpg waka63.jpg waka71.jpg waka7.jpg waka88.jpg waka96.jpg
waka15.jpg waka23.jpg waka31.jpg waka3.jpg waka48.jpg waka56.jpg waka64.jpg waka72.jpg waka80.jpg waka89.jpg waka97.jpg
waka16.jpg waka24.jpg waka32.jpg waka40.jpg waka49.jpg waka57.jpg waka65.jpg waka73.jpg waka81.jpg waka8.jpg waka98.jpg
waka17.jpg waka25.jpg waka33.jpg waka41.jpg waka4.jpg waka58.jpg waka66.jpg waka74.jpg waka82.jpg waka90.jpg waka99.jpg
おや?実は100個jpgがあった?
$ for i in `echo {90..100}`
> do
> file waka$i.jpg
> done
waka90.jpg: JPEG image data, JFIF standard 1.01
waka91.jpg: JPEG image data, JFIF standard 1.01
waka92.jpg: HTML document text
waka93.jpg: HTML document text
waka94.jpg: HTML document text
waka95.jpg: HTML document text
waka96.jpg: HTML document text
waka97.jpg: HTML document text
waka98.jpg: HTML document text
waka99.jpg: HTML document text
waka100.jpg: HTML document text
はい、やっぱりwaka92.jpg以降は404でリダイレクトされた後のhtmlファイルを拾ってきています。それでは、92から100までのファイルを削除したいのですが、ここではfileコマンドでJPEGじゃないファイルを拾って削除することにします。
$ for i in `ls`; do for f in `file $i | grep -v "JPEG image data" | awk '{print $1}' | sed s/\:$//g`; do rm -f $f; done; done
これでOKです。for文の入れ子で、削除するファイルを指定してやります。外側のfor文は、カレントディレクトリ全体をlsし、内側のfor文で、うそんこJPEG(拡張子は.jpgなんだけど中身がJPEGじゃない)なデータをとっ捕まえて、出力結果をawkとsedで整形し、削除してやります。
上記の例だと、たまたま92から100まで連続してうそんこJPEGだってわかってるからいいようなものの、連番のファイルじゃなかったり、連番のファイルであっても、飛び飛びにうそんこJPEGが混じっているようなときに楽してファイル整理をすることができます。
ね、簡単でしょ?
珠玉のエロ画像でbashのお勉強です。井上和香、唇がエロくて大好きです。そんな (っ´∀`)っ ゃー が寝ながら画像getして翌朝ムフフと楽しみたいという動機で今回はワンライナーで連番のエロ画像を取得します。
今回のターゲットはココ。
ttp://intervalues6.com/w/waka.html
ttp://intervalues6.com/w/waka2.html
ttp://intervalues6.com/w/waka3.html
ttp://intervalues6.com/w/waka4.html
これらにリンクされている画像を普通にwgetで
$ for i in `echo {1..100}`; do sudo wget http://intervalues6.com/w/waka$i.jpg; done
なんてダウンロードしようと思ったのですが、ここのサーバはちゃんとリファラ対策をしています。
なので、wgetでリファラくっつけてダウンロードするには
$ for i in `echo {1..100}`; do wget --referer=http://intervalues6.com/w/waka.html http://intervalues6.com/w/waka$i.jpg; done
こうします。waka[2-4].htmlからリンクされている画像であっても、サーバサイドでは
「どこぞのドメインからのリファラを許可するか」しか見ていないので、すべてwaka.htmlからのリファラでいけます。
なお、実際にダウンロードしてみるとわかるのですが、waka92.jpg以降が404なので、idol.htmlにリダイレクトされていますので、適宜これを削除します。
$ rm -f idol.html*
================================================================================
今日のワンポイント
wgetコマンドで画像直getできなかったら、同じドメインの適当なURL(存在するファイルで)で
リファラをくっつけてやろう
================================================================================
次に、curlコマンドで同じことをやってみます。
curlコマンドの -e オプションで、リファラをくっつけてやります。
-O オプションがないと、ファイルとして保存できません。
$ for i in `echo {1..100}`; do curl -e http://intervalues6.com/w/waka.html -O http://intervalues6.com/w/waka$i.jpg; done
さてこれだと
$ ls
waka100.jpg waka18.jpg waka26.jpg waka34.jpg waka42.jpg waka50.jpg waka59.jpg waka67.jpg waka75.jpg waka83.jpg waka91.jpg waka9.jpg
waka10.jpg waka19.jpg waka27.jpg waka35.jpg waka43.jpg waka51.jpg waka5.jpg waka68.jpg waka76.jpg waka84.jpg waka92.jpg
waka11.jpg waka1.jpg waka28.jpg waka36.jpg waka44.jpg waka52.jpg waka60.jpg waka69.jpg waka77.jpg waka85.jpg waka93.jpg
waka12.jpg waka20.jpg waka29.jpg waka37.jpg waka45.jpg waka53.jpg waka61.jpg waka6.jpg waka78.jpg waka86.jpg waka94.jpg
waka13.jpg waka21.jpg waka2.jpg waka38.jpg waka46.jpg waka54.jpg waka62.jpg waka70.jpg waka79.jpg waka87.jpg waka95.jpg
waka14.jpg waka22.jpg waka30.jpg waka39.jpg waka47.jpg waka55.jpg waka63.jpg waka71.jpg waka7.jpg waka88.jpg waka96.jpg
waka15.jpg waka23.jpg waka31.jpg waka3.jpg waka48.jpg waka56.jpg waka64.jpg waka72.jpg waka80.jpg waka89.jpg waka97.jpg
waka16.jpg waka24.jpg waka32.jpg waka40.jpg waka49.jpg waka57.jpg waka65.jpg waka73.jpg waka81.jpg waka8.jpg waka98.jpg
waka17.jpg waka25.jpg waka33.jpg waka41.jpg waka4.jpg waka58.jpg waka66.jpg waka74.jpg waka82.jpg waka90.jpg waka99.jpg
おや?実は100個jpgがあった?
$ for i in `echo {90..100}`
> do
> file waka$i.jpg
> done
waka90.jpg: JPEG image data, JFIF standard 1.01
waka91.jpg: JPEG image data, JFIF standard 1.01
waka92.jpg: HTML document text
waka93.jpg: HTML document text
waka94.jpg: HTML document text
waka95.jpg: HTML document text
waka96.jpg: HTML document text
waka97.jpg: HTML document text
waka98.jpg: HTML document text
waka99.jpg: HTML document text
waka100.jpg: HTML document text
はい、やっぱりwaka92.jpg以降は404でリダイレクトされた後のhtmlファイルを拾ってきています。それでは、92から100までのファイルを削除したいのですが、ここではfileコマンドでJPEGじゃないファイルを拾って削除することにします。
$ for i in `ls`; do for f in `file $i | grep -v "JPEG image data" | awk '{print $1}' | sed s/\:$//g`; do rm -f $f; done; done
これでOKです。for文の入れ子で、削除するファイルを指定してやります。外側のfor文は、カレントディレクトリ全体をlsし、内側のfor文で、うそんこJPEG(拡張子は.jpgなんだけど中身がJPEGじゃない)なデータをとっ捕まえて、出力結果をawkとsedで整形し、削除してやります。
上記の例だと、たまたま92から100まで連続してうそんこJPEGだってわかってるからいいようなものの、連番のファイルじゃなかったり、連番のファイルであっても、飛び飛びにうそんこJPEGが混じっているようなときに楽してファイル整理をすることができます。
ね、簡単でしょ?
ntopとは、各種プロトコルの情報やホストごとの送受信パケット数/データ量やスループットの他、トラフィックの時間経過グラフ、ホスト間の通信データ量などをブラウザでわかりやすく表示してくれるソフトです。コンソールからも使えるようですが、目に見えてわかりやすいのは、ブラウザに表示されるグラフでしょう。
インストール後の設定については、
http://www.geocities.jp/i_catnap/Diary/Diary-0404.html
を参考にしました。
ただインストールしても動くのですが、LAN内を流れるパケットをモニターする関係上、誰にでもグラフを見せていいか?・・・となると、ちょっと疑問が残ります。ntopそのものはユーザによるアクセス制限(見せたいデータの権限を指定)がありますが、ntopへのそもそものアクセスを、限られたユーザだけにしたいなー・・・という思いもあったりします。なので、
ntopを動かす(待ち受ける)インターフェイスはeth0
ntopにアクセスできるノードはeth0の属するサブネット(192.168.0.0/24)のみ
ntopの画面にはiptablesを使って直アクセスさせず、一度apacheのmod_proxyを介して、ベーシック認証を通過させる
ユーザがntopの画面を見るまでには、以下のステップを踏むことになります。
[パソコンのブラウザ] → [apache (ベーシック認証、mod_proxyによるリバースプロキシ)] → [ntop]
また、ユーザは http://192.168.0.3/ にアクセスしてユーザ名とパスワードを聞かれることを意識するくらいで使うことができますし、使わせる側としても、不必要に裏側でどう動いているかを見せなくてすむというメリットがあります。
■■ インストール
インストールした環境は以下のとおりです。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
sh-3.00$ hostname
intra1.example.com
sh-3.00$ cat /etc/redhat-release
CentOS release 4.6 (Final)
sh-3.00$ uname -a
Linux intra1.example.com 2.6.9-67.0.15.EL #1 Thu May 8 10:39:19 EDT 2008 i686 i686 i386 GNU/Linux
----------------------------------------------------------------------------------------------------------------------------------------------------------------
ntopのパッケージはrpmforgeリポジトリにあるので、ここからインストールします。
[root@intra1 ~]# yum --enablerepo=rpmforge install ntop
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
ntop i386 3.3-1.el4.rf rpmforge 3.4 M
Installing for dependencies:
net-snmp-libs i386 5.1.2-11.el4_6.11.2 update 1.7 M
Transaction Summary
=============================================================================
Install 2 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 5.2 M
Is this ok [y/N]: y
■■ 設定
■ ntop.conf 編集
[root@intra1 ~]# cd /etc/
[root@intra1 etc]# cp -p ntop.conf ntop.conf.orig
[root@intra1 etc]# vi ntop.conf
・ ログの出力先を変更する
ここを
### Logging messages to syslog (instead of the console):
### NOTE: To log to a specific facility, use --use-syslog=local3
### NOTE: The = is REQUIRED and no spaces are permitted.
--use-syslog
こうする
### Logging messages to syslog (instead of the console):
### NOTE: To log to a specific facility, use --use-syslog=local3
### NOTE: The = is REQUIRED and no spaces are permitted.
#--use-syslog
--use-syslog=local3
※ syslogのファシリティに空きがあるかどうか(local3が使われていないか)を/etc/syslog.confを見て確認すること
・ ntopがローカルとみなすネットワークを設定する
ここを
### Sets the networks that ntop should consider as local.
### NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
### The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
こうする
### Sets the networks that ntop should consider as local.
### NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
### The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
--local-subnets 192.168.0.0/24
・ ntopをデーモンモードで動かす
ここを
### Sets program to run as a daemon
### NOTE: For more than casual use, you probably want this.
#--daemon
こうする
### Sets program to run as a daemon
### NOTE: For more than casual use, you probably want this.
#--daemon
--daemon
以上を確認して保存します。
■ スタートスクリプトの編集
/etc/init.d/ntopを編集して、eth0のIPアドレスでのみlistenするようにします。
まずはifconfigコマンドでeth0のIPアドレスを確認しましょう。
sh-3.00# ifconfig eth0 | grep "inet addr"
inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0
eth0に割り当てられているIPアドレスは192.168.0.3です。
sh-3.00# cd /etc/init.d
sh-3.00# cp -p ntop ntop.orig
sh-3.00# vi ntop
ここを
start () {
echo -n $"Starting $prog: "
daemon $prog -d -L @/etc/ntop.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/\$prog
return $RETVAL
}
こうする
start () {
echo -n $"Starting $prog: "
#daemon $prog -d -L @/etc/ntop.conf
daemon $prog -d -w 192.168.0.3:3000 -L @/etc/ntop.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/\$prog
return $RETVAL
}
スタートスクリプトからntopを起動するときのオプションは以下のとおりです。
-d = デーモンモードとして動かす
-w 192.168.0.3:3000 = IPアドレス192.168.0.3のポート3000番で待ち受ける
-L = 標準出力のかわりにsyslogへメッセージを送る
@/etc/ntop.conf = /etc/ntop.conf を設定ファイルとする
■ syslog.conf編集
[root@intra1 etc]# cp -p syslog.conf syslog.conf.20080616
[root@intra1 etc]# vi syslog.conf
ここを
*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
こうする
#*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
そして下記を追加する
local3.* /var/log/ntoplog
■■ syslogdをreloadする
[root@intra1 etc]# /etc/init.d/syslog reload
Shutting down kernel logger: [ OK ]
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
Starting kernel logger: [ OK ]
■■ ntopのログローテーション設定を行う
お好みでログローテーションの設定を変更します。
(っ´∀`)っ ゃー はログを読むためだけにrootになったりするのがイヤなので、
(っ´∀`)っ ゃーが普段使うユーザ「oresama」はwheelグループに入れています。
で、読みたいログはwheelグループに読み込みの権限を与えています。
[root@intra1 etc]# cd logrotate.d/
[root@intra1 logrotate.d]# vi ntop
ここを
/var/log/ntop.access.log {
missingok
postrotate
/sbin/service ntop condrestart >/dev/null 2>&1
endscript
}
こうする
/var/log/ntoplog {
daily
rotate 365
compress
ifempty
create 0640 root wheel
missingok
postrotate
/sbin/service ntop condrestart >/dev/null 2>&1
endscript
}
■■ 初期設定
ntopを最初に動かす前に、ntopの管理ユーザ「admin」のパスワードを設定します。
これは、ntopの細かい設定をブラウザから行うときに使います。
[root@intra1 logrotate.d]# cd
[root@intra1 ~]# /usr/bin/ntop
(しばらくログが流れた後)
ntop startup - waiting for user response!
Please enter the password for the admin user:
Please enter the password again:
というプロンプトが出るので、パスワードを入力し、しばらくしてからCtrl+Cで終了させます。
■■ 起動
■ スタートスクリプトからの起動
[root@intra1 ~]# /etc/init.d/ntop start
Starting ntop: [ OK ]
[root@intra1 ~]# /etc/init.d/ntop status
ntop (pid 559) is running...
■ 自動起動設定
[root@intra1 ~]# chkconfig ntop --list
ntop 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@intra1 ~]# chkconfig ntop on
[root@intra1 ~]# chkconfig ntop --list
ntop 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■■ ブラウザから見てみる
http://192.168.0.3:3000/
グラフはあっさり表示されます。
ユーザ名:admin
パスワード:(さっき指定したやつ)
■■ ベーシック認証を使えるようにする
ntopの認証機能は、画面の一部を見せたり見せなかったりするようですが、
そもそもグラフそのものにアクセスさせたくないっていう場合には、
次の仕組みを使うことによってベーシック認証を実現することができます。
1) 192.168.0.3 をntop専用のバーチャルホストとして、一度apacheで接続を待ち受け、apacheのリバースプロキシを使ってntopへ要求を投げる
2) iptablesでポート3000番をlocalhostにだけ許可する
3) ベーシック認証をかける
■ 1 apacheで192.168.0.3をntop専用のバーチャルホスト設定する
apacheでmod_proxyが使えるかどうか、以下の記述がhttpd.confにあるか確認してください。
LoadModule proxy_module modules/mod_proxy.so
それでは設定です。
sh-3.00# cd /etc/httpd/conf.d
sh-3.00# vi ntop.conf
NameVirtualHost 192.168.0.3:80
<VirtualHost 192.168.0.3:80>
# サーバー名の指定をする
ServerName intra1.example.com
# エラーログの定義
ErrorLog /home/oresama/logs/intra1_error.log
# アクセスログの定義
CustomLog /home/oresama/logs/intra1_access.log combined
# フォワードプロキシをoffにする
ProxyRequests Off
# リモートサーバをローカルサーバのURL空間にマップする。
# ここでは、/にアクセスすると、http://192.168.0.3:3000/にマップする。
ProxyPass / http://192.168.0.3:3000/
<Location />
# ベーシック認証に使うファイルを定義する
AuthUserFile /home/oresama/auth/.htpasswd
AuthGroupFile /dev/null
AuthName "User Admin"
AuthType Basic
require valid-user
# 外部からの接続を拒絶し、LAN内からのアクセスのみ許可する
Order deny,allow
Deny from all
Allow from 192.168.0.0/24
</Location>
</VirtualHost>
■ 設定反映
sh-3.00# apachectl configtest
sh-3.00# apachectl graceful
■ iptablesでポート3000番をlocalhostだけにする
sh-3.00# iptables -L -n | grep 3000
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:3000
■ ベーシック認証をかける
sh-3.00# htpasswd -c /home/oresama/auth/.htpasswd oresama
New password:
Re-type new password:
Adding password for user oresama
sh-3.00# cat /home/oresama/auth/.htpasswd
oresama:n8H0Vb.JKkuRA
■ 確認
http://192.168.0.3/
にアクセスして、ベーシック認証がかかること
http://192.168.0.3:3000/
にアクセスして、接続ができないこと
以上で、LAN内を流れるパケットをモニターすることができました。
ね、簡単でしょ?
インストール後の設定については、
http://www.geocities.jp/i_catnap/Diary/Diary-0404.html
を参考にしました。
ただインストールしても動くのですが、LAN内を流れるパケットをモニターする関係上、誰にでもグラフを見せていいか?・・・となると、ちょっと疑問が残ります。ntopそのものはユーザによるアクセス制限(見せたいデータの権限を指定)がありますが、ntopへのそもそものアクセスを、限られたユーザだけにしたいなー・・・という思いもあったりします。なので、
ntopを動かす(待ち受ける)インターフェイスはeth0
ntopにアクセスできるノードはeth0の属するサブネット(192.168.0.0/24)のみ
ntopの画面にはiptablesを使って直アクセスさせず、一度apacheのmod_proxyを介して、ベーシック認証を通過させる
ユーザがntopの画面を見るまでには、以下のステップを踏むことになります。
[パソコンのブラウザ] → [apache (ベーシック認証、mod_proxyによるリバースプロキシ)] → [ntop]
また、ユーザは http://192.168.0.3/ にアクセスしてユーザ名とパスワードを聞かれることを意識するくらいで使うことができますし、使わせる側としても、不必要に裏側でどう動いているかを見せなくてすむというメリットがあります。
■■ インストール
インストールした環境は以下のとおりです。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
sh-3.00$ hostname
intra1.example.com
sh-3.00$ cat /etc/redhat-release
CentOS release 4.6 (Final)
sh-3.00$ uname -a
Linux intra1.example.com 2.6.9-67.0.15.EL #1 Thu May 8 10:39:19 EDT 2008 i686 i686 i386 GNU/Linux
----------------------------------------------------------------------------------------------------------------------------------------------------------------
ntopのパッケージはrpmforgeリポジトリにあるので、ここからインストールします。
[root@intra1 ~]# yum --enablerepo=rpmforge install ntop
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
ntop i386 3.3-1.el4.rf rpmforge 3.4 M
Installing for dependencies:
net-snmp-libs i386 5.1.2-11.el4_6.11.2 update 1.7 M
Transaction Summary
=============================================================================
Install 2 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 5.2 M
Is this ok [y/N]: y
■■ 設定
■ ntop.conf 編集
[root@intra1 ~]# cd /etc/
[root@intra1 etc]# cp -p ntop.conf ntop.conf.orig
[root@intra1 etc]# vi ntop.conf
・ ログの出力先を変更する
ここを
### Logging messages to syslog (instead of the console):
### NOTE: To log to a specific facility, use --use-syslog=local3
### NOTE: The = is REQUIRED and no spaces are permitted.
--use-syslog
こうする
### Logging messages to syslog (instead of the console):
### NOTE: To log to a specific facility, use --use-syslog=local3
### NOTE: The = is REQUIRED and no spaces are permitted.
#--use-syslog
--use-syslog=local3
※ syslogのファシリティに空きがあるかどうか(local3が使われていないか)を/etc/syslog.confを見て確認すること
・ ntopがローカルとみなすネットワークを設定する
ここを
### Sets the networks that ntop should consider as local.
### NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
### The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
こうする
### Sets the networks that ntop should consider as local.
### NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
### The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
--local-subnets 192.168.0.0/24
・ ntopをデーモンモードで動かす
ここを
### Sets program to run as a daemon
### NOTE: For more than casual use, you probably want this.
#--daemon
こうする
### Sets program to run as a daemon
### NOTE: For more than casual use, you probably want this.
#--daemon
--daemon
以上を確認して保存します。
■ スタートスクリプトの編集
/etc/init.d/ntopを編集して、eth0のIPアドレスでのみlistenするようにします。
まずはifconfigコマンドでeth0のIPアドレスを確認しましょう。
sh-3.00# ifconfig eth0 | grep "inet addr"
inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0
eth0に割り当てられているIPアドレスは192.168.0.3です。
sh-3.00# cd /etc/init.d
sh-3.00# cp -p ntop ntop.orig
sh-3.00# vi ntop
ここを
start () {
echo -n $"Starting $prog: "
daemon $prog -d -L @/etc/ntop.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/\$prog
return $RETVAL
}
こうする
start () {
echo -n $"Starting $prog: "
#daemon $prog -d -L @/etc/ntop.conf
daemon $prog -d -w 192.168.0.3:3000 -L @/etc/ntop.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/\$prog
return $RETVAL
}
スタートスクリプトからntopを起動するときのオプションは以下のとおりです。
-d = デーモンモードとして動かす
-w 192.168.0.3:3000 = IPアドレス192.168.0.3のポート3000番で待ち受ける
-L = 標準出力のかわりにsyslogへメッセージを送る
@/etc/ntop.conf = /etc/ntop.conf を設定ファイルとする
■ syslog.conf編集
[root@intra1 etc]# cp -p syslog.conf syslog.conf.20080616
[root@intra1 etc]# vi syslog.conf
ここを
*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
こうする
#*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
そして下記を追加する
local3.* /var/log/ntoplog
■■ syslogdをreloadする
[root@intra1 etc]# /etc/init.d/syslog reload
Shutting down kernel logger: [ OK ]
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
Starting kernel logger: [ OK ]
■■ ntopのログローテーション設定を行う
お好みでログローテーションの設定を変更します。
(っ´∀`)っ ゃー はログを読むためだけにrootになったりするのがイヤなので、
(っ´∀`)っ ゃーが普段使うユーザ「oresama」はwheelグループに入れています。
で、読みたいログはwheelグループに読み込みの権限を与えています。
[root@intra1 etc]# cd logrotate.d/
[root@intra1 logrotate.d]# vi ntop
ここを
/var/log/ntop.access.log {
missingok
postrotate
/sbin/service ntop condrestart >/dev/null 2>&1
endscript
}
こうする
/var/log/ntoplog {
daily
rotate 365
compress
ifempty
create 0640 root wheel
missingok
postrotate
/sbin/service ntop condrestart >/dev/null 2>&1
endscript
}
■■ 初期設定
ntopを最初に動かす前に、ntopの管理ユーザ「admin」のパスワードを設定します。
これは、ntopの細かい設定をブラウザから行うときに使います。
[root@intra1 logrotate.d]# cd
[root@intra1 ~]# /usr/bin/ntop
(しばらくログが流れた後)
ntop startup - waiting for user response!
Please enter the password for the admin user:
Please enter the password again:
というプロンプトが出るので、パスワードを入力し、しばらくしてからCtrl+Cで終了させます。
■■ 起動
■ スタートスクリプトからの起動
[root@intra1 ~]# /etc/init.d/ntop start
Starting ntop: [ OK ]
[root@intra1 ~]# /etc/init.d/ntop status
ntop (pid 559) is running...
■ 自動起動設定
[root@intra1 ~]# chkconfig ntop --list
ntop 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@intra1 ~]# chkconfig ntop on
[root@intra1 ~]# chkconfig ntop --list
ntop 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■■ ブラウザから見てみる
http://192.168.0.3:3000/
グラフはあっさり表示されます。
ユーザ名:admin
パスワード:(さっき指定したやつ)
■■ ベーシック認証を使えるようにする
ntopの認証機能は、画面の一部を見せたり見せなかったりするようですが、
そもそもグラフそのものにアクセスさせたくないっていう場合には、
次の仕組みを使うことによってベーシック認証を実現することができます。
1) 192.168.0.3 をntop専用のバーチャルホストとして、一度apacheで接続を待ち受け、apacheのリバースプロキシを使ってntopへ要求を投げる
2) iptablesでポート3000番をlocalhostにだけ許可する
3) ベーシック認証をかける
■ 1 apacheで192.168.0.3をntop専用のバーチャルホスト設定する
apacheでmod_proxyが使えるかどうか、以下の記述がhttpd.confにあるか確認してください。
LoadModule proxy_module modules/mod_proxy.so
それでは設定です。
sh-3.00# cd /etc/httpd/conf.d
sh-3.00# vi ntop.conf
NameVirtualHost 192.168.0.3:80
<VirtualHost 192.168.0.3:80>
# サーバー名の指定をする
ServerName intra1.example.com
# エラーログの定義
ErrorLog /home/oresama/logs/intra1_error.log
# アクセスログの定義
CustomLog /home/oresama/logs/intra1_access.log combined
# フォワードプロキシをoffにする
ProxyRequests Off
# リモートサーバをローカルサーバのURL空間にマップする。
# ここでは、/にアクセスすると、http://192.168.0.3:3000/にマップする。
ProxyPass / http://192.168.0.3:3000/
<Location />
# ベーシック認証に使うファイルを定義する
AuthUserFile /home/oresama/auth/.htpasswd
AuthGroupFile /dev/null
AuthName "User Admin"
AuthType Basic
require valid-user
# 外部からの接続を拒絶し、LAN内からのアクセスのみ許可する
Order deny,allow
Deny from all
Allow from 192.168.0.0/24
</Location>
</VirtualHost>
■ 設定反映
sh-3.00# apachectl configtest
sh-3.00# apachectl graceful
■ iptablesでポート3000番をlocalhostだけにする
sh-3.00# iptables -L -n | grep 3000
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:3000
■ ベーシック認証をかける
sh-3.00# htpasswd -c /home/oresama/auth/.htpasswd oresama
New password:
Re-type new password:
Adding password for user oresama
sh-3.00# cat /home/oresama/auth/.htpasswd
oresama:n8H0Vb.JKkuRA
■ 確認
http://192.168.0.3/
にアクセスして、ベーシック認証がかかること
http://192.168.0.3:3000/
にアクセスして、接続ができないこと
以上で、LAN内を流れるパケットをモニターすることができました。
ね、簡単でしょ?
前回のエントリーで作成したスクリプトですが、監視サーバからSSHアクセスしてきたタイミングと、監視対象のVPSサーバのログローテーションのタイミングが重なった場合に、監視サーバのIPアドレスが取得できない(ログから拾えない)ことがあるので、その対策を行いました。
なんで気づいたかっていうと、正しくIPアドレスを取得してmunin-nodeの再起動を行ったときの通知メールは
New munin-server is 123.456.789.012
みたいな件名なのですが、IPアドレスの検出ができなかったときの通知メールは、「New munin-server is」で件名が終わっていて、それでいてmunin-nodeの再起動だけは行われてしまってます。で、munin-node.confには
#allow ^123\.456\.789\.012$
allow ^\.\.\.$
と書かれてしまっているわけです。ちょっと時間をおけば、また監視サーバのIPアドレスのIPアドレスが取得できるっちゃーできるのですが、データの取りこぼしや、munin-nodeの不要な再起動など、よろしくないことばかりです。
そこで、監視サーバのIPアドレス取得スクリプトの修正。やってることは単純で、まずはログに監視サーバのIPアドレスが1行でも記録されているかどうかを判断するif文を追加し、1行も記録されていなかったら何もせず、1行でも記録されていたら、通常のIPアドレス検出→IPアドレスが変更していた場合の処理へと進むようにしています。
以下、変更後のスクリプトです。
#!/bin/sh
LANG=C
ADMIN=【携帯のメールアドレス】
CONFDIR=/etc/munin/
cd $CONFDIR
CF=munin-node.conf
BAK0=munin-node.conf.BAK0
BAK1=munin-node.conf.BAK1
NOW_IP_ADDR=`sudo egrep "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Accepted publickey for watcher0" /var/log/secure | tail -1 | awk '{print $11}'`
OA=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $1}'`
OB=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $2}'`
OC=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $3}'`
OD=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $4}'`
ACCEPTED_IP=`tail -1 $CF | sed -e 's/allow\ \^//' | sed -e 's/\\\\//g' | sed -e 's/\\$//'`
if [ 0 -eq `egrep "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Accepted publickey for watcher0" /var/log/secure | wc -l` ];
then
:
else
if [ $NOW_IP_ADDR = $ACCEPTED_IP ];
then
:
else
# Change config
if [ -f $BAK1 ];
then
rm -f $BAK1
fi
if [ -f $BAK0 ];
then
mv $BAK0 $BAK1
fi
if [ -f $CF ];
then
cp -p $CF $BAK0
fi
sed -i '$s/^allow/#allow/' $CF
echo allow\ \^$OA\\.$OB\\.$OC\\.$OD\$ >> $CF
sudo /etc/init.d/munin-node restart
echo "`date` munin-node restarted" | mail -s "New munin-server is $NOW_IP_ADDR" $ADMIN
fi
fi
毎度毎度へっぽこスクリプトでごめんなさい。。。
なんで気づいたかっていうと、正しくIPアドレスを取得してmunin-nodeの再起動を行ったときの通知メールは
New munin-server is 123.456.789.012
みたいな件名なのですが、IPアドレスの検出ができなかったときの通知メールは、「New munin-server is」で件名が終わっていて、それでいてmunin-nodeの再起動だけは行われてしまってます。で、munin-node.confには
#allow ^123\.456\.789\.012$
allow ^\.\.\.$
と書かれてしまっているわけです。ちょっと時間をおけば、また監視サーバのIPアドレスのIPアドレスが取得できるっちゃーできるのですが、データの取りこぼしや、munin-nodeの不要な再起動など、よろしくないことばかりです。
そこで、監視サーバのIPアドレス取得スクリプトの修正。やってることは単純で、まずはログに監視サーバのIPアドレスが1行でも記録されているかどうかを判断するif文を追加し、1行も記録されていなかったら何もせず、1行でも記録されていたら、通常のIPアドレス検出→IPアドレスが変更していた場合の処理へと進むようにしています。
以下、変更後のスクリプトです。
#!/bin/sh
LANG=C
ADMIN=【携帯のメールアドレス】
CONFDIR=/etc/munin/
cd $CONFDIR
CF=munin-node.conf
BAK0=munin-node.conf.BAK0
BAK1=munin-node.conf.BAK1
NOW_IP_ADDR=`sudo egrep "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Accepted publickey for watcher0" /var/log/secure | tail -1 | awk '{print $11}'`
OA=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $1}'`
OB=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $2}'`
OC=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $3}'`
OD=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $4}'`
ACCEPTED_IP=`tail -1 $CF | sed -e 's/allow\ \^//' | sed -e 's/\\\\//g' | sed -e 's/\\$//'`
if [ 0 -eq `egrep "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Accepted publickey for watcher0" /var/log/secure | wc -l` ];
then
:
else
if [ $NOW_IP_ADDR = $ACCEPTED_IP ];
then
:
else
# Change config
if [ -f $BAK1 ];
then
rm -f $BAK1
fi
if [ -f $BAK0 ];
then
mv $BAK0 $BAK1
fi
if [ -f $CF ];
then
cp -p $CF $BAK0
fi
sed -i '$s/^allow/#allow/' $CF
echo allow\ \^$OA\\.$OB\\.$OC\\.$OD\$ >> $CF
sudo /etc/init.d/munin-node restart
echo "`date` munin-node restarted" | mail -s "New munin-server is $NOW_IP_ADDR" $ADMIN
fi
fi
毎度毎度へっぽこスクリプトでごめんなさい。。。
