web-dev-qa-db-ja.com

IPv6用のDebian ip6tablesルールのセットアップ

Debian Squeezeでipv6のファイアウォールを設定しています。これはウェブサーバーなので、ipv6で世界に公開する必要がある唯一のポートは80だと思います。

これは私が持っているものです:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:in-new - [0:0]
-P INPUT DROP
-P OUTPUT DROP
-P FORWARD DROP
-A INPUT  -i lo -s ::1/128 -j ACCEPT
-A OUTPUT -o lo -d ::1/128 -j ACCEPT
-A INPUT -s fe80::/10 -j ACCEPT
-A INPUT -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP

-A INPUT -p tcp ! --syn -m state --state NEW -j DROP

-A INPUT -m state --state INVALID -j DROP

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,FIN FIN              -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG              -j DROP

-A INPUT -d ff02::1 -j REJECT

-A INPUT  -p tcp -m state --state ESTABLISHED  -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p udp -m state --state ESTABLISHED  -j ACCEPT
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT

-A INPUT    -p IPv6-icmp -j ACCEPT
-I OUTPUT   -p IPv6-icmp -j ACCEPT
-I FORWARD -p IPv6-icmp -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j ACCEPT
-A INPUT    -j LOG --log-level 4 --log-prefix "IPT_INPUT: "

-A INPUT    -j DROP
-A FORWARD -j LOG --log-level 4 --log-prefix "IPT_FORWARD: "
-A FORWARD -j DROP
-A OUTPUT   -j LOG --log-level 4 --log-prefix "IPT_OUTPUT: "
-A OUTPUT   -j DROP

COMMIT

私はそれをインナーネットのどこかで見つけて少し変更しましたが、私がそれをやり直そうとすると、次のエラーが発生します:

Sudo ip6tables-restore < /etc/ip6tables.firewall.rules
ip6tables-restore: line 47 failed

動作するようにip6tablesを設定する方法はありますか?

ありがとうございました。

6
user1447499

OpenVZおよびipv6テーブルの問題です。代わりにCSFファイアウォールを使用してください。ipv6のファイアウォールを設定しても問題はありません。

1
user1447499

その嫌悪感をどこで手に入れたのかはわかりませんが、最善の方法は、それを削除して最初からやり直すことです。その主な問題は、たとえそれがうまくいくとしても、それが不必要に複雑で追跡するのが難しいことです(そして、私はそれを読んで確信が持てないので、私は確かにそれをテストしません)。

ファイアウォールはできるだけシンプルにする必要があります。必要なものだけを受け入れ、その他はすべて拒否します。これに従えば、複雑で理解しにくいルールは必要ありません。

それでは、実際に動作するIPv6 iptablesファイアウォールを見てみましょう。私はこれを私のライブサーバーの1つから外しました:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

テーブルのデフォルトポリシーをACCEPTに設定します。トラフィックは実際には各テーブル内のルールによってドロップされます。これにより、柔軟性が向上します。特に、発信接続をブロックするつもりがない限り、OUTPUTテーブルは常にデフォルトのポリシーACCEPTに設定する必要があります。

-A INPUT -m rt --rt-type 0 --rt-segsleft 0 -j DROP
-A FORWARD -m rt --rt-type 0 --rt-segsleft 0 -j DROP
-A OUTPUT -m rt --rt-type 0 --rt-segsleft 0 -j DROP

これは IPv6ルーティングヘッダータイプ0のセキュリティ問題 を修正します。他のルールの前に表示されます。 ( 2.6.21.1 以降の最新のカーネルは、このトラフィックを自動的にドロップするため、これらのルールは不要であることに注意してください。以前のカーネルがある場合は、ディストリビューションベンダーに連絡して CVE-2007- 2242 。)RH0の明示的なルールは長年廃止されており、最新のLinuxシステムでは不要になりました。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

これにより、他のルールを通じてすでに受け入れている既存の接続の進行中のトラフィックが受け入れられます。

-A INPUT -p ipv6-icmp -j ACCEPT

すべてのICMPパケットを受け入れます。 IPv4の場合とは異なり、ICMPv6トラフィックをブロックすることはお勧めできません。IPv6はICMPv6に大きく依存しているためです。

-A INPUT -i lo -j ACCEPT

ローカルインターフェースとの間のすべてのトラフィックを受け入れます。

-A INPUT -m state --state NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT

DHCPv6トラフィックを受け入れます。ステートレス自動構成を使用する場合、またはマシンを静的に構成する場合、これは必要ありません。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

これらは、sshおよびhttpの新しい接続を受け入れます。

-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable

ルールの最後では、「ポート到達不能」を使用して、ルールに一致しないすべてのトラフィックを拒否します。これにより、相手側に標準の「接続が拒否されました」というメッセージが表示され、ファイアウォールがあるという事実が事実上隠されます。 nmap などのツールは、すべてのポートが「フィルタリング」されているのではなく「クローズ」されていることを報告し、ファイアウォールがあるかどうかを判断するのがはるかに困難です。

COMMIT

これにより、すべてのテーブルエントリがコミットされます。

25
Michael Hampton

問題なくip6tables-dumpをリロードできました。最初にip6tablesコマンドを使用してファイアウォールを作成し、それをダンプすることをお勧めします。デバッグがはるかに簡単かもしれません。

あなたは白紙の状態から始めることができます-このようなファイアウォール.sh:

#!/bin/bash
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

ip6tables -F

ip6tables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT  -m state --state RELATED,ESTABLISHED -j ACCEPT

注意してください-これはipv6通信を妨げます。うまくいけば、コンソール/帯域外/ ipv4通信チャネルがあります。少なくとも追加しない場合:

ip6tables -A INPUT  -p tcp --dport 22 -j ACCEPT

ファイアウォールスクリプトに満足したら、ip6tables-save> your.rulesを実行できます。

2
pQd

コミットが失敗するという同じ問題がありました。私はDebian Wheezyを使用していますが、問題は同じだと思います。 Debianのベースインストール(少なくとも私が使用しているもの)は、ipv6の接続追跡をサポートしていないようです。これにより、接続状態を追跡しようとする行(-m state...)失敗しますが、残念ながらip6tables-restoreはそれを伝えるほど丁寧ではありません。良いニュースは、これはあまり問題なく解決できることです:

# apt-get install conntrack
# reboot

再起動を回避することは可能だと確信していますが、これを機能させるためにどのサービスを再起動する必要があるかわからないので、すべてを再起動しています。その後、ステートフルな接続追跡を利用する、ここに掲載されているようなルールセットは正常に機能しているように見えます。

1
threeve