CentOS6.Xでは、ネットワークのファイアーウォールとしてiptablesを使用しています。iptablesの概要、フィルタリング設定の方法をまとめました。
※参考サイト
HowTOs-CentOS Wiki 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
# 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
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に保存されます。
ネットワークインタフェースに対してルールを設定する場合の設定例です。
・ローカルホスト(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の設定例
-
OpenSSH
- レンタルサーバー(VPS)にSSHでログイン
- VPS(レンタル)サーバー上のssh初期設定確認
- SSH接続の仕組み
- OpenSSHの設定ファイル
- OpenSSHの設定をよりセキュアに
- CentOS Stream9のSSH設定(OpenSSH)
- WinSCPを使ってファイル転送
ネットワーク、ポート番号
rpmパッケージ、サービス
パーミッション
ログイン、認証、パスワード、アカウント制御
auditdでシステム監査
ツール
トラブルシューティング
- 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を使って自作テーマ作成
- (1)全体概要
- (2)ブートストラップのサンプルを使ってindex.phpを作成
- (3)header.php、sidebar.php、footer.php、index.phpのテンプレートファイル作成
- (4)JavaScriptインクルードの設定
- (5)投稿本文表示用のテンプレートファイルを作成
- (6)単一投稿用(single.php)のテンプレートファイル作成
- (7)固定ページ用(page.php)のテンプレートファイル作成
- (8)検索結果表示用(search.php)のテンプレートファイル作成
- (9)アーカイブ表示用(archive.php)のテンプレートファイル作成
- (10)カテゴリー表示用(category.php)のテンプレートファイル作成
- (11)WordPressのメニュー画面でナビゲーションメニューを設定
- (12)サイトタイトル、キャッチフレーズを表示できるようにheader.phpを修正
- (13)カスタムヘッダー画像を使えるようにheader.phpを修正
- (14)404.phpテンプレートファイルを作成
- (15)記事タイトル部分のCSS設定
- (16)記事メタデータ部分のCSS設定
- (17)記事本文部分のCSS設定
- (18)前後のページへのリンクのCSS設定
- (19)前後の投稿へのリンクのCSS設定
- (20)コメント投稿フォーム、コメント表示部のCSS設定
- (21)ウィジェット部のCSS設定
- (22)アーカイブページのCSS設定
- (23)画面を左右にスライドさせるボタンのCSS設定
- ~Bootstrap3、自作テーマ作成、TwentyFourteen
- Bootstrapのフリーのテーマを使ってデザインを簡単にカスタマイズ
- ~Bootstrap3のスタイルをカスタマイズ
- 簡単なショートコードを作ってみる
- ~ショートコードの作り方
- ショートコードを使って関連記事のリンクを自動で挿入
- ~ショートコードの簡単なサンプル
- ショートコードを使ってディレクトリ内のファイル名を取得し、投稿内にリンクを挿入
- ~カスタムフィールド利用、PHPで日本語文字列検索などのコーディング
- WordPress投稿内でAngularJSを使用
- ~AngularJS、Bootstrap、アコーディオン
- Bootstrap3で作成したナビゲーションメニューをAngularJSに変更
- ~AngularJS、Bootstrap、自作テーマheder.php
- WordPressでAngularJSを使ったGoogleマップを使えるようにする
- ~AngularJSを使って投稿内にGoogleマップ
WordPresssショートコード
AJAX、AngularJSなどその他応用
- Ruby on Rails(他サイト)
- ~構築、CMS、Bootstrap、AngularJS
-
CentOSの概要
- RHEL6、CentOS6の64ビットサポートとhuge pages
- RHEL6、CentOS6の64ビットサポートとNUMA
- CentOS6インストール手順のメモ
- CentOSのブートの流れ、ランレベルの指定
- procファイルシステムの概要
- sysctlコマンドでカーネルパラメータの参照、変更
- CentOS6の各種ネットワーク設定ファイルとインタフェース制御スクリプト
- cron、anacronで自動定期実行
- at、batchコマンドの概要
- CentOS6のシステムログ
- rsyslogの設定方法
- システムログのローテート設定の確認
- CentOSのハードウェア情報を表示するコマンド
- CentOSでパーティション、スワップ、ディスク情報を確認
- LinuxのLVMの概要と表示コマンド
- ボリュームグループ、論理ボリューム作成、ファイルシステム作成、マウント設定、物理ボリュームを追加
- CentOSで論理ボリューム、ext4ファイルシステムを拡張
- CentOSのLVMでボリュームグループから物理ボリュームを削除
- WindowsからCentOS6にリモートデスクトップする手順
- viエディタの使用方法
- HTMLのマニュアルをLinuxのターミナル画面上で読む
- findコマンドで直近に更新されたファイルを調べる方法
- Linuxでディスク使用量が多いディレクトリを調べる方法(1)
- Linuxでディスク使用量が多いディレクトリを調べる方法(2)
- ディスク使用量が多いディレクトリを抽出するbashスクリプト
- psコマンドで全プロセスを表示する方法と表示結果の見方
- プロセス階層、プロセスグループ、セッションを確認するには?
- psコマンドでスレッドに関する情報を表示するには?
- netstat、nmapを使ってリッスンポートを確認する方法
- 日本語設定、シェル環境設定
- CentOSのユーザー環境設定ファイル(bashrc、profile)
- umaskはどこで設定されている?
- シェル変数と環境変数の違い
- CentOSのネットワークフィルタリング設定を一から行う
- CentOS6のTCPラッパーの概要と設定方法
- CentOS6のユーザー管理の概要とコマンド操作
- ファイルのパーミッション設定、ディレクトリは要注意
- Linuxでスティッキービットが設定されているか確認する方法
- sudoで特定のコマンドのみをroot権限で実行する
システム管理
Linuxコマンド操作
シェル環境設定
ネットワーク関連
ユーザー管理、権限
-
ネットワーク、ポート番号
- 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環境変数のセキュリティについて
- NTPのセキュリティを考慮した設定
- セキュリティを考慮してX Windowsを設定または削除する方法
- ファイルの改ざん対策用にTripwireを導入
- CentOSにホスト型侵入検知ソフトAIDE(Advanced Intrusion Detection Environment)を導入
- アイドルのシェルを自動で強制終了させるには?
- CentOSでコアダンプを無効にする方法
- Linuxのbash脆弱性CVE-2014-6271、Shellshockを修整
- CentOSでバッファーオーバーフロー脆弱性に対する防御機能が有効になっているか確認する
yum、rpmパッケージ、サービス
パーミッション
ログイン、認証、パスワード、アカウント制御
ツール
トラブルシューティング