iptablesでログ出力設定


VPS契約にあたり、色々下調べしてから契約したのでさくらVPSを契約してスグにiptablesの設定を

行いました。

基本的にアカベコマイリさんのページを参考に設定しているため、ログ出力については

行ってませんでした。

参考ページ

http://akabeko.me/blog/2012/04/revps-03-iptables-logwatch/

ある日の夜ふけ

最初は、非公開状態での運用だったので上記設定で大きな問題起きてないし大丈夫かな~と適当に運用。

その後、ブログ公開のためドメイン取得して外向けに公開したので、ちょっと身構えてたのですが

そもそも、こんな場末のブログが伸びるわけも無く、特に攻撃らしい攻撃も無かったので

ノホホンとしてました。

 

で、なんとなしにアクセスログ見てたら、大変なことになってました。

アクセスログ

;`;:゙;`(;゚;ж;゚; )ブッ

 

わぁ・・・履歴見たら300回ぐらいやってる。総当りぱねぇっす。

で、即、サーバ側の設定見直しをしました。改めて見たら一個設定抜けてたよ。あぶねぇあぶねぇ。

サーバ側の設定見直すついでに、iptablesに該当IPを追加してシャットアウト。

ここでふと気づいたわけです。

「ログ出してなくね?」と。

iptablesでログを出すようにする

ってことで、現状どんな感じなのか知りたいのもあって、ログ出力の設定をしたので覚書。

参考ページ

http://black.mydns.jp/wiki/Lenny/index.php?iptables%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%92%E5%8F%96%E3%82%8B

http://5log.jp/blog/sakuravps2/

基本的な設定は、アカベコマイリさんのページの通りです。

なので、設定が /etc/sysconfig/iptables に設定されていることが前提となりますのでご了承ください。

シェルスクリプトなどで設定されてる方は適宜、読み変えてください。

とりあえず、設定ファイルを開きます。

sudo vi /etc/sysconfig/iptables

設定弄ってなければ恐らく、次のような感じかと思います。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport XXXXX -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

で、ここに数行付け加えます。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport XXXXX -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT

# LOG SETTINGS
-A RH-Firewall-1-INPUT -d 255.255.255.255 -j DROP
-A RH-Firewall-1-INPUT -d 224.0.0.1 -j DROP
-A RH-Firewall-1-INPUT -p udp -m multiport --dport 137,138,139,445 -j DROP
-A RH-Firewall-1-INPUT -p udp --dport 17500 -j DROP
-A RH-Firewall-1-INPUT -m limit --limit 1/s -j LOG --log-prefix "[iptables firewall] : " --log-level=info

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

この設定では、INPUT -> RH-Firewall-1-INPUTの順で通ってきて、上記LOG SETTINGS以前の、

どの条件にもかからなかったアクセスをログに出力します。

ログの出力はREJECTやDROPする前にさせる必要があるようです。

各行の説明は参考ページに詳しく載っていますので簡単に

  • 23行目:ブロードキャストをログに出さないよう、DROP
  • 24行目:マルチキャストをログに出さないよう、DROP
  • 25行目:NetBIOS、SMBのポート宛はログに出さないよう、DROP
  • 26行目:Dropboxのパケット。黙ってDROP
  • 27行目:肝のログ出力部分。
    • -m limit –limit 1/s
      • この部分は単位時間当たりに記録するパケット数。この場合は1秒1パケット。多い場合はもう少し緩やかに。
    • -j LOG
      • この指定でログ出力を行う。前述の設定をしてないと流れ込むパケットでログに溺れるとおもいます。
    • –log-prefix “[iptables firewall]”
      • ログ出力時につける識別子。
    • –log-level=info
      • ログ出力のレベルを設定。通常はwarning

これで、iptablesからログを出す準備は整いました。iptablesを再起動してみましょう。

sudo service iptables restart

設定が間違ってなければ起動します。間違ってたら元に戻すか、見直しましょう。

さて、これでログが /var/log/kern.log に出力・・・されてません。

あれっ?(・∀・;)

人によったら出てる人もいるかと思うのですが、私は設定しないとサッパリ出ませんでした。

ってことで、ログが出るように次の設定です。

rsyslogの設定

さくらVPSのiptablesのログ出力で探すと出てくる情報が、大体がsyslogの設定になってるのですが、

うちの環境では何故か見つからない・・・。デフォルトOSなのに・・・。

が、rsyslogを見つけたので、こいつだろうと思って設定したら出ました。

まず、rsyslogの設定ファイルを開きます。

sudo vi /etc/rsyslog.conf

開くとずらずらと長いコンフィグファイルが出てきますが次の箇所に

一行付け足しましょう。

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
kern.info                                               /var/log/iptables.log

こうすることで、 /var/log/iptables.log にiptablesのログが出力されます。

追加したら保存して、rsyslogを再起動・・・といきたいところですが、このままだと

ログがズンドコ溜まって、気づいた頃にはディスク容量を圧迫して時既に遅し

とかなりかねません。なので、定期的にログを入れ替えるようにログローテーションの設定を行います。

ログローテーションの設定

次の箇所に新しくファイルを作ります

sudo vi /etc/logrotate.d/iptables

中身は、参考ページマルパクリリスペクトで

/var/log/apt/iptables.log {
  rotate 3
  weekly
  compress
  missingok
  notifempty
  create 640 root adm
}

2015.11.23 追記
コメントよりご指摘頂きましたが、上記設定にミスがありました。
上記設定では正常にログローテーションがされません。
正しくは下記となります。

/var/log/iptables.log {
  rotate 3
  weekly
  compress
  missingok
  notifempty
  create 640 root adm
}

以上、ハイライト部分が修正個所となります。ご指摘ありがとうございます。

1週間ごとに3世代分をぐるぐる回すイメージです。

これで設定完了しましたので、rsyslogを再起動しましょう。

sudo /etc/init.d/rsyslog restart

無事再起動すれば、 /var/log/iptables.log が出来ているはずです。

ちょっと眺めてると、色んなIPからいろんな意図を持ったアクセスがあると思うので

必要に応じてiptablesの更新を行いましょう。

私のところでも、SSHの標準ポートにアクセスしに着てるIPがチラホラ見受けられます。

iptablesでログ出力設定” への3件のフィードバック

  1. 2年以上前の記事ですが丁寧にか書かれていて参考にさせてもらってます。
    気になったのはリスペクトしてる部分の1行目の
    /var/log/apt/iptables.log
    は正しくは
    /var/log/iptables.log
    ではないですしょうか? 

    1. ご指摘ありがとうございます。該当部分に追記しました。全く気付いてませんでした…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です