-->

2009-11-28

iptables の設定のサンプル

これはサンプルです。例えば ping の回数制限などが足りていません。
ぜひ man iptables などの正規のマニュアルをご参照ください。
例えばこの例は-dと-sを間違っています。
# 基本のルール
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# ルールの入れ物
iptables -N MyFwInputMain
iptables -N MyFwInputStateNew
iptables -N MyFwInputSSHPrepare
iptables -N MyFwInputSSHExec

# 基本のINPUTルールにルールを追加
iptables -A INPUT -j MyFwInputMain

# 127.0.0.0/8 許可
iptables -A MyFwInputMain -i lo -j ACCEPT

# pingなどのICMPパケットを許可(iptables -p icmp -h)
iptables -A MyFwInputMain -p icmp --icmp-type any -j ACCEPT

# 接続中と、接続中が無いと接続できない新規の接続を許可
iptables -A MyFwInputMain -m state --state ESTABLISHED,RELATED -j ACCEPT

# 新規接続を別ルールへ移動
iptables -A MyFwInputMain -m state --state NEW -j MyFwInputStateNew

# 新規接続の一部をtcp,port指定で許可
iptables -A MyFwInputStateNew -m tcp -p tcp -m multiport --dports 80,443,873,2401,3690 -j ACCEPT
iptables -A MyFwInputStateNew -m tcp -p tcp --dport 8080:8099 -j ACCEPT

# 新規のssh接続を、別ルールへ移動
iptables -A MyFwInputStateNew -m tcp -p tcp --dport 22 -j MyFwInputSSHPrepare

# 新規のssh接続を、IPアドレス限定で、別ルールへ移動
#iptables -A MyFwInputSSHPrepare -d 10.0.0.0/8 -j MyFwInputSSHExec
#iptables -A MyFwInputSSHPrepare -d 172.16.0.0/12 -j MyFwInputSSHExec
#iptables -A MyFwInputSSHPrepare -d 192.168.0.0/16 -j MyFwInputSSHExec
iptables -A MyFwInputSSHPrepare -s 10.0.0.0/8 -j MyFwInputSSHExec
iptables -A MyFwInputSSHPrepare -s 172.16.0.0/12 -j MyFwInputSSHExec
iptables -A MyFwInputSSHPrepare -s 192.168.0.0/16 -j MyFwInputSSHExec

# 新規のssh接続を、IPアドレス限定で、1分に6回許可
iptables -A MyFwInputSSHExec -m limit --limit 1/minute --limit-burst 6 -j ACCEPT

# 指定したルール以外は拒否の返答をする。
iptables -A MyFwInputMain -j REJECT --reject-with icmp-host-prohibited

genkernel の ロードする kernel モジュールを最低限にする。

gentoo で genkernel を利用している場合で、起動時にロードされる kernel モジュールを減らしたい場合の参考です。実行後 lsmod の内容が減りますが その利点は、使用するメモリが減ることです。

実行すると ssh 接続が切れますので、ネットワークモジュールを消さないか、ローカル上のターミナルで rmmod を実行することを、お勧めします。
$ lsmod |awk '{print "sudo rmmod "$1}' > rmmod.txt

ダイレクトにアンロードする場合
$ lsmod |`awk '{print "sudo rmmod "$1}'`

コマンドを実行すると使っているモジュール以外はアンロードされます。
2回以上実行して lsmod の内容に変化が無くなるまで行います。
この例の場合 r8169(miiは自動で呼ばれる) 以外はアンロードできないので、最低限のモジュールになったと判断しています。
この場合の r8169 はマザーボードや pci などの LAN カードによって名前が変わります。
この場合の LAN カードは Realtek 8111C (マザーボードに付属)です。
$ lsmod
Module                  Size  Used by
r8169                  35212  0
mii                     5944  1 r8169
ipv6                  268672  14
raid1                  21816  4
usbcore               157520  1
ahci                   38152  8
libata                188396  1 ahci

genkernel の /boot/ にある initramfs(この例の場合initramfs-genkernel-x86_64-2.6.30-gentoo-r5)のオプションを減らします。
ext2, ext3 はこの例の場合モジュールではないのですが、使っているので残しました。
$ cat /usr/share/genkernel/arch/x86_64/modules_load
# Module groups for genkernel initramfs auto-loading

# RAID
MODULES_ATARAID=""
MODULES_DMRAID=""
MODULES_EVMS="raid1"
MODULES_LVM=""
MODULES_MDADM="raid1"

# Hardware (IDE/SCSI/SATA)
MODULES_PATA="libata"
MODULES_SATA="ahci libata"
MODULES_SCSI=""
MODULES_WAITSCAN=""

# Hardware (Network)
MODULES_NET="r8169 mii ipv6"

# Hardware (Pluggable)
MODULES_FIREWIRE=""
MODULES_PCMCIA=""
MODULES_USB="usbcore"

# Filesystems
MODULES_FS="ext2 ext3"

再作成します。
$ sudo genkernel initramfs

再起動して、無事起動に成功した場合は lsmod の結果が期待した内容より少し多い状態になっています。
この例の場合、設定したものより多い理由は
lm-sensors の場合は it87, i2c-core など
ソフトウェアごとに必要なモジュールが、そのソフトウェアの起動時に呼ばれているためです。
$ grep ^MOD /etc/conf.d/lm_sensors
MODULE_0=it87

$ grep MODULE_ /etc/init.d/lm_sensors
                if [ -z "${MODULE_0}" ]; then
                        eerror "MODULE_0 is not set in /etc/conf.d/lm_sensors, try running sensors-detect"
                        module=`eval echo '$'MODULE_${i}`
                        module_args=`eval echo '$'MODULE_${i}_ARGS`
                # find the highest possible MODULE_ number
                        module=`eval echo '$'MODULE_${i}`
                        module=`eval echo '$'MODULE_${i}`

また floopy などは /sys/bus/pci/devices/ からハードウェアを検索して、モジュールを自動で追加するので問題ないです。
例えば floppy を使わない場合は bios で停止してください。
$ lsmod
Module                  Size  Used by
it87                   25056  0
hwmon_vid               2952  1 it87
hwmon                   3096  1 it87
i2c_core               27744  0
ohci1394               30340  0
ieee1394               95520  1 ohci1394
ehci_hcd               35716  0
processor              39720  0
ohci_hcd               23444  0
floppy                 58968  0
rtc                     8464  0
thermal                17368  0
sg                     31536  0
thermal_sys            16208  2 processor,thermal
button                  6920  0
ipv6                  273696  20
nf_conntrack           75760  0
r8169                  35324  0
mii                     5944  1 r8169
raid1                  21816  4
usbcore               157568  3 ehci_hcd,ohci_hcd
ahci                   38232  8
libata                188412  1 ahci

また実行するに当たって grub などのブートローダーで、古いカーネルが呼べる状態であるか
1CD Linux などでレスキュー可能であるなどの、回復が可能な環境でなければ、実行しないことを、お勧めします。

2009-11-26

ルーターのログをリモートで受信した結果を絞り込むコマンドのサンプル

superOPTAir の USER.* のログを別サーバーへ送るように設定し、確認をしました。

# src ip
sudo tail -n100 /var/log/user.log |grep 192.168.0.1|grep "Discard packet."|awk '{print $9}'|grep TCP|awk -F'(' '{print $2}'|awk -F':' '{print $1}'|sort|uniq -c|sort -n

# dest port 
sudo tail -n100 /var/log/user.log |grep 192.168.0.1|grep "Discard packet."|grep TCP|awk '{print $11}'|awk -F':' '{print $2}'|awk -F')' '{print $1}'|sort|uniq -c|sort -n

2009-11-25

windowsとlinuxのrsync

windows 側で colinux をインストールし cofs で c:\ を mount して
linux 側から rsync をしたところ、成功しました。

--link-dest オプションを使う目的で設定しましたが
この方法では日本語ディレクトリで問題が発生します。

cwrsync を使って解決しました。

2009-11-22

phpでswf,flvの動作に関する調査

http://www.ioncannon.net/ruby/108/flash-video-steam-ming-php-ruby/
上記のページのphpソースを動作させてみました。
日本語を表示させるのはOKでした。
ttftofft コマンドが動かないので ttf2fft のコマンドを minghsp 付属のもので利用しました。
flvを固定パスで指定して再生ボタンを押して動きました。
ming 3.0 で動作します。4以上だと 4.0.2 の場合 php では動作せず 4.2 では動作します。
また swf をxmlファイルに変換する swfmill を試したところ、動きました。
ソースで入れる際に修正しました。
swfmill-0.2.12/src/swft/swft_css.cpp
> #include  <string.h>
swfmill-0.2.12/src/swft/swft_import_mp3.cpp
> #include  <string.h>
swf=>xml=>swf といった具合に再変換したところ、違うファイルになることを確認しました。
swf=>xml=>swf=>xml といった具合に再変換したところ、2のxmlファイルは同じであったことを確認しました。

nginxの接続数

nginxで接続数を1024以上にすると、警告が出ます。
[warn]: 8192 worker_connections are more than open file resource limit: 1024
/etc/security/limits.conf
を変更しましたが limits.conf を変更するのは間違いです。
# 変化無し。(nginxユーザー)
> nginx soft nofile 65536
> nginx hard nofile 65536
# 警告がでない。(全ユーザー)
> * soft nofile 65536
> * hard nofile 65536
# 警告がでない。(root(管理者))
> root soft nofile 65536
> root hard nofile 65536
limits.conf ではなく nginx.conf を修正します。
worker_rlimit_nofile 8192;
http://forum.nginx.org/read.php?2,6300,6307
http://wiki.nginx.org/NginxMainModuleJa#worker_rlimit_nofile

ファイルの一覧をパイプ付きのコマンドに渡す

$ find * -type d | while read -r d;do echo $d include `ls "$d" | wc -l` files; done
http://ameblo.jp/pclindesk/entry-10131168430.html

この記事が参照サイトの情報のみなので、追記します。

(例1) dev-php5 のパッケージのファイルを /tmp/ にコピーするコマンドを出力する。
find /usr/portage/dev-php5/*/Manifest -exec grep ^DIST {} \; | awk '{print $2}' |sort|uniq|while read -r f;do test -e /usr/portage/distfiles/$f; if [ $? -eq 0 ];then echo cp -f /usr/portage/distfiles/$f /tmp/;fi; done

Manifest というファイルの DIST で始まる行にファイルに関する情報が有り、その行を複数ファイルにまたがって取得します。
find /usr/portage/dev-php5/*/Manifest -exec grep ^DIST {} \;

行ごとにスペースで分けて2カラム目を取得します。取得している値はファイル名です。
| awk '{print $2}'

この部分で重複するファイル名を1つにします。
|sort|uniq

ファイルをコピーするコマンドを出力します。
|while read -r f;do test -e /usr/portage/distfiles/$f; if [ $? -eq 0 ];then echo cp -f /usr/portage/distfiles/$f /tmp/;fi; done

インデントしてコメントを追加しました。
|                                       # パイプです。
while read -r f; do                     # ここから done までで1行ごとにパイプから来た値を読みます。
    test -e /usr/portage/distfiles/$f;  # file が存在すれば真 を返します。
    if [ $? -eq 0 ]; then               # $? が test の戻り値で 0 だと正常です。
        echo cp -f \                    # ここは command > output.txt などとしてコマンドの
            /usr/portage/distfiles/$f \ #   確認をするために echo としています。
            /tmp/;                      # バックスラッシュ(半角の¥)はコマンドの長い時の折り返しの
    fi;                                 #   意味に、この場合はなります。
done                                    # 読み込む行があれば while の最初から処理を続行します。

この例だと説明になっていませんが
while ... done の間にパイプ(|)を含むコマンドの記述が可能です。
また、あらかじめ emerge --fetchonly などでダウンロードしていないとcpコマンドがエラーになります。

また find の -exec は2つ以上かけるので場合によっては、それで十分です。
$ find /tmp/ -exec test -f {} \; -exec md5sum {} \; # これは意味の無い使い方です。 
$ find /tmp/ -type f -exec md5sum {} \;             # これは上記のコマンドと同じです。

2009-11-21

phpのxdiff

2010-04-02 現在 dev-php5/pecl-xdiff のパッケージがありますので、そちらをお勧めします。
$ sudo ACCEPT_KEYWORDS="~amd64" emerge -av dev-php5/pecl-xdiff
$ eix dev-php5/pecl-xdiff
[D] dev-php5/pecl-xdiff
     Available versions:  ~1.4.1
     Installed versions:  1.4.1(00時20分03秒 2010年04月01日)
     Homepage:            http://pecl.php.net/xdiff
     Description:         PHP extension for generating diff files

phpのxdiffが使いたいため
sudo pecl install xdiff-1.5.1
を行ったところ失敗したため
/etc/portage/package.mask

>=sys-devel/libtool-2
を、追記してシステムを更新したところ
バージョンが1.5.26になりました。
また、更新時に依存パッケージが一部再インストールされました。
再度peclを実行したところインストールできたのですが
libtoolのバージョンを下げることはお勧めしません。

手動でファイルを追加しています。
$ find /etc/php/ -name xdiff.ini
/etc/php/cli-php5/ext/xdiff.ini
/etc/php/cli-php5/ext-active/xdiff.ini
/etc/php/apache2-php5/ext/xdiff.ini
/etc/php/apache2-php5/ext-active/xdiff.ini
$ cat /etc/php/apache2-php5/ext/xdiff.ini
extension=xdiff.so

colinuxのgentooとudev-146

colinuxをgentooで使っているときに
更新すると再起動で起動できなくなりました。
/etc/portage/package.mask

>=sys-fs/udev-146-r1
を入れてemergeをやり直すと直ります。
sys-fs/udev-141になります。

起動できなくなった場合の救出は
元のイメージ以外で起動するように設定し、別のcolinuxイメージで起動し
mountしてchrootで入ります。
後は通常のpackage.maskの修正やemergeは同じ作業です。
chrootのコマンドの例です。
http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml?part=1&chap=6#doc_chap1

また、udev更新時に2.6.25云々とメッセージが出ていますが、それを見逃したことが原因です。

test

test

Cookieをセット
top