私は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番目の方法がより良い解決策を提案することを教えてくれます。
私は過去に両方のテクニックを使用しました。最近、私は2つのハイブリッドに引き寄せられています。
ルールセットに5つまたは6つの単純なルールがある場合は、どちらの方法でも問題ありません。大きなルールセットがあると、物事が面白くなります。大規模なインストール、ファイアウォールボックスでのルーティングなど。
ルールセットをどのようにロードしても、足元で自分を撃つことができることを覚えておいてください。 :)
Bashスクリプト、Perlスクリプト、a Pythonスクリプト—地獄、LISPまたは Befunge プログラムを作成して、誰でも気に入るすべての人のために作成します!スクリプトでは、すべてを作成します必要なNetfilterルール。
利点:
iptables
の呼び出しを使用していました(これは、最初のいくつかのファイアウォール設定がiptables-save
よりも古いことと、Netfilterの影響を受ける可能性がありますが、それは別の話です)欠点:
ルールをルールセットファイルに追加し、iptables-restore
を使用してそれをロードします(またはiptables-save
を使用して既存のルールセットを保存します)。これはDebianがデフォルトで行うことです。
長所:
iptables-restore
はCプログラムであり、シェルスクリプトと比較して美味しく高速です。まともなマシンでも違いは明白ですが、より控えめなハードウェアでは桁速くなります。iptables
テーブルのみを操作するNetfilterツール(filter
を含む)が多すぎるため、他のツールを自由に使用できることを忘れる可能性があります(それらに有害なルールが含まれている可能性があります)。これにより、すべてのテーブルが表示されます。短所:
私はCopious Free Timeでしばらくこれを開発してきました。現在使用しているものと同じスクリプトベースのセットアップを使用する予定ですが、ルールセットが読み込まれると、ルールセットはiptables-save
で保存され、後で使用できるようにキャッシュされます。すべての利点を備えた動的ルールセットを使用できますが、たとえばファイアウォールボックスを再起動すると、非常に迅速にロードできます。
iptables-save
の出力と、その結果としてのiptables-restore
の入力のように見えます。これらは、netfilterファイアウォールの現在の状態を保存および復元するために使用されます(システムの起動時など)。
iptables
コマンドは、netfilterファイアウォールを操作します。単一のルールの追加などのライブファイアウォール構成の単一の変更を行うだけでなく、ルールの変更または削除にも使用できます。
そのため、iptablesを使用して必要な構成を作成し、結果の構成をiptables-saveを使用して保存します。そして、再起動後にその構成の復元を行います。
または、ファイアウォールを作成するために使用したiptablesコマンドをスクリプト化します。-F
スイッチはファイアウォールをクリアし、空白のスレートを作成します。その後、スクリプトにルールを追加すると、iptables-restoreコマンドを使用する代わりに、同様の結果になります。状態。
起動時およびルールのロード時にファイアウォール/ルーターが適切に保護されるように注意深く検討する必要があるという点で、@ zebonautに同意します。私は自分のファイアウォール作成スクリプトを作成することになり、それをテストした後、firewall.workingスクリプトにコピーしました。2つが異なる場合は、cronジョブが実行中のスクリプトを実行します。したがって、ロックアウトされた場合、元に戻すことができます。最初のルールで確立済み/関連するトラフィックが許可されているため、これは非常にまれです。転送と入力用に各インターフェイスに異なるサブチェーンがあるため、デバッグが容易になります。
特定のアクセスを有効/無効にする個別の設定ファイルがあります。設定ファイルはcronによって昼間モードと夜間モードの間で反転され、子供が寝ているときにインターネットから子供をロックします。もちろん、好きなときにいつでもオーバーライドしてロックアウトすることもできます:-)
同じスクリプトがipv4とipv6を処理します。ホスト名を使用する場合は、DNSに依存するのではなく、/ etc/hostsまたは設定ファイルに配置します。これは、DNSが破損するとファイアウォールの構成が破損するためです。