CentOS 6/iptables



iptablesの設定を始める前に

SSH などを使ってリモートで設定を行う場合は注意してください。
設定ミスにより SSH の接続が遮断されてしまうと、修復が大変になります。
十分な確認作業と、直接オペレーションできる環境で作業することをお勧めします。

下記の単語の意味を把握してください。ファイヤーウォールの設定を行うに当たって重要な言葉になります。

  • outbound
    システムから外部にデータを送信すること
  • inbound
    システムが外部からデータを受信すること
  • portfowarding
    特定のポートに送られてきたデータを、別の特定ポートに送信すること

さらに iptables の設定を進めるにあたって、下記の表を理解できるとスムーズに設定が進みます。

テーブルによって使用できるチェイン一覧
filterINPUT、FORWARD、OUTPUT
natPREROUTING、OUTPUT、POSTROUTING
manglePREROUTING、OUTPUT
チェイン名の説明
INPUT入力パケット
OUTPUT出力パケット
FORWARDフォワードするパケット
PREROUTING受信時に変換するチェイン
POSTROUTING送信時に変換するチェイン
主なオプション
-A--append指定チェインに1つ以上の新しいルールを追加
-D--delete指定チェインから1つ以上のルールを削除
-P--policy指定チェインのポリシーを指定したターゲットに設定
-N--new-chain新しいユーザー定義チェインを作成
-X--delete-chain指定ユーザー定義チェインを削除
主なパラメータ
-p--protocol プロコトルルールで使うプロトコル(tcp、udp、icmp、all)を指定
-s--source IPアドレス[/mask]送信元IPアドレス(ホスト名も指定可)
-d--destination IPアドレス[/mask]接続先アドレス(ホスト名も指定可)
-i--in-interface デバイスパケットが入ってくるインターフェイス(eth0、eth1など)を指定
-o--out-interface デバイスパケットが出ていくインターフェイスを指定
-j--jump ターゲットパケットがマッチしたときのアクション(ターゲット)を指定
-t--table テーブルテーブル(filter、nat、mangle)を指定
!-p、-s、-dなどで、条件を反転する。
「! 192.168.0.1」で「192.168.0.1以外」という意味


事前準備

構築するサーバーで動かすサービスをリストアップします。
そのサービスが何番のポートを使って、内から外(outbound)、外から内(inbound)のどちらにアクセスがあるか調べます。
例:

パッケージ名サービス名ポートoutboundinbound
Apachehttp80
https443
BINDdomain53
NTPtime37-
Postfixsmtp25
submission587
smtps465
Dovecotpop3110-
imap143-
pop3s995-
imaps993-
vsftpdftp21
ftp-data20
SSHssh22


設定ファイルの作成

検索サイトで iptables の設定方法を調べるとたくさんの手法が掲載されています。
がっちり固めることも可能です。
自分のスキル・環境にあった手法およびルールで行うのが一番です。
まず基本的なルールで始めて、徐々に理解とともに禁止(防御)系のルールなどを追加していく方がいいでしょう。
国ごとにアクセスを許可・拒否する方法もあります、こちらも検索エンジンで参照にしてください。


本サイトでは shファイル を使った方法を記述します。

ポリシーの決定

iptables の設定は下記のポリシーで行います。
基本的に

  • インバウンドはすべて禁止
  • アウトバウンドはすべて許可
  • ポートフォワーディングはすべて禁止

このポリシーをもとに各要素のルールを追加していく形になります。

1.初期設定

  • iptables停止

2.基本ルール

  • インバウンド禁止
  • アウトバウンド許可
  • ポートフォワーディング禁止

3.防御系ルール

  • FRAGMENT 対策
  • PING STEALTH 対策
  • PING OF DEATH 対策
  • 113 IDENT 対策

    など…

4.インバウンドルール

5.アウトバウンドルール

6.ポートフォワーディングルール

7.特殊処理

  • 拒否IPアドレスの設定

8.終了処理

  • iptables保存
  • iptables開始


サービスで使用するポートのルール

まずPCなどのテキストエディタを使って前述したサービスに対しての インバウンドのルールアウトバウンドのルール をそれぞれ分けて記述します。
※下記に記載しているFTP PASVのポート番号はFTPサーバーで各自が設定したものを使用してください。
例:

  • インバウンド(セッション確立後)
    Everything is expanded.Everything is shortened.
      1
      2
      3
    
    -
    |
    !
    
    ### Inbound Session Rule ###
    # セッション確立後は許可
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  • インバウンド
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
    
    -
    |
    !
     
    -
    !
    -
    !
    -
    !
    -
    !
     
     
    -
    |
    |
    !
     
     
     
     
     
    
    ### InBound Rule ###
    # domain(53)
    iptables -A INPUT -p tcp --dport 53 -j ACCEPT
    iptables -A INPUT -p udp --dport 53 -j ACCEPT
    # ssh(22)
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    # http(80)
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    # https(443)
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    # ftp(21) ftp-data(20) PASV(40000-40029)
    iptables -A INPUT -p tcp --sport 20 -j ACCEPT
    iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -A INPUT -p tcp --dport 40000:40029 -j ACCEPT
    # samba
    # netbios-ssn(tcp:139)、microsoft-ds(tcp:445)
    # netbios-ns(udp:137)、netbios-dgm(udp:138)
    iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 137 -j ACCEPT
    iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 138 -j ACCEPT
    iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
    iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 445 -j ACCEPT
     ・
     ・
  • アウトバウンド
    Everything is expanded.Everything is shortened.
      1
      2
      3
    
    -
    !
     
    
    ### OutBound Rule ###
     ・
     ・
  • ポートフォワーディング
    Everything is expanded.Everything is shortened.
      1
      2
      3
    
    -
    !
     
    
    ### PortForwarding Rule ###
     ・
     ・


防御系ルール

iptablesの設定に慣れてきたら防御系のルールを増やしてみましょう。
実際にはあげたらきりがないくらいさまざまなルールがあります。
その中でもメジャーなものや流行りの攻撃に対するものから入れていきます。
実際に運用に適したものか検証を行ってください。


  • NetBIOS 対策
    ※ここではLANのIPアドレス帯域を 192.168.0.0/24 としています。
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
    
     
     
     
     
     
     
     
    
    iptables -N NET-BIOS
    iptables -A NET-BIOS -j LOG --log-prefix '[iptables] NETBIOS DROP:'
    iptables -A NET-BIOS -j DROP
    iptables -A INPUT  -s ! 192.168.0.0/24 -p tcp -m multiport --dports 135,137,138,139,445 -j NET-BIOS
    iptables -A INPUT  -s ! 192.168.0.0/24 -p udp -m multiport --dports 135,137,138,139,445 -j NET-BIOS
    iptables -A OUTPUT -d ! 192.168.0.0/24 -p tcp -m multiport --sports 135,137,138,139,445 -j NET-BIOS
    iptables -A OUTPUT -d ! 192.168.0.0/24 -p udp -m multiport --sports 135,137,138,139,445 -j NET-BIOS
    ※"Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`)." というエラーが表示される場合は
    -s ! 192.168.0.0/24
     ↓↓
    ! -s 192.168.0.0/24

    -d ! 192.168.0.0/24
     ↓↓
    ! -d 192.168.0.0/24
    に記述を変更してください。
  • FRAGMENT 対策
    Everything is expanded.Everything is shortened.
      1
      2
      3
    
    -
    !
     
    
    # FRAGMENT 対策
    iptables -A INPUT -f -j LOG --log-level debug --log-prefix '[iptables] FRAGMENT DROP:'
    iptables -A INPUT -f -j DROP
  • PING OF DEATH 対策
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
    
    -
    !
     
     
     
     
    
    # PING OF DEATH 対策
    iptables -N PINGOFDEATH
    iptables -A PINGOFDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
    iptables -A PINGOFDEATH -j LOG --log-level debug --log-prefix '[iptables] PINGDEATH DROP:'
    iptables -A PINGOFDEATH -j DROP
    iptables -A INPUT -p icmp --icmp-type echo-request -j PINGOFDEATH
  • 113 IDENT 対策
    Everything is expanded.Everything is shortened.
      1
      2
    
    -
    !
    
    # 113 IDENT 対策
    iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
  • syn flood攻撃 対策
    ※syn flood攻撃 対策は /etc/sysctl.conf でも対応可能です。
    どちらか好きな方を選んでください。
    • iptables で行う方法
      Everything is expanded.Everything is shortened.
        1
        2
        3
        4
        5
      
      -
      !
       
       
       
      
      # syn flood攻撃 対策
      iptables -N syn-flood
      iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
      iptables -A syn-flood -j LOG --log-prefix "[iptables] SYN flood: "
      iptables -A syn-flood -j DROP
    • /etc/sysctl.conf で行う方法
      Everything is expanded.Everything is shortened.
        1
        2
        3
        4
        5
        6
        7
        8
        9
       10
       11
       12
       13
       14
      
      -
      !
       
       
       
      -
      !
       
       
       
      -
      !
       
       
      
      # 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
       
      # ※Smurf攻撃 対策(ブロードキャストアドレス宛pingには応答しない)
      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
      sysctl -w net.ipv4.conf.all.accept_redirects=0 > /dev/null
      echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf
  • ブロードキャストパケット破棄
    Everything is expanded.Everything is shortened.
      1
      2
      3
    
    -
    !
     
    
    # ブロードキャストパケット破棄
    iptables -A INPUT -d 255.255.255.255 -j DROP
    iptables -A INPUT -d 224.0.0.1 -j DROP
  • 破棄データのログ記録
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
    
    -
    !
     
     
     
    
    # Record of drop log
    iptables -A INPUT -m limit --limit 1/s -j LOG --log-level info --log-prefix '[iptables] INPUT DROP:'
    iptables -A INPUT -j DROP
    iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level info --log-prefix '[iptables] FORWARD DROP:'
    iptables -A FORWARD -j DROP


特殊処理

サーバーの運用を始めると悪質なアクセスや攻撃により拒否したいIPアドレスなどが出てきます。
そういったIPアドレスには下記の方法で対応できます。
/root/iptables_deny_ip などの名前でファイルを作成。

# vi /root/iptables_deny_ip

拒否したいIPアドレスを1行1つずつで追記していきます。
下記のスクリプトで iptables_deny_ip を1行ずつ取得し 拒否ルール(ログを記録しない)を設定しています。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
-
|
-
-
-
|
!
!
### Special Rule ###
# Deny IP Address
if [ -s /root/iptables_deny_ip ]; then
    for ipaddress in `cat /root/iptables_deny_ip`
    do
        iptables -I INPUT -s $ipaddress -j DROP
    done
fi

shプログラム化

前述 で記載した各要素の順序にルールを並べます。
※「破棄データのログ記録」だけ最後の方に記載します。
せっかくshプログラム化していますので、LANのネットワーク帯域などは変数化しておきます。

ここでは /root/iptables_rule.sh というファイル名で作成します。

# vi /root/iptables_rule.sh
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
-
!
-
!
 
-
!
 
-
|
!
 
 
-
!
 
 
 
-
|
!
 
-
|
!
 
 
 
 
 
 
 
-
!
 
 
-
!
 
 
 
 
 
-
!
 
-
!
 
 
 
-
!
 
 
 
-
!
 
 
 
-
!
 
 
-
|
|
!
 
-
!
-
!
-
!
-
!
 
 
-
|
|
!
 
 
 
 
 
 
-
|
!
 
 
-
|
!
 
 
-
|
-
-
-
|
!
!
|
-
!
|
|
|
|
-
|
!
|
-
!
#!/bin/bash
 
### Variable definition ###
LANNET=192.168.0.0/24
 
### iptables stop ###
/etc/rc.d/init.d/iptables stop
 
### Initialize ###
# ルールを消去
iptables -F
iptables -X
 
### Base Rule ###
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
 
### Inbound Session Rule ###
# セッション確立後は許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
### Defence Rule ###
# NetBIOS 対策
iptables -N NET-BIOS
iptables -A NET-BIOS -j LOG --log-prefix '[iptables] NETBIOS:'
iptables -A NET-BIOS -j DROP
iptables -A INPUT  ! -s $LANNET -p tcp -m multiport --dports 135,137,138,139,445 -j NET-BIOS
iptables -A INPUT  ! -s $LANNET -p udp -m multiport --dports 135,137,138,139,445 -j NET-BIOS
iptables -A OUTPUT ! -d $LANNET -p tcp -m multiport --sports 135,137,138,139,445 -j NET-BIOS
iptables -A OUTPUT ! -d $LANNET -p udp -m multiport --sports 135,137,138,139,445 -j NET-BIOS
 
# FRAGMENT 対策
iptables -A INPUT -f -j LOG --log-level debug --log-prefix '[iptables] FRAGMENT DROP:'
iptables -A INPUT -f -j DROP
 
# PING OF DEATH 対策
iptables -N PINGOFDEATH
iptables -A PINGOFDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A PINGOFDEATH -j LOG --log-level debug --log-prefix '[iptables] PINGDEATH DROP:'
iptables -A PINGOFDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j PINGOFDEATH
 
# 113 IDENT 対策
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
 
# 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
 
# ※Smurf攻撃 対策(ブロードキャストアドレス宛pingには応答しない)
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
sysctl -w net.ipv4.conf.all.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf
 
# ブロードキャストパケット破棄
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP
 
### InBound Rule ###
### 各自の運用に合わせて修正してください ###
# domain(53)
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# ssh(22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# http(80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# https(443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ftp(21) ftp-data(20) PASV(6600-6629)
iptables -A INPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 6600:6629 -j ACCEPT
# samba
# netbios-ssn(tcp:139)、microsoft-ds(tcp:445)
# netbios-ns(udp:137)、netbios-dgm(udp:138)
iptables -A INPUT -p udp -m udp -s $LANNET --dport 137 -j ACCEPT
iptables -A INPUT -p udp -m udp -s $LANNET --dport 138 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp -s $LANNET --dport 139 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp -s $LANNET --dport 445 -j ACCEPT
 ・
 ・
 
### OutBound Rule ###
### 各自の運用に合わせて修正してください ###
 ・
 ・
 
### PortForwarding Rule ###
### 各自の運用に合わせて修正してください ###
 ・
 ・
 
### Special Rule ###
# Deny IP Address
if [ -s /root/iptables_deny_ip ]; then
    for ipaddress in `cat /root/iptables_deny_ip`
    do
        iptables -I INPUT -s $ipaddress -j DROP
    done
fi
 
### Record of drop log ###
iptables -A INPUT -m limit --limit 1/s -j LOG --log-level info --log-prefix '[iptables] INPUT DROP:'
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level info --log-prefix '[iptables] FORWARD DROP:'
iptables -A FORWARD -j DROP
 
### End Process
# iptables data save
/etc/rc.d/init.d/iptables save
 
# iptables start
/etc/rc.d/init.d/iptables start

※"Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`)." というエラーが表示される場合は

-s ! 192.168.0.0/24
 ↓↓
! -s 192.168.0.0/24
-d ! 192.168.0.0/24
 ↓↓
! -d 192.168.0.0/24

に記述を変更してください。

パーミッションを変更します。

# chmod 700 /root/iptables_rule.sh

実行しルールを反映させます。

# /root/iptables_rule.sh


iptables自動起動設定

iptablesの自動起動設定を確認します。

# chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off

2~5が on になっていない場合は下記のコマンドを実行します。

# chkconfig iptables on

再度確認します。

# chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off


確認作業

ルールで設定したサービスが正常にアクセスできるか確認します。


最後に

iptables の設定は細かく多彩な設定が可能です。
たとえば パスワード認証が必要なサービス SSH、メール系(SMTP-AUTH、POP3、IMAPなど)、FTP等はBrute force attack(パスワードアタック)などの防御に有効な設定も可能です。
このあたりは調べるといくつか設定方法を見つけることができるでしょう。
一気に難しい設定にすると問題が起きた場合の対処もできなくなるので、徐々に理解を深めていき、スキルに合わせて設定を変えていくといいでしょう。




Last-modified: 2015-04-23 (木) 17:49:05 (1304d)