iptables - IP以外の既存の接続を終了する方法は?

iptables - IP以外の既存の接続を終了する方法は?

2つのiptables構成があります。 2番目のiptablesは15:00に最初のiptablesを置き換えます。最初のiptableは次のとおりです。

#!/bin/bash

/usr/sbin/iptables -F
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -P FORWARD DROP
/usr/sbin/iptables -P OUTPUT ACCEPT

/usr/sbin/iptables -A INPUT -i lo -j ACCEPT
/usr/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

csa=MY_IP_TO_ALLOW

/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 22 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 80 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 443 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -s MY_SECOND_IP --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

2 番目の iptables は #!/bin/bash です。

/usr/sbin/iptables -F
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -P FORWARD DROP
/usr/sbin/iptables -P OUTPUT ACCEPT

/usr/sbin/iptables -A INPUT -i lo -j ACCEPT
/usr/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

/usr/sbin/iptables -A INPUT -p tcp -s MY_SECOND_IP  --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

最初のiptablesから2番目のiptablesに切り替えると、すべてのアクティブ接続が "csa"に格納されているIPで終了することをどのように確認できますか?

私はiptablesの専門家ではありません。これは外部IPを保護する安全な方法ですか? 2番目のiptablesがアクティブになったときに最初のiptablesで許可されたIPからの接続をブロックする正しい方法ですか?

ありがとう

答え1

  1. 使用iptables-restore

    一度に 1 つずつルールを追加すると、ファイアウォールルールが一度に 1 つずつ変更され、ファイアウォールルールセットに潜在的に不要な中間状態が導入されます。対照的に、iptables-saveルールセットはアトミックに保存され、逆にiptables-restoreアトミックに復元されます(少なくとも特定のテーブルでは)。パケットには最初のルールセットまたは2番目のルールセットが表示されますが、中間状態は表示されません。

    動作するルールセットがある場合は、それを再ロードするためにシェルコマンドを使用しないでください。ルールをファイルにダンプしてそのファイルからロードする必要がiptables-saveありiptables-restoreます。このファイルはルール自体の共通構文なので、簡単に編集できます。動的コンポーネント(動的IP、一時IP禁止など)がある場合は、カスタムチェーンやピアの使用など、いくつかのロジックを使用してルールを調整する必要があります。ipsetツールと関連マッチそしてターゲット

  2. 確立された接続は、現在の方法を使用して確立されたままです。

    iptables-restoreステートフル短絡ルールのため、この方法で(または使用して)ルールを切り替えてもアクティブ接続は終了しません。このルールクエリつながるまだアクティブな入り口があり、交通は引き続き許可されます。したがって、新しいルールセットでは現在禁止されていますが、ポート22、80、または443に確立された接続は(十分なトラフィックがある限り)無期限に続行することができます。

    確立されたすべての接続を終了するには、次の作業も必要です(インストール追跡ツールと)以下を実行します。

    conntrack -F
    

    これはフラッシュされます。つながるNEW 状態で返される接続が必要なルックアップテーブルです。ポート 3306 のルールは、確立された接続をブロックされていません。

  3. デフォルトでは、TCPを使用するだけでは十分conntrack -Fではありません。

    すでに確立されているTCP接続には、TCP属性に基づいてそのフローを検証して再生成することを可能にする特別なハンドラがあります。つながるTCP SYN パケットは見えませんが、まだ NEW 状態です。これは次のために発生します。システム制御財産net.netfilter.nf_conntrack_tcp_looseデフォルトは緩いです。

    これを行うには、まだどこかに新しい状態を許可する必要があります。iptablesルールセット。ああ、それはOUTPUTチェーンが許すからです。すべてしたがって、これには新しい状態のフローのパケットが含まれます。したがって、クライアントのパケットは最初に破棄されますが、サーバーで問題が発生した場合単一パケット前のストリームからクライアントへの接続が中断なく再開されます。

    • これを防ぐには、通常、netfilter.nf_conntrack_tcp_loose次のように無効にすることができます。

      sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
      

      ただし、これによりポート3306へのその後の接続も失われますconntrack -F追跡ツール1つのストリームを除いてすべてを削除するのは簡単ではないため、複数を使用するのは簡単なアプローチではありませconntrack -D ... んが、OPの特定のケースには適しています(3つのストリームを削除するだけです)。

      使用。 。 。交換conntrack -F:

      conntrack -D -s $csa -p tcp --dport 22
      conntrack -D -s $csa -p tcp --dport 80
      conntrack -D -s $csa -p tcp --dport 443
      
    • 別のアプローチは、快適なTCP処理を維持しながらステートフルルールを使用して発信パケットを制限することである。

      たとえば(最新バージョンを使用state:conntrack):

      iptables -A OUTPUT -o lo -j ACCEPT
      iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
      iptables -P OUTPUT DROP
      

      -A OUTPUT -p ... --dport ... -m conntrack --ctstate NEW -j ACCEPTこの場合)などの規則を使用して、サーバーに必要な一般サービス(DNS、NTP、Webアクセスなど)に対して明示的な発信トラフィックも有効にする必要があります。


注: RELATED ハンドルを残しました。通常、RELATEDをESTABLISHEDと組み合わせて使用​​するのが最善です。

たとえば、OPのルールはICMPを許可しないため、関連するICMPエラーを有効にするRELATEDルールはありません。パスMTU検索が正しく機能しません。(たとえば、ルートを介してトンネリング中にTCP接続が中断される可能性があります。)人々はまだこのブログを最初に確認する必要があります。iptablesと接続追跡ヘルパーの安全な使用

関連情報