CentOSのネットワークフィルタリング設定を一から行う

CentOS6.Xでは、ネットワークのファイアーウォールとしてiptablesを使用しています。iptablesの概要、フィルタリング設定の方法をまとめました。
※参考サイト
HowTOs-CentOS Wiki IPTables


※目次をクリックすると目次の下部にコンテンツが表示されます。

  1. iptablesの概要
  2. 現状の構成の確認
  3. iptablesの設定方法
  4. 基本的なルールを一から作成
  5. 各ルールの設定方法
iptablesの概要

1)Netfilterとiptables


 
・Linuxカーネルは、Netfilterと呼ばれる強力なネットワークサブシステムを特長としている。
 
・Netfilterは、NATおよびIPマスカレードのサービスのほかにも、ステートフルまたはステートレスのパケットフィルタリング機能を提供する。
 また、Netfilterには、高ルーティングや接続状態の高度な管理のためにIPヘッダー情報を分割(マングル: mangle)する機能もある。
 Netfilterはiptablesを使って制御される。
 

2)iptablesの概要


 
・Netfilterの強力な機能と柔軟性は、iptablesを使って実行される。
 
・このコマンドラインツールは、その前身であるipchains(Linuxカーネル2.4以上でNetfilter/iptablesに置き換えられる)の構文と似ている。
 
・iptablesは、Netfilterを使用してネットワークの接続、検査および処理などを強化する。
 
・iptablesは、高度なロギング、プレルーティングとポストルーティングの動作、ネットワークアドレス変換およびポート転送機能すべてをオールインワンの1つのコマンドラインインターフェースで実現する。
 

3)iptablesのフォールバックファイル


 
・デフォルトの設定が適用できない場合、iptablesのフォールバックのファイアウォール設定を提供する。
 /etc/sysconfig/iptablesにあるファイアウォールルールの適用が失敗した場合、フォールバックファイルが存在していればそのファイルが適用される。
 このフォールバックファイルの名前は/etc/sysconfig/iptables.fallbackとなり、/etc/sysconfig/iptablesと同じファイル形式になる。
 

4)iptablesサービスの有効化


 
ファイアウォールのルールは、iptablesサービスが実行されている場合にのみ有効で、サービスを手動で開始するには、以下のコマンドをrootユーザーとして実行する。
# service iptables restart
 
iptablesがシステムのブート時に自動起動されるようにするには、以下のコマンドを使用する。
 
# chkconfig –level 345 iptables on

現状の構成の確認

1)iptablesパッケージのバージョンの確認
 

# rpm -q iptables
iptables-1.4.7-9.el6.x86_64

 
2)iptablesのモジュールがロードされているか確認
 

# lsmod | grep ip_tables
ip_tables              17831  1 iptable_filter

 
3)現在設定されているルールを表示
 

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
DROP       icmp --  anywhere             anywhere            icmp timestamp-request
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere            icmp timestamp-reply

iptablesの設定方法

iptablesには事前に定義された下記3つのチェインがあります。
 
1)3つのチェイン
 
・INPUT
そのホスト宛に入ってくるすべてのパケット
・OUTPUT
そのホストが発信元で生成されるすべてのパケット
・FORWARD
送信元、送信先ではなく、そのホストを経由して通り過ぎるすべてのパケット
 
2)iptablesの処理動作
 
・各ルールはそれぞれのチェインのリストに追加されます。
例えば、tcp22番ポート(ssh)に入ってくるパケットを許可するルールを追加する場合は、INPUTチェインにそのルールが追加されます。
 
・送受信されるパケットはリストの先頭から順番にルールに従ってチェックされます。ルールにマッチするとアクション(許可、拒否)が実行されます。
 
・ひとたびルールがマッチするとアクションは実行され、パケットはそのルールの結果に従って処理され、チェイン内ではそれ以上は処理されません。
 
・チェイン内のルールにマッチせずにリストの下端に達した場合は、そのチェインのデフォルトアクション(許可、拒否)によって処理されます。
 
これはデフォルトポリシーとして参照され、パケットをACCEPT(許可)するかDROP(拒否)するかで定義されています。
 
・デフォルトポリシーと各ルールの設定方法には下記方法があります。
 
①デフォルトポリシーをDROPとし、信頼できるパケットや必要なパケットのみをACCEPTするようにしてルールを追加します。
 外部からのパケットは信頼できないパケットもありますのでINPUTチェインの設定に使われます。
 
②デフォルトポリシーをACCEPTとし、不要なパケットや設定が必要な項目のみDROPします。
 自ホストからのパケットは基本的には信頼できるのでOUTPUTチェインの設定に使われます。
 
3)iptablesコマンドの概要
 
〇構文
iptables [オプション] [パラメータ]
 
〇主なオプション
 
・-A
指定したチェーンの終わりにルールを追加
 
・-P
指定したチェーンについてデフォルトのポリシーを設定する。
 
・-F
チェイン(省略した場合はすべて)のルールを削除する。
 
・-L
チェイン(省略した場合はすべて)のルールを一覧表示する。
 
〇主なパラメータ
 
・-i
eth0やppp0などの着信ネットワークインターフェースを指定。
 
・-j
パケットが特定の規則に一致した場合に、指定されたターゲット(ACCEPT、DROPなど)にジャンプするよう指定。
 
・–state
ESTABLISHED、INVALID、NEW、RELATEDの接続状態についてパケットを照合する。
 
・-p
プロトコル(tcp, udp, icmp, allなど)を指定する。
 
・–dport
パケットの送信先ポートを指定する。
 
・-s
送信元のアドレスを指定する。

基本的なルールを一から作成

インストール時にデフォルトで設定されているルールをクリアし、基本的なシンプルなルールを作成します。
 
注)SSHでリモート接続している状態で以下の設定作業を行う場合は、自分自身の接続が締め出されてしまう可能性があるので注意が必要です。
 
現状のルールを消去する前に、インプットパケットを許可するデフォルトポリシーと追加してから行うようにします。
 
以下に実行例を示します。
(実行例)

# iptables -P INPUT ACCEPT
# iptables -F
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -L -v

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

 
●上記設定例の各コマンドの説明
 
①iptables -P INPUT ACCEPT
 
リモート接続している場合、現状のルールを消去すると自分自身が締め出されてしまう(自宅の端末から接続しているサーバーへ送ったパケットが拒否されてしまう)可能性があるので、インプットパケットを許可するデフォルトポリシーを設定します。
 
②iptables -F
 
現状のルールを消去して、きれいな状態から設定を追加します。
 
③iptables -A INPUT -i lo -j ACCEPT
 
“-i(interface)”スイッチで”lo(localhost)”を指定しています。ローカルホスト向けのインプットパケットを許可します。
 
これは、多くのアプリでローカルホストアダプターと接続できる事を想定していて、使用されているためです。
 
④iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
 
“-m”スイッチで”state”モジュールを指定しています。”state”モジュールは、パケットのステートを調べて判断します。
 
ESTABLISHEDとRELATEDのステートは、すでに接続が確立しているパケットと関連するパケットなので許可します。
 
⑤iptables -A INPUT -p tcp –dport 22 -j ACCEPT
 
ssh(ポート番号がデフォルトの22の場合)接続を許可します。
 
⑥iptables -P INPUT DROP
 
インプットパケットのデフォルトポリシーをDROPにします。明示的に許可する設定がないパケットはデフォルトポリシーによってDROPされます。
 
⑦iptables -P FORWARD DROP
 
ルーターとして使用しない場合は、パケットを転送する必要がないのでデフォルトポリシーをDROPにします。
 
⑧iptables -P OUTPUT ACCEPT
 
自マシンから出て行くパケットは、基本的には信頼できるのでデフォルトポリシーを許可にします。
 
⑨iptables -L -v
 
ルールのリストを表示し、正しく設定されているか確認します。
 
 
正しく設定されていたら、下記コマンドで設定を保存します。これによってマシンをリブートしても保存したルールが自動でロードされます。
 
# service iptables save
 
このコマンドを実行すると設定内容が/etc/sysconfig/iptablesに保存されます。

各ルールの設定方法

1)インターフェースに対してルールを設定
 
ネットワークインタフェースに対してルールを設定する場合の設定例です。
 
・ローカルホスト(127.0.0.1)に入っていくるパケットを許可
 
iptables -A INPUT -i lo -j ACCEPT
 
・eth0とeth1の二つのインタフェースがあって、eth0がインターネット用のネットワークでeth1が内部LAN用の場合で、内部LANからのすべてのINPUTを許可する場合
 
iptables -A INPUT -i eth1 -j ACCEPT
 
2)特定のIPアドレスに対してルールを設定
 
送信元のIPアドレスを特定して接続の許可を設定できます。
 
①特定のIPアドレスのみを許可する場合
例)
iptables -A INPUT -s 192.168.0.4 -j ACCEPT
 
②特定のネットワークアドレスのみを許可する場合
 
・プレフィックス表示(/24など)で指定
例)
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
 
・サブネットマスクで指定
例)
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
 
③IPアドレスとともにMACアドレスも指定する場合
 
インターネットからのアクセスに対しては使用できませんが、LANからのアクセスで、IPアドレスは偽装される恐れがあるため、端末固有に割り振られているMACアドレスも共に指定したい場合です。
例)
iptables -A INPUT -s 192.168.0.4 -m mac –mac-source 00:50:8D:FD:E6:32 -j ACCEPT
 
3)ポート、プロトコルを指定してルールを設定
 
特定のポート、プロトコルへのパケットに対してルールを設定します。
 
①特定のポートへのパケットを許可
 
例)tcpの6881番ポートへのアクセスを許可する場合
iptables -A INPUT -p tcp –dport 6881 -j ACCEPT
 
②あるポート範囲へのパケットを許可
 
例)tcp6881から6890番ポートへのアクセスを許可する場合
iptables -A INPUT -p tcp –dport 6881:6890 -j ACCEPT
 
4)SSHの設定例

関連記事の目次
 
ネットワーク、ポート番号
  • iptablesを使ってCentOSのファイアウォール設定
  • CentOS6のTCPラッパーの概要と設定方法
  • nmapでオープンしているポート番号とバージョンを確認
  •  
    yum、rpmパッケージ、サービス
  • CentOSで不要なサービスは起動しないようにする
  • RPMパッケージのインテグリティチェック
  •  
    パーミッション
  • cronで使用するファイルのパーミッション設定
  • CentOSのumaskの設定
  • ユーザーホームディレクトリ内の権限設定をセキュアにする
  • CentOSのパスワードファイルのパーミッション設定
  • findコマンドでファイル書込権限をいっせいにチェック
  • findコマンドでセットユーザ(グループ)IDが不要にセットされていないかチェック
  • findコマンドで所有者、グループが存在しないファイルを抽出
  •  
    ログイン、認証、パスワード、アカウント制御
  • ログイン時などに表示されるシステムバナーを変更するには?
  • CentOSのユーザーアカウントのパスワードポリシーを設定
  • pam_cracklibモジュールでパスワードポリシーを設定
  • pam_unix.soモジュールを使って過去のパスワード再使用を制限する
  • システムコンソールでのrootログインを制限する方法
  • suコマンドによるrootへのスイッチを制限する
  • root権限でのコマンド実行、sudoだと監査ログが取得できる
  • デーモン用アカウントなどに対しシェルを使用を無効にする
  • パスワード認証を失敗時にアカウントをロックアウトする設定
  • rootアカウントのPATH環境変数のセキュリティについて
  •  
    auditdでシステム監査
  • auditdを使ってシステム監査
  • auditdのログ容量の設定
  • auditd監査ルールの設定方法
  • auditdで時間設定変更操作を監査する
  • auditdでユーザー・グループ設定ファイル変更操作を監査する
  • auditdでネットワーク関連の設定変更を監査する
  • auditdでログイン記録のログファイルの変更を監査する
  • auditdでファイル所有者や権限の変更に関するイベントを監査する
  • auditdでsetuid、setgidプログラムの実行を監査する
  • auditdでマウント操作を監査する
  • auditdでファイル削除操作を監査する
  • auditdでsudo設定ファイルに対する操作を監査する
  • auditdでカーネルモジュールのロード、アンロードを監査する
  • マシン再起動後にauditdの設定変更を有効にする設定
  • ausearch、aureportで監査ログのサマリレポートを作成
  •  
    ツール
  • NTPのセキュリティを考慮した設定
  • セキュリティを考慮してX Windowsを設定または削除する方法
  • ファイルの改ざん対策用にTripwireを導入
  • CentOSにホスト型侵入検知ソフトAIDE(Advanced Intrusion Detection Environment)を導入
  •  
    トラブルシューティング
  • アイドルのシェルを自動で強制終了させるには?
  • CentOSでコアダンプを無効にする方法
  • Linuxのbash脆弱性CVE-2014-6271、Shellshockを修整
  • CentOSでバッファーオーバーフロー脆弱性に対する防御機能が有効になっているか確認する
  • VPSサーバーでスナップショットを取得
    ~障害に備え、リカバリーポイントを作成。
    VPSサーバーにログインして、設定内容を確認
    ~グローバルIPアドレス確認、SSHキーを作成。
    VPSサーバーにSSHでログイン
    ~Tera Term、SSH、公開鍵認証方式
    yumコマンドで最新のパッケージにアップデート
    ~全パッケージを最新にアップデート
    Apacheのインストール
    ~yumコマンドでApacheインストール、iptablesでファイアウォールの設定
    PHPとMySQLをインストール
    ~yumコマンドでPHP、MySQLインストール
    WinSCPを使ってWordPressをアップロード
    ~WinSCPをクライアントPCにインストール、ファイルアップロード方法
    WordPressをインストール
    ~MySQLでWordPress用データベース作成、wp-config.phpファイルの設定
    CentOSのファイアウォール設定
    ~iptablesを使ってネットワークフィルタリング設定を一から行う
    OpenSSHの設定をよりセキュアに
    ~ログイン制限、ポート変更、認証方式
    ApacheでTCPのTraceメソッドを無効にする
    ~Apacheの設定変更、Telnetで動作確認
    ヘッダーにApacheバージョンが表示されないようにする
    ~Apacheの設定変更、Telnetで動作確認
    Apacheでディレクトリ内一覧表示を無効にする
    ~autoindex_moduleのロードを無効にする
    セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
    ~MySQLの匿名ユーザーにパスワードを設定、または削除
    PHPのバージョンが表示されないようにする
    ~php.iniの設定変更
    WordPressディレクトリのパーミッションをセキュアに
    ~WordPress用ディレクトリの所有グループ、ユーザー、パーミッション設定
    パーマリンク設定時のApache設定
    ~WordPressパーマリンクの設定、Apache .htaccessの設定
    WordPressテーマの選定
    ~テーマ追加の特徴フィルターの項目、テンプレートキング
    WordPressで画像のアップロード、サイズ調整、リンクを設定
    ~アップロード画像の画像サイズ、サムネイル、画像編集、リンク設定
    更新可能なRPMパッケージのリストをメールで送信する
    ~yumコマンド、Bashスクリプト、Cron
    Linuxでディスク使用量が多いディレクトリを調べる方法(1)
    ~du --max-depth
    Linuxでディスク使用量が多いディレクトリを調べる方法(2)
    ~duコマンド、sortコマンド
    WordPressデータベースのバックアップとリストア
    ~コマンドラインでバックアップ、リストア
    WordPressのバージョンアップと旧バージョンへの戻し
    ~データベースとディレクトリのバックアップ、リストア
    BashスクリプトでWordPressデータベースを自動バックアップ
    ~MySQLデータベースをBash、Cronを使って自動バックアップ、メール通知
    BashスクリプトでDos攻撃など大量アクセスのログを検知
    ~Apacheアクセスログ、Dos、Cron、メール通知
    テーマ作成
     
    ブートストラップ3を使って自作テーマ作成
    ~Bootstrap3、自作テーマ作成、TwentyFourteen
    Bootstrapのフリーのテーマを使ってデザインを簡単にカスタマイズ
    ~Bootstrap3のスタイルをカスタマイズ
     
    WordPresssショートコード
     
    簡単なショートコードを作ってみる
    ~ショートコードの作り方
    ショートコードを使って関連記事のリンクを自動で挿入
    ~ショートコードの簡単なサンプル
    ショートコードを使ってディレクトリ内のファイル名を取得し、投稿内にリンクを挿入
    ~カスタムフィールド利用、PHPで日本語文字列検索などのコーディング
     
    AJAX、AngularJSなどその他応用
     
    WordPress投稿内でAngularJSを使用
    ~AngularJS、Bootstrap、アコーディオン
    Bootstrap3で作成したナビゲーションメニューをAngularJSに変更
    ~AngularJS、Bootstrap、自作テーマheder.php
    WordPressでAngularJSを使ったGoogleマップを使えるようにする
    ~AngularJSを使って投稿内にGoogleマップ

    コメントを残す

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