web-dev-qa-db-ja.com

iptablesの自動テストを作成するにはどうすればよいですか?

Linuxルーターをiptablesで構成しています。次のようなことを表明する構成の受け入れテストを作成したいと思います。

  • インターネット上の誰かからのトラフィックは転送されず、
  • 企業LAN上のホストからDMZ)のWebサーバーのポート80へのTCPが転送されます。

古代のFAQiptables -Cオプションをほのめかして、「ポートZでXからYへのパケットが与えられた場合、それは受け入れられるか、ドロップされるか」などの質問をすることができます。 FAQはこのように機能することを示唆していますが、iptablesの場合(ただし、例で使用されているようにipchainsではない可能性があります)、-Cオプションはすべてのルールを実行するテストパケットをシミュレートするのではなく、完全に一致するルールの存在をチェックします。これはテストとしての価値がほとんどありません。ルールが存在するだけでなく、望ましい効果があることを主張したいと思います。

さらに多くのテストVMと仮想ネットワークを作成し、nmapなどのツールで効果を調べることを検討しました。ただし、これらすべての追加の仮想マシンを作成するのは複雑であるため、このソリューションは避けています。これは、テストトラフィックを生成するための非常に重い方法です。また、本番環境の実サーバーでも機能する自動テスト方法があれば便利です。

この問題を他にどのように解決できますか?任意のトラフィックを生成またはシミュレートするために使用できるメカニズムがあり、それがiptablesによってドロップまたは受け入れられたかどうか(またはドロップされるかどうか)を知ることができますか?

13
Phil Frost

少しコーディングする準備ができている場合は、次のことを試すことができます。

  • cloneシステムコールにCLONE_NEWNETフラグを使用するか、ip netns addおよびip netns execコマンドを使用して、新しいネットワーク名前空間を作成します。
  • この名前空間では、tunドライバーまたはip link addを使用して一連の仮想ネットワークインターフェイスを作成します。
  • iptables-restoreを使用して構成をロードします
  • tunまたはvethデバイスを介して多数のパケットをルールにフィードします
  • tunまたはvethデバイスから正しいパケットを取得することを確認してください

このアプローチは、転送されたパケットのルールをテストするのに最適です。 iptablesが使用されているマシンとの間の接続には少し手間がかかりますが、この方法でテストすることも可能です。

使用できる一連のコマンドの例を次に示します。

ip netns add test-iptables
ip netns add test-iptables-some-guy-on-the-internet
ip netns add test-iptables-lan-Host

ip netns exec test-iptables ip link add eth0 type veth peer name eth0-peer
ip netns exec test-iptables ip link set eth0-peer netns test-iptables-some-guy-on-the-internet
ip netns exec test-iptables ip link add eth1 type veth peer name eth1-peer
ip netns exec test-iptables ip link set eth1-peer netns test-iptables-lan-Host

ip netns exec test-iptables ifconfig eth0 192.0.2.2 netmask 255.255.255.0
ip netns exec test-iptables ifconfig eth1 203.0.113.1 netmask 255.255.255.0

ip netns exec test-iptables-some-guy-on-the-internet ifconfig eth0-peer 192.0.2.1 netmask 255.255.255.0
ip netns exec test-iptables-some-guy-on-the-internet route add default gateway 192.0.2.2

ip netns exec test-iptables-lan-Host ifconfig eth1-peer 203.0.113.2 netmask 255.255.255.0
ip netns exec test-iptables-lan-Host route add default gateway 203.0.113.1

ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2
ip netns exec test-iptables iptables-restore < /tmp/iptables-test
ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2

ip netns del test-iptables
ip netns del test-iptables-some-guy-on-the-internet
ip netns del test-iptables-lan-Host

これにより、テスト用に3つのネットワーク名前空間が作成され、そのうちの1つに一連のiptablesルールが読み込まれます。他の2つは、インターネット上の誰かとLAN上のホストの役割を果たします。

上記の例では、最初のtelnetコマンドはtest-iptables-lan-Host名前空間からの接続を拒否し、2番目のtelnetコマンドは、ルールセットがパケットをドロップするとタイムアウトになります。

これは、最初のネットワーク名前空間には影響しません。これは、デフォルトですべての本番環境で行われる名前空間です。本番環境からさらに分離する唯一の方法は、別のホスト(物理または仮想)で実行することです。

2
kasperd

専門家の世界は、2社が提供するハードウェア/ソフトウェアの助けを借りてそれを行います。

www.ixiacom.com

www.spirent.com

最初のケースでは、Ixia400Tシャーシ+ Ixloadのようなものを使用できます。

2番目のケースでは、SmartbitsまたはTestcenterラインとそれに対応するアプリケーション

これらのデバイスは、(とりわけ)選択したターゲットサーバーでさまざまな種類の要求を実行する多くのクライアントをエミュレートできます。事前定義された一連の攻撃テストを含むサーバーのセキュリティをテストする準備ができており、いつでも独自のセットを定義できます。また、負荷ストレステストなどの他の多くの機能もあります。

安いオプションではありません。

0
Pat