IPアドレスを変更するときはiptablesのすべてのルールを変更する

IPアドレスを変更するときはiptablesのすべてのルールを変更する

内部ネットワークとの間のトラフィックを許可/拒否するために、iptables を使用するネットワーク ゲートウェイ システムがあります。内部ネットワークiptablesのエンティティの要件 (トラフィックの NAT など) に応じて、 でルールを手動で追加および削除する必要があります。内部ネットワーク上の信頼できるエンティティは、必要に応じてルールの追加と削除を要求できます。最終的には、 およびnatテーブルfilterに、ターゲットPOSTROUTINGを持つルール、ソース IP をゲートウェイ システムの IP に設定するルールSNAT、ゲートウェイの外部 IP アドレスを とする他のテーブルのルールなど、一連のルールが作成されますdst

ゲートウェイシステムのIPをオンザフライで設定できるようにしたいもちろん、これは TCP セッションなどに悪影響を及ぼしますが、ここではその点については触れません。システムは他のメカニズムでこれらの問題を処理します。

問題は、ファイアウォール テーブル内の不明な数のルールが、依然としてこの古い送信元 IP アドレスを参照していることです。

これらすべてのルールを簡単に変更して、古い IP アドレスではなく新しい IP アドレスを使用する方法はありますか?もちろん、あなたが私よりも bash の達人であれば、sed/awk などを使用した凝ったスクリプトも受け付けます...

答え1

SNAT されるトラフィックが常に送信インターフェースの IP アドレスを使用する場合は、-j SNATを に置き換えます-j MASQUERADE。これにより、同じ conntrack ベースの SNAT が使用されますが、置換ソース アドレスが自動的に選択されます。

iptables-saveおよびを使用して iptables ルールを一括編集できますiptables-restore

  • たとえば、ルールセットを対話的に編集するには (特にエディターに優れた検索と置換機能がある場合)、次のようにします。

    iptables-save > /tmp/rules
    vim /tmp/rules
    iptables-restore < /tmp/rules
    

    moreutils の 'vipe' を使用する:

    iptables-save | vipe | iptables-restore
    
  • 1 つの IP アドレスを別の IP アドレスに一括置換するには ( は.正規表現のワイルドカード文字であること、および を使用することで\b「12.34」が誤って「112.34」と一致しないようにすることに注意してください):

    iptables-save | sed 's/\b12\.34\.56\.78\b/12.34.56.99/g' | iptables-restore
    

しかし、私の意見では、どれでもiptablesルールの編集(スクリプトベースの「iptables -A」設定を含む)は悪いアプローチです。代わりに、iptables.rules ファイル(iptables-save 形式) を「ソース」として使用し、常にそのファイルからルールセットをロードします。次に、何らかのマクロ/テンプレート言語を使用して IP アドレスを一度定義し、どこからでも参照できるようになります。これは、Salt/Ansible (まだ使用している人がいる場合) を介して構成ファイルをデプロイするときに行われる方法に似ています。

  • たとえば (実際にはこれを行わないでください。すぐに手に負えない状況に陥ってしまいます)、

    cat /etc/iptables.rules | sed 's/%CUST_IP%/12.34.56.78/g' | iptables-restore
    
  • また、iptables ルールの代替構文を実装する Ferm も検討することをお勧めします。全体的に読みやすくなっていますが、マクロも組み込まれているため、@def $cust_ip一度定義すればどこからでも参照できます。

    domain (ip ip6) {
        @def dns_host4 = 10.10.0.53;
        @def ntp_host4 = 10.10.0.123;
    
        table filter {
            chain FORWARD {
                daddr ($dns_host4 $ntp_host4) accept;
            }
        }
    
        table nat {
            chain PREROUTING {
                proto (tcp udp) dport 53 DNAT to-destination $dns_host4;
                proto udp dport 123 DNAT to-destination $ntp_host4;
            }
        }
    }
    

    これは iptables-restore と同様に機能します。変更をライブで行うのではなく、編集して実行し/etc/ferm.conf、完了したらルールセット全体をリロードしますferm。IP アドレスが変更された場合は、ferm.conf の @def マクロを編集してリロードするだけです。

    (また、最終的に nftables に切り替える場合は、これに慣れておくとよいでしょう。これは Ferm とほぼ同じように動作します。もちろん構文は少し異なりますが、$macros もあり、/etc/nftables.conf を編集してすべてを一度にリロードします。)

答え2

iptables と ipset を組み合わせて使用​​することをお勧めします。

iptablesではルールがありますが、--match-set setname srcを追加します

iptables -I PREROUTING -s whatever ... --match-set setname src
iptables -I PREROUTING -s whatever ... --match-set setname dst

次に、ルールを無効にするには、「setname」という名前のセットから IP アドレスを削除します。ルールを有効にするには、setname に IP アドレスを追加するだけです。

するとiptablesは同じままで、setnameからエントリを追加したり削除したりするだけです。

各ルールには必要に応じて異なる名前が付けられます。

関連情報