以前の IPTables ファイアウォール シリーズの記事では、「iptables -A」を使用してファイアウォール ルールを追加する方法を確認しました。
また、着信 SSH 接続を許可する方法についても説明しました。大まかに言うと、次の 3 つのステップが含まれます。
<オール>
上記の作品。しかし、それは完全ではありません。上記の手順の問題点の 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 シェル スクリプトを作成します。
<オール>まず、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 の例を使用)