はじめに
iptablesを使用してサーバーへのアクセスを保護するための基本ガイド。
前提条件
CentOS 6.5以前を実行しているサーバー(これらの手順は、Linuxの他のディストリビューションでも機能する可能性がありますが、ディストリビューションに基づいて若干の変更があります。この記事はCentOS 6.5から機能します)
サーバーをまだお持ちでない場合は、Atlantic.Netから仮想プライベートサーバーを起動することを検討してください
インストールされたiptables
コマンドラインから基本的なIPTablesから始める
まず、iptablesがインストールされ、アクティブになっていることを確認しましょう(これらのコマンドはすべて、root権限が必要です。したがって、ユーザーがこれらの権限にアクセスできることを確認してください。または、必要に応じて、rootに昇格して、すべての前に付ける必要をなくしてください。 'sudo'を使用したコマンド)
sudo service iptables status
service iptables status
この新しいサーバーでは、iptablesが実行されていないため、現在すべてのトラフィックを許可しています。良くありません。それを修正しましょう。
いくつかの基本をカバーするために、すべてのトラフィックをドロップし、特定のトラフィックのみを許可するデフォルトの動作を設定します(これは「ホワイトリスト」と呼ばれることが多いセキュリティ慣行です)。最初にすべてをコマンドラインで実行し、次にそれらのルールが再起動後も保持されるように設定します。
まず、サービスを開始してから、何が実行されているかを確認しましょう。
sudo service iptables start
sudo service iptables status
これらの各チェーンのデフォルトのポリシーは、トラフィックを受け入れることであることに注意してください。トラフィックをドロップするようにINPUTのデフォルトを変更しましょう。 (警告:ssh経由でこのサーバーにリモートアクセスしている場合は、ワークステーションのIPアドレスまたはポート22のいずれかを許可するために、INPUTチェーンに少なくとも1つのACCEPTルールがあることを確認してください。上記のiptablesステータスの出力では、TCPトラフィックがポート22(“ tcp dpt:22”)が受け入れられます。そのルールがない場合は、このサーバーから自分自身をロックアウトする可能性があります!)
sudo iptables -P INPUT DROP
「-P ‘は、ポリシー全体に変更を加えることを示します。‘ INPUT ‘は編集する特定のチェーンであり、‘ DROP ‘はデフォルトのポリシーターゲットです。
それでは、いくつかの特定のルールを追加しましょう。
まず、HTTPおよびHTTPSトラフィックへのアクセスを許可します。これらのトラフィックには、任意のIPアドレスからアクセスできます。 iptablesにルールを追加するときは、それらのルールの順序に注意することが重要です。iptablesはルールを順番に解析し、ルールに示されているターゲットに従ってトラフィックを処理してから、チェーンを終了します(ほとんどの場合)。上記の出力では、最後のルールがトラフィックを拒否することに注意してください。このチェーンの最後に許可ルールを追加すると、そのルールが呼び出されることはありません。その上の拒否ルールはトラフィックを拒否し、INPUTチェーン内の後続のルールの処理を停止するためです。
それでは、新しいルールを挿入する行番号を見つけましょう。
sudo iptables -nL INPUT --line-numbers
Iptablesステータス
「-nL ‘はいくつかのフラグを組み合わせています:‘ n ‘はDNS解決をスキップします(したがって、各ルールがどのIPを検査するかを確認できます)。 ‘ L ‘は、示されたチェーンの各ルールを一覧表示します。最後のオプション、「 –行番号 ‘は、適切に、各ルールエントリに行番号を追加します。 (この出力は、「 sudo service iptables status」で取得できるものと似ています。 ‘ですが、そのコマンドはすべてのチェーンのルールを提供しますが、‘ iptables 上記のコマンドは、個々のチェーンごとに出力の範囲を絞り込む手段を提供します。)
この場合、拒否ルールのすぐ上にルールを挿入します:
sudo iptables -I INPUT 5 -m tcp -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m tcp -p tcp --dport 443 -j ACCEPT
行番号付きのIptablesリスト
これはどういう意味ですか?
*「-私 ‘は、指定された行番号(ルールを挿入するチェーンの名前に続く番号)にこのルールを挿入することを示します。
*‘ -m tcp -p tcp –dport 80 ‘は、このルールが宛先ポート80(2番目のルールの場合は443)で到着するTCPパケットと一致することを指定します。
*‘ -j ACCEPT ‘は、このルールが一致した場合、このパケットをACCEPTターゲットに「ジャンプ」することを示します(これは、通過が許可されていると言う長い道のりです)。
最初のコマンドを入力すると、拒否ルールが行番号6にプッシュダウンされるため、2番目のルールが行番号6に挿入されることに注意してください。
次に、トラフィックやポートの種類に関係なく、特定のIPからのアクセスを許可するルールを追加しましょう。
sudo iptables -I INPUT 4 -s 192.168.0.1 -j ACCEPT
ここでは、4行目のすべてのsshトラフィックを許可するルールのすぐ上にこのルールを挿入しています。「 -s ‘は送信元IPを指定します。 CIDR表記を使用してソースIP範囲を許可することも簡単にできるため、192.168.0.0 / 24範囲全体を許可することができます:
sudo iptables -I INPUT 4 -s 192.168.0.0/24 -j ACCEPT
このルールをより具体的にすることができます。たとえば、その192.168.0.1アドレスからこのサーバーにのみSSH接続できるようにしたい場合です。先に進んでコメントを入れましょう!
sudo iptables -R INPUT 4 -s 192.168.0.1 -m tcp -p tcp --dport 22 -j ACCEPT -m comment --comment "Only home workstation can ssh in"
まず、このルールは以前のルールに置き換わるため、「 -R」に注意してください。 ‘–これは、挿入ではなく、指定された行番号の「置換」を意味します。このルールは、送信元IPと宛先ポートのチェックを組み合わせているため、トラフィックを許可するには、両方を一致させる必要があります。コメントの最終一致オプションはオプションですが、iptablesルールを一覧表示して、そのルールが適用されている理由を簡単に示す場合に非常に役立ちます。これは、iptablesルールがより複雑になる場合、またはルールが存在しない場合に非常に役立ちます。リストされたときにすぐに自明ではありません(以前にコメントを追加したループバックインターフェイス用のものなど)。
この時点で、すべてのIPがssh経由でこのサーバーにアクセスすることを許可するルールを削除できます:
sudo iptables –D INPUT 5
(「 -D ’は、このチェーン内の指定された行番号が削除されることを指定します。)
ルールの追加が完了したら、必ず保存してください:
sudo service iptables save
これにより、現在実行中のiptablesルールが/ etc / sysconfig / iptablesに保存されるため、次にサーバーを再起動したときに、ここに入力するのに費やしたルールが自動的に読み込まれます。より説明的なコメントを使用してiptablesファイルを編集する(または、より大きく、より複雑なファイアウォールルールのセットを管理する)場合は、基本的なIPTablesファイルの構成に関する記事を参照してください。