FC20 Linuxサーバー構築

iptablesの設定(ファイアウォール)

  • iptablesの解説は https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-IPTables.html が便利
  • iptablesで、ファイアウォールの設定を行う。
  • もっとも、安全な設定は
    tables -P INPUT DROP
    tables -P FORWARD DROP
    tables -P OUTPUT DROP
    
    である。
  • 設定の保管は
    service iptables save
    
    で、行える。
  • IPTables コマンドオプションの構造
    iptables [-t <table-name>] <command> <chain-name> <parameter-1> <option-1> ... <parameter-n> <option-n>
    <table-name> — ルールが適用されるテーブルを指定します。省略時は、 filter テーブルが使用されます。
    <command> — ルールの追加または削除などの、実行するアクションを指定します。
    <chain-name> — 編集、作成または削除するチェーンを指定します。
    <parameter>-<option> のペア — ルールにマッチするパケットをどのように処理するかを指定するパラメーターおよび関連するオプションです。 
    
    • <table-name>
      filter
      nat
      mangle
      
      の3種類
    • <command>
      -A 追加
      -I 挿入
      -D 削除
      -R 置換
      -L 表示
      -S 表示
      -N 新しいチェーン(名前)を作成
      -E ユーザー定義のチェーンの名前を変更
      -F フラッシュ チェーンで定義されたルールを一括削除
      -P デフォルトのポリシーを設定
      -X ユーザー指定のチェーンを削除()
      -Z バイトカウンターとパケットカウンターをゼロに設定
      -h ヘルプ
      
    • <chain-name>
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain            Append to chain
  --check   -C chain            Check for the existence of a rule
  --delete  -D chain            Delete matching rule from chain
  --delete  -D chain rulenum
                                Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
                                Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
                                Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
                                List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
                                Print the rules in a chain or all chains
  --flush   -F [chain]          Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
                                Zero counters in chain or all chains
  --new     -N chain            Create a new user-defined chain
  --delete-chain
            -X [chain]          Delete a user-defined chain
  --policy  -P chain target
                                Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                                Change chain name, (moving any references)
Options:
    --ipv4      -4              Nothing (line is ignored by ip6tables-restore)
    --ipv6      -6              Error (line is ignored by iptables-restore)
[!] --protocol  -p proto        protocol: by number or name, eg. `tcp'
[!] --source    -s address[/mask][...]
                                source specification
[!] --destination -d address[/mask][...]
                                destination specification
[!] --in-interface -i input name[+]
                                network interface name ([+] for wildcard)
 --jump -j target
                                target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match       -m match
                                extended match (may load extension)
  --numeric     -n              numeric output of addresses and ports
[!] --out-interface -o output name[+]
                                network interface name ([+] for wildcard)
  --table       -t table        table to manipulate (default: `filter')
  --verbose     -v              verbose mode
  --line-numbers                print line numbers when listing
  --exact       -x              expand numbers (display exact values)
[!] --fragment  -f              match second or further fragments only
  --modprobe=<command>          try to insert modules using this command
  --set-counters PKTS BYTES     set the counter during insert/append
[!] --version   -V              print package version.


tcp match options:
[!] --tcp-flags mask comp       match when TCP flags & mask == comp
                                (Flags: SYN ACK FIN RST URG PSH ALL NONE)
[!] --syn                       match when only SYN flag set
                                (equivalent to --tcp-flags SYN,RST,ACK,FIN SYN)
[!] --source-port port[:port]
 --sport ...
                                match source port(s)
[!] --destination-port port[:port]
 --dport ...
                                match destination port(s)
[!] --tcp-option number        match if TCP option set


udp match options:
[!] --source-port port[:port]
 --sport ...
                                match source port(s)
[!] --destination-port port[:port]
 --dport ...
                                match destination port(s)


icmp match options:
[!] --icmp-type typename        match icmp type
[!] --icmp-type type[/code]     (or numeric type or type/code)
Valid ICMP Types:
any
echo-reply (pong)
destination-unreachable
   network-unreachable
   host-unreachable
   protocol-unreachable
   port-unreachable
   fragmentation-needed
   source-route-failed
   network-unknown
   host-unknown
   network-prohibited
   host-prohibited
   TOS-network-unreachable
   TOS-host-unreachable
   communication-prohibited
   host-precedence-violation
   precedence-cutoff
source-quench
redirect
   network-redirect
   host-redirect
   TOS-network-redirect
   TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
   ttl-zero-during-transit
   ttl-zero-during-reassembly
parameter-problem
   ip-header-bad
   required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply

-m
limit
       このモジュールは、トークンバケツフィルタを使い、単位時間あたり制限された回数だけマッチする。
       この拡張を使ったルールは、(`!' フラグが指定されない限り) 制限に達するまでマッチする。
       例えば、このモジュールはログ記録 を制限するために LOG ターゲットと組み合わせて使うことができる。

       --limit rate
              単位時間あたりの平均マッチ回数の最大値。 数値で指定され、添字 `/second',  `/minute',  `/hour',
              `/day' を付けることもできる。 デフォルトは 3/hour である。

       --limit-burst number
              パケットがマッチする回数の最大初期値:上のオプションで指定した制限に達しなければ、
              その度ごとに、この数値になるまで 1 個ずつ増やされる。 デフォルトは 5 である。

icmp
       この拡張は `--protocol icmp' が指定された場合にロードされ、 以下のオプションが提供される:

       [!] --icmp-type typename
              ICMP    タイプを指定できる。タイプ指定には、数値の ICMPタイプ、または以下のコマンド
              で表示される ICMP タイプ名を指定できる。
               iptables -p icmp -h
multiport
       このモジュールは送信元や送信先のポートの集合にマッチする。
       ポートは 15個まで指定できる。
       このモジュールは -p tcp または -p udp と組み合わせて使うことしかできない。

       --source-ports port[,port[,port...]]
              送信元ポートが指定されたポートのうちのいずれかであればマッチする。
              フラグ --sports は、このオプションの便利な別名である。

       --destination-ports port[,port[,port...]]
              宛先ポートが指定されたポートのうちのいずれかであればマッチする。
              フラグ --dports は、このオプションの便利な別名である。

       --ports port[,port[,port...]]
              送信元ポートと宛先ポートが等しく、かつそのポートが指定されたポートの
              うちのいずれかであればマッチする
state
       このモジュールは、接続追跡 (connection tracking) と組み合わせて用いると、
       パケットについての接続追跡状態を知ることができる。

       --state state
              state は、マッチングを行うための、コンマで区切られた接続状態のリストである。 指定可能な  state
              は以下の通り。
              INVALID: このパケットは既知の接続と関係していない。
              ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。
              NEW: このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。
              RELATED: このパケットが新しい接続を開始しているが、FTPデータ転送やICMPエラーのように、既存の接続に関係している。

tcp
       これらの拡張は `--protocol tcp' が指定され場合にロードされ、 以下のオプションが提供される:

       [!] --source-port port[:port]
              送信元ポートまたはポート範囲の指定。サービス名またはポート番号を指定できる。
              port:portという形式で、2  つの番号を含む範囲を指定することもできる。
              最初のポートを省略した場合、"0"を仮定する。
              最後のポートを省略した場合、"65535"を仮定する。
              最初のポートが最後のポートより大きい場合、2つは入れ換えられる。
              フラグ --sport は、このオプションの便利 な別名である。

       [!] --destination-port port[:port]
              送信先ポートまたはポート範囲の指定。 フラグ --dport は、このオプションの便利な別名である。

       [!] --tcp-flags mask comp
              TCP フラグが指定されたものと等しい場合にマッチする。
              第 1 引き数は評価対象とするフラグで、コンマ区切りのリストである。
              第 2 引き数は必ず設定しなければならないフラグで、コンマ区切りのリストである。
              指定できるフラ グは SYN ACK  FIN  RST URG PSH ALL NONE である。
              よって、コマンド iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
              は、SYN フラグが設定され ACK, FIN, RST フラグが設定されていない パケットにのみマッチする。

       [!] --syn
              SYN ビットが設定され ACK、RST および FIN ビットがクリアされている TCPパケットにマッチする。
              このようなパケットは TCP接続の開始要求に使われる。
              例えば、あるインターフェースに入ってくるこのようなパケットをブロックすれば、
              内側への TCP接続は禁止されるが、外側への TCP 接続には影響しない。
              これ は --tcp-flags SYN,RST,ACK,FIN  SYN と等しい。
              "--syn" の前に "!" フラグ を置くと、この条件を満たさないパケットにマッチする。

       [!] --tcp-option number
              TCP オプションが設定されている場合にマッチする。

       --mss value[:value]
              指定された  MSS  値  (の範囲)  を持つ  TCP  の  SYN  または SYN/ACK パケットにマッチする。 MSS
              は接続に対するパケットの最大サイズを制御する。

tos
       このモジュールは   IP   ヘッダーの   8   ビットの   (つまり上位ビットを含む)    Type    of    Service
       フィールドにマッチする。

       --tos tos
              引き数は、マッチを行う標準的な名前でも数値でもよい (名前のリストを見るには
               iptables -m tos -h
              を使うこと)。

ttl
       このモジュールは IP ヘッダーの time to live フィールドにマッチする。

       --ttl ttl
              指定された TTL 値にマッチする。

udp
       これらの拡張は `--protocol udp' が指定された場合にロードされ、 以下のオプションが提供される:

       [!] --source-port port[:port]
              送信元ポートまたはポート範囲の指定。
              詳細は TCP拡張の --source-port オプションの説明を参照すること。

       [!] --destination-port port[:port]
              送信先ポートまたはポート範囲の指定。
              詳細は TCP拡張の --destination-port オプションの説明を参照すること。

-j
 LOG - このルールにマッチするすべてのパケットのログを記録します。パケットのログがカーネルによって記録されるので、/etc/syslog.conf ファイルはこれらのログエントリーが書き込まれる位置を決めます。デフォルトでは、ログエントリーは /var/log/messages ファイルに置かれます。
ロギングの方法を指定するために、追加のオプションを LOG ターゲットの後に使用できます。

    --log-level - ロギングイベントの優先レベルを設定します。優先レベルの一覧は syslog.conf man ページを参照してください。
デフォルト(--log-levelを指定しないとき) warning
    --log-ip-options - IP パケットのヘッダーに設定されているすべてのオプションをログに記録します。
    --log-prefix - ログ行が書き込まれる際に、ログ行の前に最大 29文字の文字列を置きます。これはパケットのロギングと共に syslog フィルターを作成する際に役立ちます。

    注記
    上記のオプションについては、(このオプションに関連した問題を考慮して) log-prefix 値に末尾のスペースを追加する必要があります。
    --log-tcp-options - TCP パケットのヘッダーに設定されたオプションのログを記録します。
    --log-tcp-sequence - パケットの TCP シーケンス番号をログに書き込みます。 

 ULOG
       このターゲットは、マッチしたパケットをユーザー空間でログ記録する機能を提供する。
       このターゲットがルールに設定されると、 Linux カーネルは、そのパケットを netlink
       ソケットを用いてマルチキャストする。
       そして、1 つ以上のユーザー空間プロセスがいろいろなマルチキャストグループに登録をおこない、
       パケットを受信する。
       LOG と同様、これは "非終了ターゲット" であり、 ルールの検討は次のルールへと継続される。

       --ulog-nlgroup nlgroup
              パケットを送信する netlink グループ (1-32) を指定する。 デフォルトの値は 1 である。

       --ulog-prefix prefix
              指定したプレフィックスをログメッセージの前に付ける。 32 文字までの指定できる。
              ログの中でメッセージを区別するのに便利である。

       --ulog-cprange size
              ユーザー空間にコピーするパケットのバイト数。 値が   0
              の場合、サイズに関係なく全パケットをコピーする。 デフォルトは 0 である。

       --ulog-qthreshold size
              カーネル内部のキューに入れられるパケットの数。 例えば、この値を 10 にした場合、 カーネル内部で
              10  個のパケットをまとめ、  1  つの  netlink  マルチパートメッセージとしてユーザー空間に送る。
              (過去のものとの互換性のため) デフォルトは 1 である。

 TCPMSS
       このターゲットを用いると、TCP  の  SYN  パケットの  MSS  値を書き換え、そのコネクションの最大サイズ
       (通常は、送信インターフェースの MTUから 40 引いた値)を制御できる。   もちろん -p tcp と組み合わせてしか使えない。
       このターゲットは犯罪的に頭のいかれた ISP や ICMP Fragmentation Needed パケットをブロックしてしまうサーバーを
       乗り越えるために使用する。
       Linuxファイアウォール/ルーターでは何も問題がないのに、そこにぶら下がるマシンでは以下のように大きなパケットを
       やりとりできないというのが、この問題の兆候である。
        1) ウェブ・ブラウザで接続が、何のデータも受け取らずにハングする
        2) 短いメールは問題ないが、長いメールがハングする
        3) ssh は問題ないが、scp は最初のハンドシェーク後にハングする
       回避方法: このオプションを有効にし、以下のようなルールを ファイアウォールの設定に追加する。
        iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

       --set-mss value
              MSS オプションの値に指定した値を明示的に設定する。

       --clamp-mss-to-pmtu
              自動的に、MSS 値を (path_MTU - 40) に強制する。

       これらのオプションはどちらか 1 つしか指定できない。
LOGで、--log-levelを、debugにした場合、 rsyslog.confを修正しないと、保管しない様だ
●facility  は次のキーワードのいずれかである:
  auth、  authpriv、  cron、  daemon、 kern、 lpr、 mail、 mark、 news、 security (auth と同じ)、 syslog、 user、 uucp、  local0からlocal7。
  このうち  security は今後は利用するべきでなく、また、 mark は内部利用のためのものなので、アプリケーションレベルで用いるべきではない。
  ただし利用できないわけではない。 facility はメッセージを生成するサブシステムを規定する、
  すなわち(例えば)全てのメイルプログラムは syslog を用いてログを記録する場合は mail facility (LOG_MAIL) を用いる。
●priority  は以下のキーワードのいずれかである(昇順):
  debug,  info,  notice,  warning,  warn ( warning と同じ), err, error (err  と同じ),  crit,  alert,  emerg,  panic  (emergと同じ).
  このうちキーワード error、warn、panic については、同等のものがあるので今後は利用するべきでない。
  priority はメッセージの重要性を定義する。
kern.debug /var/log/kern-debug
ルールをクリアするには、-Fを使用する。
# iptables -F
は、-t filter が、省略されています。iptables -t filter -F

# iptables -t nat -F

ポリシーの設定
  INPUT:入ってくるパケット
  FORWARD:転送パケット
  OUTPUT:出て行くパケット

原則破棄
# tables -P INPUT DROP
# tables -P FORWARD DROP
原則許可
# tables -P OUTPUT ACCEPT 


外部からのアクセスを許可する
    SSHサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    外部向けDNSサーバーを運用する場合
    # iptables -A INPUT -p tcp --dport 53 -j ACCEPT
    # iptables -A INPUT -p udp --dport 53 -j ACCEPT
    Webサーバー(http)を公開する場合
    # iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    Webサーバー(HTTPS)を公開する場合
    # iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    FTPサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    SMTPサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 25 -j ACCEPT
    SMTPSサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 465 -j ACCEPT
    POP3サーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 110 -j ACCEPT
    POP3Sサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 995 -j ACCEPT
    IMAPサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 143 -j ACCEPT
    IMAPSサーバーを公開する場合
    # iptables -A INPUT -p tcp --dport 993 -j ACCEPT
などを、設定する。

LinuxサーバーをPCルーターにする場合
 前提とするネットワーク条件
 内部のネットワークを192.168.10.0/24
 内部のネットワークアダプタをeth0
 外部接続のインターフェイスをppp0

    # iptables -N Firewall-INPUT 
    # iptables -A INPUT -j Firewall-INPUT 
    # iprables -A Firewall-INPUT -i eth0 -j ACCEPT 
    SSHサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 22 -j ACCEPT
    外部向けDNSサーバーを運用する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 53 -j ACCEPT
    # iptables -A Firewall-INPUT -i ppp0 -p udp --dport 53 -j ACCEPT
    Webサーバー(http)を公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
    Webサーバー(HTTPS)を公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 443 -j ACCEPT
    FTPサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 21 -j ACCEPT
    SMTPサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 25 -j ACCEPT
    SMTPSサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 465 -j ACCEPT
    POP3サーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 110 -j ACCEPT
    POP3Sサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 995 -j ACCEPT
    IMAPサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 143 -j ACCEPT
    IMAPSサーバーを公開する場合
    # iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 993 -j ACCEPT


NetBIOS関連のパケットが外に出ないように
# iptables -A OUTPUT -o ppp0 -m multiport -p tcp --dport 135,137:139,445 -j DROP
# iptables -A OUTPUT -o ppp0 -m multiport -p udp --dport 135,137:139,445 -j DROP
を設定する。


スパムメールの対策としてiptablesを利用する。
# iptables -N SPAMFILTER
# iptables -N SPAMFILTERED
# iptables -A SPAMFILTERED -j LOG --log-prefix '[IPTABLES SPAMFILTER] : '
# iptables -A SPAMFILTERED -j DROP
# iptables -A INPUT -p tcp -j SPAMFILTER

58.18.0.0/16から、スパムメールが送られてくる場合
# iptables -A SPAMFILTER -s 58.18.0.0/16 -p tcp --dport 25 -j SPAMFILTERED
と、SPAMFILTERルールに追加する。
SPAMFILTERルールをクリアしたい場合、
# iptables -F SPAMFILTER
で、行うことが可能である。


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

コンソールにメッセージが表示されるため、
/etc/sysconfig/syslog を、修正
KLOGD_OPTIONS="-x"
から
KLOGD_OPTIONS="-x -c 4"
に、変更

本ホームページの転載・複製を禁じます。
--- KONDO-NET.GR.JP ---
今日のアクセス人目