web-dev-qa-db-ja.com

iptables:「スクリプト」の方法ですか、それとも「* filter、rules、COMMIT」の方法ですか?

私はNATとiptablesがどのように機能するかを理解しようとしています。それについて学習する試行錯誤の段階にいる間に、2つのやや矛盾するハウツーが見つかりました。

One howto スクリプトを使用してiptablesルールを次々と呼び出します。スクリプトは、システムの起動時に早期に実行されるように名前が付けられて保存されているようです。問題は、他のスクリプトがその後に呼び出されてその意図を元に戻すことがあるかもしれないことです。バックアップ(00-firewall-old)を使用して元のスクリプト(00-firewall)を保存し、名前を変更したときに、偶然これを行ったとさえ思います。 howtoを構成するスクリプトの例:

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth1 -o eth1 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward

Another howto はスクリプトではなく、いくつかのフィルター規則が定義されているファイルを使用します。次のようになります。

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

Iptablesをセットアップする両方の方法の長所と短所は何ですか?私はすべてに非常に新しいので、背景情報は大歓迎です。たとえば、後者のハウツーから誰がファイルを読み取っているか、またどのように処理されているかはわかりません。私の気持ちは、2番目の方法がより良い解決策を提案することを教えてくれます。

7
zebonaut

私は過去に両方のテクニックを使用しました。最近、私は2つのハイブリッドに引き寄せられています。

ルールセットに5つまたは6つの単純なルールがある場合は、どちらの方法でも問題ありません。大きなルールセットがあると、物事が面白くなります。大規模なインストール、ファイアウォールボックスでのルーティングなど。

ルールセットをどのようにロードしても、足元で自分を撃つことができることを覚えておいてください。 :)

スクリプトベース

Bashスクリプト、Perlスクリプト、a Pythonスクリプト—地獄、LISPまたは Befunge プログラムを作成して、誰でも気に入るすべての人のために作成します!スクリプトでは、すべてを作成します必要なNetfilterルール。

利点:

  • 直接性。ルールを試し、コマンドラインからスクリプトに直接、機能するルールをコピーして貼り付けるだけです。
  • 動的ファイアウォール。私のクライアントの1つは OpenVPN 独自のクライアントのセットアップを実行し、各クライアントはセキュリティ、ファイアウォール、およびアカウンティングの理由でOpenVPNの独自のインスタンスを取得します。 First-of-Defenceファイアウォールは、(IP、port)タプルごとにOpenVPNポートを動的に開く必要があります。そのため、ファイアウォールスクリプトはOpenVPN構成のマニフェストを解析し、必要なホールを動的に突破します。もう1つは、LDAPにWebサーバーの詳細を保存します。 iptablesスクリプトはLDAPサーバーにクエリを送信し、自動的にWebサーバーへの進入を許可します。大規模なインストールでは、これは大きな恩恵です。
  • 賢さ。私のファイアウォールスクリプトは、完全自動の管理がなくてもリモート管理を許可します。ルールセットが読み込まれた後、オペレーターが数分以内に応答しない場合、ルールセットは動作することがわかっている最後のルールセットにロールバックされます。何らかの理由でthatも失敗した場合は、セキュリティを低下させる3番目(および4番目)のフェールバックがあります。
  • より賢い:スクリプトの先頭でネットブロックへのSSHアクセスを開き、スクリプトの最後でそれを取り消すことができます(フィルターされたSSHセッションを許可します)。したがって、スクリプトが失敗しても、そこに入ることができます。
  • オンラインの例。何らかの理由で、私がオンラインで見たほとんどの例はiptablesの呼び出しを使用していました(これは、最初のいくつかのファイアウォール設定がiptables-saveよりも古いことと、Netfilterの影響を受ける可能性がありますが、それは別の話です)

欠点:

  • スクリプトに1つの構文エラーがあり、ファイアウォールからロックアウトされています。上記の賢さの一部は、苦痛な経験にかかっています。 :)
  • 速度。組み込みLinuxボクセンでは、bash(またはダッシュ)スクリプトを実行するのが遅く、遅くなります。十分に遅いため、セキュリティポリシーによっては、ルール追加のorderを検討する必要がある場合があります—防御に一時的な穴がある可能性があり、それで十分です。ルールセットの読み込みは、アトミックに近いnowhereです。
  • 複雑。はい、すばらしいことができますが、スクリプトを複雑にして理解または維持することもできません。

ルールセットベース

ルールをルールセットファイルに追加し、iptables-restoreを使用してそれをロードします(またはiptables-saveを使用して既存のルールセットを保存します)。これはDebianがデフォルトで行うことです。

長所:

  • 速度。 iptables-restoreはCプログラムであり、シェルスクリプトと比較して美味しく高速です。まともなマシンでも違いは明白ですが、より控えめなハードウェアでは速くなります。
  • 規則性。形式は理解しやすく、本質的に自己文書化されています(Netfilterの特性に慣れれば)。
  • それが気になるなら、それは標準ツールです。
  • すべてのNetfilterテーブルを保存します。 iptablesテーブルのみを操作するNetfilterツール(filterを含む)が多すぎるため、他のツールを自由に使用できることを忘れる可能性があります(それらに有害なルールが含まれている可能性があります)。これにより、すべてのテーブルが表示されます。

短所:

  • 柔軟性の欠如。
  • テンプレート化/パラメータ化/動的な機能がないため、繰り返しを行うとルールセットの保守性が低下し、ルールセットのバグが大きくなる可能性があります。あなたはそれらを望んでいません。

ハイブリッドソリューション-両方の長所

私はCopious Free Timeでしばらくこれを開発してきました。現在使用しているものと同じスクリプトベースのセットアップを使用する予定ですが、ルールセットが読み込まれると、ルールセットはiptables-saveで保存され、後で使用できるようにキャッシュされます。すべての利点を備えた動的ルールセットを使用できますが、たとえばファイアウォールボックスを再起動すると、非常に迅速にロードできます。

5
Alexios

iptables-saveの出力と、その結果としてのiptables-restoreの入力のように見えます。これらは、netfilterファイアウォールの現在の状態を保存および復元するために使用されます(システムの起動時など)。

iptablesコマンドは、netfilterファイアウォールを操作します。単一のルールの追加などのライブファイアウォール構成の単一の変更を行うだけでなく、ルールの変更または削除にも使用できます。

そのため、iptablesを使用して必要な構成を作成し、結果の構成をiptables-saveを使用して保存します。そして、再起動後にその構成の復元を行います。

または、ファイアウォールを作成するために使用したiptablesコマンドをスクリプト化します。-Fスイッチはファイアウォールをクリアし、空白のスレートを作成します。その後、スクリプトにルールを追加すると、iptables-restoreコマンドを使用する代わりに、同様の結果になります。状態。

1
HBruijn

起動時およびルールのロード時にファイアウォール/ルーターが適切に保護されるように注意深く検討する必要があるという点で、@ zebonautに同意します。私は自分のファイアウォール作成スクリプトを作成することになり、それをテストした後、firewall.workingスクリプトにコピーしました。2つが異なる場合は、cronジョブが実行中のスクリプトを実行します。したがって、ロックアウトされた場合、元に戻すことができます。最初のルールで確立済み/関連するトラフィックが許可されているため、これは非常にまれです。転送と入力用に各インターフェイスに異なるサブチェーンがあるため、デバッグが容易になります。

特定のアクセスを有効/無効にする個別の設定ファイルがあります。設定ファイルはcronによって昼間モードと夜間モードの間で反転され、子供が寝ているときにインターネットから子供をロックします。もちろん、好きなときにいつでもオーバーライドしてロックアウトすることもできます:-)

同じスクリプトがipv4とipv6を処理します。ホスト名を使用する場合は、DNSに依存するのではなく、/ etc/hostsまたは設定ファイルに配置します。これは、DNSが破損するとファイアウォールの構成が破損するためです。

1
Paul M