GNU/Linux >> Linux の 問題 >  >> Linux

Linux IPTables:着信および発信ルールの例 (SSH および HTTP)

以前の IPTables ファイアウォール シリーズの記事では、「iptables -A」を使用してファイアウォール ルールを追加する方法を確認しました。

また、着信 SSH 接続を許可する方法についても説明しました。大まかに言うと、次の 3 つのステップが含まれます。

<オール>
  • 既存のルールをすべて削除します:「iptables -F」
  • 着信 SSH のみを許可:「iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT」
  • 他のすべての着信パケットをドロップします:「iptables -A INPUT -j DROP」
  • 上記の作品。しかし、それは完全ではありません。上記の手順の問題点の 1 つは、発信パケットが制限されないことです。

    デフォルトのチェーン ポリシー

    チェーンのデフォルト ポリシーは ACCEPT です。チェーンの意味がわからない場合は、iptables の紹介記事をお読みください。したがって、INPUT チェーンと OUTPUT チェーンの両方のデフォルト ポリシーは ACCEPT です。上記の 3 つの手順では、すべての着信パケットを最後にドロップしました (着信 ssh を除く)。ただし、発信トラフィックは制限しませんでした。

    以下でわかるように、3 つのチェーン名 (INPUT、OUTPUT、FORWARD) すべての横に「(policy ACCEPT)」と表示されます。これは、デフォルトのチェーン ポリシーが ACCEPT であることを示します。

    # iptables -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
    DROP       all  --  anywhere             anywhere            
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination

    したがって、ここには 2 つの選択肢があります。

    オプション 1:ドロップ ルールを追加する

    最後に、次の 3 つのドロップ ルールを追加します。これらのルールは、すべての着信、発信、および転送パケットをドロップします (これら 3 つのルールの上で定義されたものを除く)。これを行う場合、デフォルトのチェーン ポリシーは引き続き ACCEPT ですが、いずれにしても最後にすべてのパケットをドロップするため、問題にはなりません。

    iptables -A INPUT -j DROP
    iptables -A OUTPUT -j DROP
    iptables -A FORWARD -j DROP

    オプション 2:デフォルトのチェーン ポリシーを DROP に変更する

    最初に、チェーンのデフォルト ポリシーを DROP に変更する次の 3 つのコマンドを実行します。

    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP

    ここで、許可 ssh ルール「iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT」を追加して、iptables -L を実行すると、 3 つのチェーンすべて。

    # iptables -L
    Chain INPUT (policy DROP)
    target     prot opt source               destination
    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
    DROP       all  --  anywhere             anywhere            
    
    Chain FORWARD (policy DROP)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy DROP)
    target     prot opt source               destination

    しかし、ここで問題があります。すべての送信パケットが破棄されるため、ssh 受信接続を許可するルールは機能しなくなります。

    着信接続を許可する

    デフォルト ポリシーが INPUT および OUTPUT チェーンの DROP である場合、受信ファイアウォール ルールごとに、次の 2 つのルールを指定する必要があります。

    <オール>
  • リクエスト ルール:これは、着信接続のためにクライアントからサーバーに送信されるリクエストです。
  • 応答ルール:これは、サーバーからクライアントに送信される応答 (対応する着信要求) 用です。
  • 例 1:着信 SSH 接続を許可する

    これは、外部からサーバーへの SSH 接続を許可するためです。つまり、外部からサーバーに ssh できます。

    これには 2 つの手順が含まれます。まず、着信する新しい SSH 接続を許可する必要があります。着信 ssh 接続が許可されたら、その着信 ssh 接続に対する応答も許可する必要があります。

    まず、以下に示すように、着信 SSH 接続要求を許可します。

    iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    上記の例では:

    • iptables -A INPUT:新しいルールを INPUT チェーンに追加します。着信接続要求の場合、これは常に INPUT である必要があります。
    • -i eth0:これは入力インターフェースを指します。着信接続の場合、これは常に「-i」である必要があります。
    • -p tcp:これが TCP プロトコル用であることを示します。
    • –dport 22:これは、着信接続の宛先ポートを示します。ポート 22 は ssh 用です。
    • -m state:これは、「state」マッチング モジュールが使用されていることを示します。 「-m」オプション (および iptables で使用可能なすべての対応モジュール) については、今後の記事で詳しく説明します。
    • –state 新規、確立済み:「状態」マッチング モジュールのオプション。この例では、NEW および ESTABLISHED 状態のみが許可されます。クライアントからサーバーへの SSH 接続要求が最初に開始されると、NEW 状態が使用されます。 ESTABLISHED 状態は、クライアントからサーバーへの以降のすべてのリクエストに使用されます。

    次に、発信 (ESTABLISHED 状態のみ) SSH 接続応答 (対応する着信 SSH 接続要求) を許可します。

    iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    上記の例では:

    • iptables -A OUTPUT:新しいルールを OUTPUT チェーンに追加します。これは、サーバーから送信される (対応する着信要求に対する) 応答規則のためのものであるため、これは OUTPUT である必要があります。
    • -o eth0:これは、出力インターフェースを参照します。発信接続の場合、これは常に「-o」である必要があります。
    • -p tcp:これが TCP プロトコル用であることを示します。
    • –sport 22:これは、発信接続の送信元ポートを指します。ポート 22 は ssh 用です。 (前のルールからの) 着信要求が「宛先」ポートに到達したため、発信応答は「送信元」ポートを通過します。
    • -m state:これは、「state」マッチング モジュールが使用されていることを示します。
    • –state ESTABLISHED:これは応答ルールであるため、ESTABLISHED 接続のみを許可します (新しい接続は許可しません)。

    例 2:着信 HTTP 接続を許可する

    これは、外部からサーバーへの HTTP 接続を許可するためです。つまり、サーバー上で実行されている Web サイトを外部から表示できます。

    上記の SSH 受信ルールと同様に、これにも 2 つの手順が必要です。まず、受信する新しい HTTP 接続を許可する必要があります。受信 HTTP 接続が許可されたら、その受信 HTTP 接続に対する応答を許可する必要があります。

    まず、以下に示すように、着信 HTTP 接続要求を許可します。

    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

    次に、送信 (確立済みのみ) HTTP 接続応答 (対応する受信 SSH 接続要求) を許可します。

    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

    注:上記の HTTP リクエストとレスポンス ルールでは、ポート番号以外はすべて SSH の例と同じです。

    発信接続を許可する

    デフォルト ポリシーが INPUT および OUTPUT チェーンの DROP である場合、すべての送信ファイアウォール ルールに対して、次の 2 つのルールを指定する必要があります。

    <オール>
  • リクエスト ルール:これは、発信接続のためにサーバーから外部に出て行くリクエストです。
  • 応答規則:外部からサーバーに返される応答 (対応する発信要求) に対するものです。
  • 例 3:発信 SSH 接続を許可する

    これは、サーバーから外部への SSH 接続を許可するためです。つまり、自分のサーバーから外部サーバーに ssh できます。

    これには 2 つの手順が含まれます。まず、発信する新しい SSH 接続を許可する必要があります。送信 ssh 接続が許可されたら、その送信 ssh 接続に対する応答も許可する必要があります。

    まず、以下に示すように、発信 SSH 接続要求を許可します。

    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    上記の例では:

    • iptables -A OUTPUT:新しいルールを OUTPUT チェーンに追加します。発信接続リクエストの場合、これは常に OUTPUT でなければなりません。
    • -o eth0:これは、出力インターフェースを参照します。発信接続の場合、これは常に「-o」である必要があります。
    • -p tcp:これが TCP プロトコル用であることを示します。
    • –dport 22:これは、発信接続の宛先ポートを示します。
    • -m state:これは、「state」マッチング モジュールが使用されていることを示します。
    • –state 新規、確立済み:「状態」マッチング モジュールのオプション。この例では、NEW および ESTABLISHED 状態のみが許可されます。サーバーから外部への SSH 接続要求が開始される 1 回目は、NEW 状態が使用されます。 ESTABLISHED 状態は、サーバーから外部への以降のすべてのリクエストに使用されます。

    次に、発信 (ESTABLISHED のみ) SSH 接続応答 (対応する着信 SSH 接続要求) を許可します。

    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    上記の例では:

    • iptables -A INPUT:新しいルールを INPUT チェーンに追加します。これは、外部からサーバーに来るレスポンス ルール (対応する発信要求) のためのものなので、これは INPUT にする必要があります。
    • -i eth0:これは入力インターフェースを指します。着信接続の場合、これは常に「-i」である必要があります。
    • -p tcp:これが TCP プロトコル用であることを示します。
    • –sport 22:これは、着信接続の送信元ポートを指します。 (前のルールによる) 送信リクエストは「宛先」ポートに送信されたため、受信レスポンスは「送信元」ポートから送信されます。
    • -m state:これは、「state」マッチング モジュールが使用されていることを示します。
    • –state ESTABLISHED:これは応答ルールであるため、ESTABLISHED 接続のみを許可します (新しい接続は許可しません)。

    すべてをまとめる

    次の処理を行う rules.sh シェル スクリプトを作成します。

    <オール>
  • 既存のルールをすべて削除
  • デフォルトのチェーン ポリシーを設定する
  • インバウンド SSH を許可
  • インバウンド HTTP を許可
  • アウトバウンド SSH を許可
  • まず、rules.sh を作成します

    $ vi rules.sh
    # 1. Delete all existing rules
    iptables -F
    
    # 2. Set default chain policies
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    
    # 3. Allow incoming SSH
    iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    
    # 4. Allow incoming HTTP
    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
    
    # 5. Allow outgoing SSH
    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    次に、rules.sh を実行してルールを表示します。

    # chmod u+x rules.sh
    
    # ./rules.sh
    
    # iptables -L
    Chain INPUT (policy DROP)
    target     prot opt source      destination
    ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED
    ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:http state NEW,ESTABLISHED
    ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED 
    
    Chain FORWARD (policy DROP)
    target     prot opt source      destination         
    
    Chain OUTPUT (policy DROP)
    target     prot opt source      destination
    ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED
    ACCEPT     tcp  --  anywhere    anywhere      tcp spt:http state ESTABLISHED
    ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED

    これを基礎として使用すると、独自の着信および発信 iptables ファイアウォール ルールを作成できるはずです。 IPTables でカバーすることは他にもたくさんあります。お楽しみに!

    iptables シリーズの以前の記事:

    • Linux ファイアウォール チュートリアル:IPTables テーブル、チェーン、ルールの基礎
    • IPTables Flush:RedHat および CentOS Linux でのすべてのルールの削除/削除
    • Linux IPTables:ファイアウォール ルールを追加する方法 (Allow SSH の例を使用)

    Linux
    1. 方法:Linux General –一般的なIPTables

    2. Linux IPTables:ファイアウォール ルールを追加する方法 (Allow SSH の例を使用)

    3. 最も頻繁に使用される 25 の Linux IPTables ルールの例

    1. Linux Catコマンド:使用法と例

    2. CentOS / RHEL :iptables を使用して受信ポートと送信ポートをブロックする方法

    3. Linux で送受信の帯域幅と遅延を制限する

    1. Linux Sedコマンド:使用法と例

    2. Linux nice and reniceコマンドチュートリアル(7例)

    3. Linuxコマンド-概要と例