Home > 自宅サーバー

自宅サーバー Archive

CentOS5インストール時にソフトウェアRAID1構築

絵描きすぎでこっちがお留守に。

先日Atom 330マザーで1台組んだことは書きましたが、気軽に自宅サーバにエントリーしやすい、ACアダプタなど静音なベアボーンとかキューブはHDD2台積めない(電源も少ないし)。ってコトで、PCIスロット1基搭載で、拡張カード次第で多少何とかなるD945GCLF2を使って構築。(よーするにShuttle X27の不満点を何とかしたかったワケだ、特にCPUと耐障害性)

当初の予定ではRAIDカード差して、とやるつもりだったんですが(SATAポートが2つなので、光学ドライブ積むとポートが足りなくなるから)、前からソフトウェアRAIDを試したかったし、安いRAIDカード使うのって信頼性的に結局どうなの?というコトで、とりあえず不満が出たらRAIDカードを買うことにして、ソフトウェアRAID採用。mdadmでRAIDを組みます。

ここでSATA光学ドライブを使うとポートが足りないのですが、IDEもちゃんとあるので、あえて光学ドライブをIDE、HDDをSATAに接続。

今回は組むところからだったので、インストール時のAnacondaでのRAID1構築になります。

SSがないのでアレですが、OSインストール先ドライブ選択画面で、「パーティション割り当て詳細を表示(細かい文句は忘れた)」にチェックしておくと、自動で割り当てられたパーティションの状態が表示されます。が、ここではRAID用に構築しなおすので、リセットを押して一旦クリア。手動でパーティションを作っていきます。

基本的には

  • 必要なパーティションを片方のディスクに作る
  • 同じ容量や構成でもう一方にも作る
  • 「RAID」ボタンでミラーするパーティションの対応づけを行う

という感じになります。とりあえず、今回は必要最小限のものだけ作るので、/boot と swap と / 領域だけ作成することにします。bootは100MB、swapは物理メモリの倍とる、残りをすべて/という基本構成で。ディスクはSATAなので、sda、sdbとします。

  1. まず「新規」でパーティションを作成します。各パーティションの役割はRAIDボリュームが出来てから決めていくので、マウントポイントは空欄のまま、ファイルシステムタイプでsoftware RAIDを選択します。
    使用可能なドライブではsdaだけにチェックを入れます。
    最初の領域を/bootにするので、ここでは容量を100MB、容量オプションで固定容量を選択。「プライマリパーティションにする」チェックを忘れないでください。OKで元の画面に戻ると領域が作成されています。
  2. 同様に新規→software RAID→sdaのみを選択→搭載メモリの倍の容量(1GBなら2048と入力)を入力、固定容量を選択。
    ここはswap領域なので、「プライマリパーティションにする」のチェックは外しておいてください。
  3. 同様に新規→software RAID→sdaのみを選択→容量を飛ばし、容量オプションで「最大許容量まで使用」を選択→「プライマリパーティションにする」は外す。これで、残りの領域がすべて/に割り当てられ、sda側の設定が終了します。
  4. 1~3と同じことを、「使用可能なドライブ」のチェックをsdaでなくsdbに読み替えて行います(つまりsdbにもsdaとまったく同じパーティション構成をつくる)。
  5. 最後にRAIDボタンをクリックし、「RAIDデバイスを作成」を選択。ここで、パーティション同士のミラーボリュームを組んでいきます。
    ここでマウントポイントに/boot、ファイルシステムはお好きなの…普通はext3を選択。RAIDデバイスでmd0を選択、RAIDレベル1を選択。
    sda1とsdb1が、それぞれboot用に確保された容量100MBの領域になっているハズですので、この二つにチェックを入れます。スペア数は0のままで。OKを押すとRAIDボリュームが作成されます。
  6. これを、swap、/でも行っていきます。
    マウントポイントやファイルシステムは作成する環境によって変わってきますが、5でやったのと同様に設定し、パーティションが1つ増えるごとにRAIDデバイスをmd1、md2と増やしていきます(これがOSが認識する実際のデバイス名になります)。もっと細かくパーティションを区切っている場合でも、基本的に作業は同じことを繰り返していく形になります。

後は通常のインストールと変わりません。インストールが終了したら再起動します。

この後、OS起動後、ミラーボリュームがビルドされるまで、暫くmdadmのシンク作業が続きます(topなどで見ると激しく動いています)。どのくらい時間が掛かるかはマシンパワーや容量によりますが、ミラーボリュームの構築が終わるまではしばらく負荷の掛かった状態が続きます。
ちなみにAtom330、メモリ1GBでやった自分の場合では、Load Averageが1.5程度の状態が続いていた感じです(ずっと見ていたワケではないですが)。構築が終了すると、Load Averageは通常に戻ります。インストール後、すぐヘビーに使い倒せるワケではないのでご注意を。

CPUとSATAの性質上、アクセスや負荷が高めの場合は結構IO時にCPUパワーを食うので、余裕を持って運用したい方には、省電力CPU+ソフトウェアRAID(しかもSATA)は正直オススメできませんのでご注意を。自分の場合はそんなに負荷がかかる用途もなかったので…。Atom 220とかだと若干キツイかも?しれないですね。

ちなみに思いついただけでやってはいませんが、eSATAカードを挿すなりなんなりして、スマートなAtomベアボーンの外にハードディスクケースに入れたHDD(電源容量によってはACアダプタがほしいところ)をつないでおいてソフトウェアRAIDを組んでしまう、というのも手軽かな、と。静かな上に手軽だし。

あーあと、パーツ探し中に、ACアダプタ180W出力、2系統接続して360Wまで対応できる製品がありました。静音にACアダプタ電源はかなりオススメ(Shuttle X27で経験済み)なのですが、電源容量に不満がある人でもこれだけ容量があれば、ACアダプタという選択肢が広がるのはイイですね。

外部アクセス可能なSVNをsubversionで

会社にゃもうリポジトリあるからね、なかなか新規に立てんのは体験できないよね、自分でやらないと。まあ移行実験でtrac入れたことはあるんだけれども、ローカル用だからSSLとかナシだったし。

とりあえず認証、暗号化、EclipseのSVNプラグインからコミット・更新確認。良きかな。

参考にしたのはSORENARI-WIKIさんですね。今回は外部のサーバにやったので、opensslとかApacheのSVN用コンパイルオプションとか、subversionの設定とかまで一通り説明があったのでやりやすかったです。外部にSVNが必要な方にはオススメかと。

あと、今回使ったサーバー、CentOSだけど最小構成でyumが無かったんですが、依存関係でパッケージ入れるのには便利だけど、ぶっちゃけ用途的にはほとんど要らなかったです。yum入れるのも割と面倒臭いので、必要なパッケージはCentOSのページ行ってパッケージ落としてきたらいいと思う。(どうしてもyumがないと…という方はnotizblock+さんが素敵)

rpmとかyumとか便利なんだけど、結局基本的な用途以外ではソースコンパイルが必要になってくるし、あまり依存しすぎるのもアレですね。

MySQL5.0.xのレプリケーション

とりあえず通常のMySQL動作環境の構築まで終了してると仮定しまして。

◆レプリケーション用ユーザー追加
普通のユーザーでやってしまうと、コケたときにレプリケーションが原因なのか、そうでないのか切り分けにくくなります。また、レプリケーションのみのユーザー権限もあります。このあたりは適宜用途に応じて作成してください。

◆DBを停止
MySQLでスナップショットをとるには商用ソリューションが必要になるし割と複雑なようです。今回は停止するほうで。現在まで稼動していたマスタを停止、スレーブのほうも止めておきます。
これは、次のコピー作業が「双方の内容を同一にする」ために行うものなのですが、コピー中に変更があると内容に食い違いが生じるためです。

◆DBの内容をコピー
rsyncなどで、マスタDBのMySQLデータベースをまるごとコピーします(標準なら/var/lib/mysql以下ですな)。DBまるごとレプリケーションする場合は、一旦スレーブ側をカラにしてから

# rsync -a /path/to/dbm /path/to/dbs

でOK。

◆レプリケーション設定
各サーバのmy.confにレプリケーション設定を追加します。マスタ側で必要なのは

log-bin
server-id=100

の2行。上がバイナリログを吐く設定、下がサーバーidです。idはDBサーバー毎にユニークでないといけないので、スレーブ側ではここと被らないように注意。

スレーブ側で必要なのは

server-id=101
slave-skip-errors=1062
skip-slave-start

あたりですかね。
idは前述のとおり、レプリケーションしている他のサーバーと違う番号を振ります。
2行目は「指定した番号のエラーが発生してもスキップしてレプリケーションを続ける」という指定です。通常、エラーが発生するとレプリケーションは停止します。しかし、エラーの内容によっては、システムによっては問題のないものであったり、MySQLのバグであったりします(エラーナンバーのうち幾つかは将来回避される予定だそうですし)。
この場合は公式をそのまま引用すると、

Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)
Message: ‘%s’ は key %d において重複しています

環境によって異なるので、どれをスキップするかはご自分の環境で検証してください。allも指定可能です。

3行目は、再起動時にレプリケーションを自動的に開始するな、という指定で、これは公式に推奨されているオプションです。DBにエラーが発生・再起動時は、正常にレプリケーションが行われていない可能性があるので、データの食い違いや破損による二次障害が発生しかねないためです。停止した場合はログなどから原因を突き止めた上で問題がなければ手動で再開しましょう…。

◆起動、の前に…
レプリケーション開始設定のためにMySQLサーバの起動が必要なのですが、プログラムやcronなど、DBを更新する可能性のあるものはすべて停止してください。起動後に更新が発生すると、内容が食い違ってしまって再度コピーからやり直しになってしまいます。

確認ができたら、まずマスタのMySQLサーバを再起動し、mysqlコマンドで接続します。ここで

> show master status;

と入力すると、テーブルが表示されて、File、Positionなどが表示されますが、この2つをメモしておいてください。Fileは同期するバイナリログ、Positionはそのログのどこから同期するかの位置を指定するものですので、これが間違っていると失敗する重要なところです。ちなみに更新されるとPositionは変化していくので、上のコマンドを何度か叩いて変化があるようなら、DBを更新するようなプログラムなどが動いてしまっているということになります。その場合はファイルコピーからやり直しになります。

さて、特に問題なければスレーブ側で最後の設定を行います。ここでは上で調べた同期開始位置をスレーブ側にも教えてあげて、レプリケーションを実行します。

> CHANGE MASTER TO MASTER_HOST=’マスタのIPアドレス’, MASTER_USER =’レプリケーション用ユーザ名’, MASTER_PASSWORD=’パスワード’,MASTER_LOG_FILE=’上で調べたファイル名’, MASTER_LOG_POS=上で調べた位置;

この後、

> slave start;

で同期が開始されます。

◆レプリケーションの確認
特にエラーなどが起きなければ、そのままスレーブで

> show slave status\G

と入力し、レプリケーション状況を確認します。エラーなどがなければ同期ができているはずですので、データベースやテーブル、レコードをマスタ側で追加してスレーブ側で確認するなどしてみましょう。また、データが更新されていけば、上記コマンドで確認できる、バイナリログの位置が徐々に変わっていくのが確認できるはずです。

設定だけなら、結構簡単ですね。運用するとなるとまた別ですが…。
とりあえずMRTGやcactiやNagiosなどでリソース監視はしておきましょう。

組み込み用BeagleBoardが魅力的で今後が楽しみ

Beagle Boardに注目中。

Beagle Board

いわゆる組み込み製品用のボードですが、そこそこのスペックがある上に、画像処理に使われる浮動小数点演算能力が非常に高く、IOインターフェースも多いので(変換ケーブルなどはいるけど)、この大きさなのにフルスペックのPCとして使えます(よく知りませんが、組み込みでこのサイズ・性能で149ドルも破格らしい)。

HDDはありませんが、SDカードを差すことができるのと、Beagle Boardで稼働するLinuxも出ているし(ARMなのでWindowsは無理っぽい)、当然完全ファンレスなので、サーバー用にはどうなのかな…、と、ブログの性質上自然と考えてしまいますよね。キャパシティはなさそうですけど、アクセス少ないとか実験用途とかであれば…。プロセッサはハイエンドモバイル機器に載ってるクラスだそうです。HTML吐くだけならそこそこいけるかな?

尚、今注文するとRev.B7か8くらいのボードになるそうですが、2009年1Qの終わり頃に、USB OTGの致命的なバグ、プロセッサのバグのフィックスと、幾つかのスペックアップが行われた、Rev.Cが出るようなので、フルに使い込みたいならしばらく待つほうがいいかも知れません。

ちなみに検索してた感じでは、クリアケースを扱ってるところもあったなぁ(クリアケースに各種変換ケーブルなども取り付けたモデルもあった。「BeagleBoard ケース」あたりで検索してもらえば多分でるかと。

ちなみに日経Linux3月号でBeagleBoardを使ったマシンをくむという特集をやってますので、興味ある方は是非。僕は買いました、これを知った日の昼休みに。

Seagate製HDDのファームウェア不具合と対応

どうなってんだ。

シーゲイトと言ったら、Maxtorとバリバリ競争してた頃から使ってますよ。つい先日Barracuda ES.2買ったから調べたら、見事に(モデル的には)該当してるワケでしてね…。

まあ個人的なコトはアタリが悪すぎた(それにしても、だが)としても、今回のシーゲイトの対応は如何なもんかと思います。

  • 各国語版サイトがあるのに表示してるのは英語だけ。しかも日本語サイトにはニュースすらない
  • 少なくない機種で、ファームウェアが必要な場合はメールしろ、とある
  • 対象製品チェックページが削除されたり、公開中止になったり、まだ未提供だったりドタバタ
  • Seagateが公開しているファームチェックツールがお粗末(ソフトウェアRAIDシステムでさえ正常認識しないが…ES.2の売りのひとつはRAIDボリュームの同時ファーム更新じゃなかったっけ?)

こちらのWikiによると、同ポートナンバーとやらのモデルで「特に目立った不具合はない」と言われているものの、それで安心出来るわけないわな。というか、こんなに公開停止やらメールしろやら、多言語で情報が公開できていないような状態で、送られてきたファームが果たして大丈夫なのか、また公開停止になったりしないのかと不安になるのは当然。ほとぼりがさめるまで、SeagateのHDDは避けたほうが無難だな。

今回痛いのは、モデルが幅広いとかシェアの大きさが仇になったというのもあるが、そもそもニアラインストレージモデルのES.2とか、信頼性が求められるような製品まで該当しているところ。すでに「ウチ今回のモデルのHDD使ってるから、データ念のためバックアップしといて!」つってるASPもありますし。まあ親切とも言えますが、こんな不具合で起きた障害まで自分のせいにされてはたまらないというのもあるでしょうが…。

追記:以下は株式会社データ復旧センターのご厚意で、Seagateは無関係でした。訂正してお詫びします。

で、Seagateの対応がまたアレですよ。
CNET Japan:【Seagate不具合HDD利用ユーザーに向けて、オンラインストレージを無料開放】

って、そもそも今からそんな聞いたことないサービス使うか、と思ったら…5GB?を、1ヶ月間無料?…ええと。どこのユーザーでも無料で使えるオンラインストレージで数GB単位の時代ですよ。不具合製品に当たったユーザーに限定されてるのに、5GBってさぁ…iPodの音楽だけでも一部しか入らないんだが。
これだけしか提供できないならやらない方が良かったんじゃないか、と思ってしまう。ネットワークで転送してまた戻す手間とか色々考えたら、適当にUSBメモリでも買ってくるユーザーのほうが多いと思うけど。

不具合のニュースだけ聞いたときは、「あーやっちゃったか…」と思った。ミスが許されない分野と言われるものは多いけど、それでも確実にミスの可能性はある。でも、その後の対応が最悪だ。個人的にもニュースを聞いた時点では次は大丈夫だろうと思っていたけど、色んなところを見たら買う気が失せた。次からは日立HGSTあたりにするか…。

不具合対応が誠実・迅速だったために、却ってブランドイメージが上がった、なんて話はよく聞くんだけど、いざとなったらこんな大手でも出来ないもんなのかねぇ、と。俺ですか?いつもガクブルだけどやるしかしょうがないって感じでやってます。ちゃんと肝には銘じるけどね~。

PCをキャッシュ4倍のHDDに換装して比較ベンチとってみた

前回エントリーでIP蹴ったらspamが激減。と思ったら今度は2日間くらい22番ポートにブルートフォース喰らってたみたいです。まあ、数重にはじいてるのでrefusedが9000行ほど続いてましたがw

さて。自宅PCのIOが遅いのと、もうちょい容量増やしたいなぁということで、Barracuda 7200.10の250GB キャッシュ8MB(RAID1)→Barracuda ES.2の500GB キャッシュ32MB(RAID1)に変更(あとついでに電源ユニットも容量&安定性高いのに換装)。

個人でES.2のRAID1ってのも、中古軽車両に無意味なエアロ並みにアレですが、まあそこは趣味ということで。

で、ベンチ結果ですが…

HDDBench

横軸が転送量。うをー高速化してるーっていうか

あれ?ひょっとして前のSATA1.5?と思ったけど、今回買ったモデルの転送速度が秒間128.7MB、前モデルが78MB。一応SATA3.0で合ってるっぽいので、単純に記録密度やキャッシュ、その他色々性能が向上した結果か…。

しかし、まともにHDDのみのベンチとったことはなかったんですが、やっぱシークタイムがでかいHDDはちっさいファイルのランダムアクセスでシークタイムの影響モロに出るってコトだろうか。
SSDで128GBとか250GBとか出てきてるし、Intelが250MB/sのも出したりしているので、より大容量化・高速化するのを期待したいですねぇ。耐久性とか、エラー発生率とか、HDDと比較してどうなんだろう、という情報がまだまだ少ないですが…(理論的に耐久性は割と高いようですが)。

AtomよりCore i7を買ってくれ的なIntelさん。

ITmedia:Intel in Akiba 2008 Winterの記事

アキバも九十九電気とかいろいろありましたが、とりあえずまだまだIntelがCore i7とか出してくれて、まあ年末的にはヤレヤレな感じなんだろうか。とりあえず年末商戦の目玉のひとつですしね(あと対応マザーとDDR3)。最近はSSD大容量高速化とか、ULCPCとか色々あるし、広告とか見ててもCore i7機が出揃ってきてるので、割と目玉はあるのかな。ああ、そういえば1TB HDDが1万割れしたニュースもあったなぁ…。

今のメイン機がCore 2 Duo E8400(Penryn)だし、そもそもQuadすら必要としていないので、まだ初期投資のデカいCore i7系に行くつもりはしばらくないですが、Windows 7が出る頃には安定動作確認とれたMBに変えたいなー(なんかこのMBにVista+Intel RAID1すると妙にIO面が不安定)。

で、最初の記事に戻ると、Atom機ばかり売れてるけどCore i7買って~<インテルさん、だそうです。そりゃーAtomで持ち運びノートでは十分だし、Core系持ってたらCore i7でないといかん用途って限られるしね。ソケットが変わる時点で移行にはしばらくかかるのは仕方ないのだが…なんで今回はハイエンド・メインストリーム・バリューでハイエンドだけソケット変えるかね?
いや、仕様上ピン数が足りないのは分かるんだが、互換性とかあるやん。前みたいに「とりあえずCeleronのせといて、金たまったらPentiumに…」的なことが出来なくなってしまった。いやぁ。DDR2でもデュアルチャネルなら十分早いし、Core i7はあんまり売れないのかねぇ…(きっとメインストリームのLGA775で充分であろう…ほとんどの人は)。

一方のAtomは選択肢最初から少ないけど限られてるし、MB一体化だから。インテルさん、i7買ってって言ってるけど、みんなAtom買ってるんじゃなくて、たぶんそれULCPC買ったらAtom載ってただけだと思うよ?このサーバーも、静音で安いの探したらAtomだっただけだし。安いからMBの耐久性が若干不安ではありますが…。

来年以降金を掛けていくとしたら、最初はストレージ周りかなぁ。バックアップ用の外付けHDDがUSBで遅いので、早くeSATAにしたいのですが、イマイチ普及してる気がしないので微妙に悩ましいところです(USB3はまだ先だしなぁ)。あとはSSDが250GB越え・250MB/S越えしたので、値下がりしたらそっちも検討したいかも。

SSDにしたら、RAID1要らなくなるのかね?バックアップとってれば…

HTML5に期待 – Cliant-side DBとサーバー負荷軽減

HTML5とかに期待。下はCanvasのデモ


JS、CSS3、APIなどが追加され、簡単な記述で描画できるようになったようなので、プラグインなどがなくても、ブラウザ標準で結構リッチな表示が可能になってるようです。HTML構文も、HTML4対応ブラウザに影響を与えないことを重視して草案が作られているようなので、「また移行かよ~」とWebデザイナーさんがムキーとなる機会は(これまでほど)ひどくないかも知れません。新しいことをするには結構覚えることがあるかも知れませんが…。

…と、個人的にはこっちよりCliant-side DBのほうが気になっているところです。これまで、クライアントサイドに情報を保持させるにはCookieやプラグイン等に依存するなどといった方法しかありませんでしたが、標準化されているCookieは少量のデータしか扱えない→基本的にはサーバーサイドで処理することになっていたわけですが、クライアントサイドにSQLデータベースが実装されることで、かなり色んな可能性が広がるんじゃないかなーと思います。

オンラインゲームとかメッセンジャーでも、すべてを大本のサーバーで処理するのは負荷が大きすぎるので、クライアントサイドで親子関係をつくって、簡単な処理はクライアントサイドや親とのみやりとり、親が計算結果をサーバーに返すという構造をとっている場合もあるとか(Skypeも一部そんな仕組みがあったハズ)。

それと同様、少し大きな処理をするときはクライアントサイドDBに情報を格納しておき、JSなどで計算や制御を行い、最終結果だけサーバーに返すことで、毎回サーバーに接続するコストがかなり小さくできます。現在でもFlashで実装したり、専用アプリケーションをDLさせたりといったものはありましたが、それがブラウザ標準で出来るようになるなぁ、ということです。
GoogleがOfficeアプリをWeb上で提供していますが、現在ネックとなっている通信待ちが大幅に短縮できるとなると、Web上でのアプリケーション提供がもっと一般的になるんじゃないか?という話もあります。MSも、OfficeのWebバージョンを開発していますし、今後どんな変化があるかは楽しみなところです。
もちろんOfficeアプリケーションだけでなく、たとえばCGMサービスではコストの都合上難しかったことが、サーバーがデータの送受信に処理能力を集中させられることで、かなりリッチなコンテンツの配信を可能にするかも知れません。

画像や音楽など、データ量的やセキュリティ的にもデスクトップアプリケーションが駆逐されるほどの変化はないでしょうが、Webアプリとデスクトップアプリ開発の垣根が徐々に薄れていくことで、両方の長所やノウハウ蓄積によって、これまでなかった新しいモノが登場する可能性が楽しみです。

iptablesを覚えたいなぁ…とりあえず基本スクリプト。

最近、すでに自宅サーバーブログじゃなくてふつーのブログになってるな。まあ、個人ブログだからどっちゃでもえーんですが。ああ、そういえばMacOS XはFree BSDベースですが、iPhoneもJailbrakeすればSSH接続できるらしいですよ(保証対象外)(でも自分はやらない)(だってベンダーデフォルト派なんだもん)(っていうか本題逸れてるよ)。ちなみに、Windows Mobile5で、CE用のHTTPD使ってハンドヘルドWebサーバーならやったことがあります(意味ねー)。

とりあえず、ずっとiptablesを勉強したいと思っておるのですが、Web検索した範囲ではなかなか基礎から説明されているサイトはみつからないのですが、とりあえずシェルスクリプトのサンプルをおいとくから各自の環境に合わせて設定してくれ、というところはいくつかありました。実際に自分が設定する際も、イチイチ毎回手動設定をするワケにはいかないので、基本的にはスクリプトとしてまとめておくことになると思います。

ITサイトの連載でもあったのですが、より優秀なスクリプトを紹介されている、有名なこちらで:CentOSで自宅サーバー構築。こちらを必要に応じて改造したものを使います。

#!/bin/bash

#---------------------------------------#
# 設定開始                              #
#---------------------------------------#

# インタフェース名定義
LAN=eth0

#---------------------------------------#
# 設定終了                              #
#---------------------------------------#

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`

# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP   # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
iptables -A INPUT -s $LOCALNET -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)               #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 外部からのTCP21番ポート(FTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※PASV用ポート60000:60030は当サイトの設定例
iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)               #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

# サーバー再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables start

長くなるので、汎用的な部分のみに削ってます。メールサーバーとかDNSサーバーとか、サーバーの用途に応じた設定は、他の行を参考にポートなどを適宜変えて行を追加していけば問題ないと思います。
また、参考にさせていただいた元ページでは、国外からの接続制限などをされていますが、汎用性を優先してそういった設定は外しています。

とりあえずifconfigで表示されるNICを最初のインタフェース名定義のところに書きます。ローカルホストは自動的に拾って許可してくれるようになっているので、あとはサーバーの用途に応じて、各種サービスを公開する場合の設定を追加・削除していけば良いと思います。あと、外部からの攻撃対策が幾つかありますが、必要に応じて調整はしてください(ただのWebサーバー、とかならそのままでも特に問題ありませんが…)。

あとは、この例ではSSH、FTPのポートはとりあえず通過できるようにしただけなので、当然TCP Wrapperやxinetd.d/で接続ホスト制限などを行ってください(そのままだとSSHにバカみたいにアタックに晒されるので)。公開鍵認証方式にもすると素敵。あとは25番など、メール関係の設定は踏み台にされる恐れがあるので慎重に行ってください(こちらもかなり来ます)。

Apacheを止めずに更新を反映 – apachectl graceful

あーっと。ネタがびみょんなので、良く使うコマンドでも紹介します。

考えてみれば「止められないシステム」では当然のように使ってますが、自宅サーバーでは必要に迫られにくいので、割と知らない人もあるかも。色々設定を変えたりして、Apacheを何度も再起動する場合などにオススメです。

# apachectl graceful

serviceコマンドや /etc/init.d/rc.d/httpd restart だと急激(強制的)にリスタートが掛かりますが、このコマンドの場合、現在リクエストを受け取って(実行して)いるプロセスは、リクエストの実行が終了してからプロセスを終了するため、現在接続しているユーザーに影響が出にくいのです。

ホーム > 自宅サーバー

Search
Link
Feeds
Meta

Return to page top