2010/12/22

ブロードバンドルータにしているalixをDebian squeezeにして、ipsetを導入す る

マルウェアに感染していたりボットネットのものといわれているIPアドレス群が公開されていたりします。 そういったノードとの通信を拒否するためには、数千のIPアドレス/ネットワークを制御する必要があります。

普通にiptablesを使ってルールを追加するとルールを設定するタイミングでハングアップしそうになるため、ipsetを導入することにしました。

いままでDebian lenny(5.0.x)を使ってきましたが、ipset-sourceパッケージを利用するために Debian squeeze(6.0.x)に移行しようというのが今回の作業です。

Debian squeezeへのアップグレード

Gatewayとなるalixへはgccなどの開発環境をインストールしていないため、別のalixでまずsqueezeに移行し、ipset用のdebモジュールを開発する事にしました。

開発機から本番機にipset debパッケージを転送する様子

基本的にはetchからlennyに移行した時と方法は同じですが、googleでも他の事例を検索してみました。 だいたいはapt-get dist-upgradeではなく、aptitude full-upgradeを使っているようでした。

もしalixのような最小構成で使っているのでなければ、間違いなくaptitudeがお勧めですが、今回はいつもどおりapt-getを使いました。

書き換えたsources.listは以下のとおりです。

/etc/apt/sources.lstファイル全体

deb http://ftp.jp.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.jp.debian.org/debian squeeze main contrib non-free

deb http://security.debian.org/debian-security squeeze/updates main contrib non-free
deb-src http://security.debian.org/debian-security squeeze/updates main contrib non-free
$ sudo apt-get update
$ sudo apt-get install apt
$ sudo apt-get dist-upgrade

途中で新しい設定ファイルと置き換えるかどうかは、 /etc/init.d/openvpn以外は全て差分(Diff)を確認して、デフォルトの'N'を選択しました。

grub2への移行

今回の方法でsqueezeへ移行するとgrub2が導入され、とりあえず従来のgrub1からgrub2を経由してカーネルが起動する状態になります。

grub2の設定は/boot/grub/grub.cfgファイルで行ないますが、serial行は次のようにword,parityを設定する必要がありました。

serial --speed=38400 --word=8 --parity=no
terminal_input serial
terminal_output serial
set timeout=5

/boot/grub/grub.cfgファイルを直接編集するのではなく、/etc/default/grubを編集し、$ sudo grub-mkconfig を実行します。

/etc/default/grubは次のようになっています。

# This file is sourced by update-grub, and its variables are propagated
# to its children in /etc/grub.d/
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX="console=ttyS0,38400n8"
GRUB_SERIAL_COMMAND="serial --speed=38400 --word=8 --parity=no"

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=serial

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

grub1を経由して無事に起動する事を確認した後は、コマンド、upgrade-from-grub-legacyによって直接grub2のブートローダがMaster Boot Record(MBR)あるいはパーティションの先頭セクタに導入することができ、再起動すればgrub1に代わりgrub2が起動することになります。

grub2には変更なく移行できたものの…

手元の環境では grub1 が /boot/grub/menu.lst から起動する時に、 default 0の設定から /boot/vmlinuz-2.6.26-2-686 が起動していました。

"title Chainload into GRUB 2"と書かれている2番目のtitle行を指すために、 default 1に変更して再起動し、無事に grub2 から起動する事を確認しました。

アップグレードに伴なうディスクの増加

もろもろデータをいれて8GBのCompactFlashのうち、約半分の4GBほどを使用していましたが、導入によって一時的に800MBほど増加しました。

Gatewayにするalixは2GBのCompact Flashを使っていて、こちらも約半分の900MBほどを使っていましたが、導入時には400MBほど増加しました。

$ sudo apt-get dist-upgrade
...
アップグレード: 212 個、新規インストール: 53 個、削除: 4 個、保留: 0 個。
167 MB のアーカイブを取得する必要があります。
この操作後に追加で 230 MB のディスク容量が消費されます。

導入後のdf出力は次のとおりです。

Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda1              1942036   1468316    375848  80% /
tmpfs                   127432         0    127432   0% /lib/init/rw
udev                    123088        60    123028   1% /dev
tmpfs                   127432         4    127428   1% /dev/shm

IPSetモジュールの作成と導入

Squeezeにしたのはipsetのモジュールをm-a(module-assistantコマンド)を使って導入するためでした。

m-aはdebパッケージを作成してくれるため、本番機に開発環境を入れることなく、他の開発機でdebパッケージを作成します。

$ sudo apt-get install ipset-source module-assistant

これで/usr/src/ipset.tar.bz2ファイルが導入されるはずです。 次にコンパイルに必要なファイル群を導入します。

$ sudo m-a prepare

prepareを実行すると、kernel moduleをコンパイルするために必要なパッケージが一式導入されます。 既に開発環境は整っているため、現在使っているsqueezeの標準kernel 2.6.32-5-common に対応するヘッダファイル群だけが導入される事になりました。

以下の特別パッケージがインストールされます:
  linux-headers-2.6.32-5-common linux-kbuild-2.6.32
以下のパッケージが新たにインストールされます:
  linux-headers-2.6.32-5-686 linux-headers-2.6.32-5-common linux-kbuild-2.6.32

次にipsetのmoduleを作成します。

$ sudo m-a build ipset

終ると /usr/src/ipset-modules-2.6.32-5-686_2.5.0-1+2.6.32-29_i386.deb が作成されるので、ブロードバンドルータにしているalixに転送して導入しました。

0 件のコメント: