背景
私はDebian 10バスターを使用しています。私の家のIPアドレスからTorリレーの実行を開始しました。完全な専用サーバーは最もエネルギー効率の高い方法ではないかもしれませんが、試してみたいです。ビットコインデーモンの実行を中止してから、使用可能なトラフィックがたくさんあります。つまり、過去の経験では、私たちの問題ではなく、純粋にネットワークの問題があることを知っています。このトピックを扱う姉妹サイト。
研究
今朝私は一人の人に会いました。ServerFaultに対する非常に古い回答、気になったので、これらのルールを適用しました。以下の完全なリストをご覧ください。他の場所で見つけたいくつかのルールを追加しました。単純化して素敵な構造を作りました。
次のルールが現在2019カーネルで測定可能な結果をもたらすことができるかどうかを尋ねたいと思います4.19.0-2-amd64
。
iptables
「IPv4ファイルから - /etc/iptables/rules.v4
:
--append INPUT --proto all --fragment --jump DROP --match comment --comment "all fragmented packets"
--append INPUT --proto all --match state --state INVALID --jump DROP --match comment --comment "all invalid packets"
--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0" --jump DROP --match comment --comment "icmp fragmented packets"
--append INPUT --proto icmp --match length --length 1492:65535 --jump DROP --match comment --comment "icmp oversized unfragmented packets"
--append INPUT --proto tcp ! --syn --match state --state NEW --jump DROP --match comment --comment "new non-syn packets"
--append INPUT --proto tcp --tcp-flags ALL NONE --jump DROP --match comment --comment "NULL scan"
--append INPUT --proto tcp --tcp-flags ALL ALL --jump DROP --match comment --comment "Xmas scan"
--append INPUT --proto tcp --tcp-flags ALL FIN,URG,PSH --jump DROP --match comment --comment "stealth scan"
--append INPUT --proto tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG --jump DROP --match comment --comment "pscan 1"
--append INPUT --proto tcp --tcp-flags SYN,FIN SYN,FIN --jump DROP --match comment --comment "pscan 2"
--append INPUT --proto tcp --tcp-flags FIN,RST FIN,RST --jump DROP --match comment --comment "pscan 3"
--append INPUT --proto tcp --tcp-flags SYN,RST SYN,RST --jump DROP --match comment --comment "SYN-RST scan"
--append INPUT --proto tcp --tcp-flags ACK,URG URG --jump DROP --match comment --comment "URG scans"
--append INPUT --proto tcp --tcp-flags ALL SYN,FIN --jump DROP --match comment --comment "SYN-FIN scan"
--append INPUT --proto tcp --tcp-flags ALL URG,PSH,FIN --jump DROP --match comment --comment "nmap Xmas scan"
--append INPUT --proto tcp --tcp-flags ALL FIN --jump DROP --match comment --comment "FIN scan"
--append INPUT --proto tcp --tcp-flags ALL URG,PSH,SYN,FIN --jump DROP --match comment --comment "nmap-id scan"
これまで、以後0.5日、一部のパケットをキャプチャするためのルール#2と#5のみが表示されます。
2 67 13972 DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 158 81683 DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
後ろに1.25日、まだ1つのTCPルールと無効なルールのみをキャプチャします。
2 178 26785 DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 467 241K DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
後ろに7日、まだ1つのTCPルールと無効なルールのみをキャプチャします。 +通常INPUTチェーンでは、以前は気づかなかった多くのDROPを見ることができます。
Chain INPUT (policy DROP 62772 packets, 17M bytes)
2 3475 355K DROP all -- any any anywhere anywhere state INVALID /* all invalid packets */
5 2459 1324K DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */
質問
他のルールは他の場所や他の場所でフィルタリングされるため、使用されなくなったと見なされますか?
答え1
@roaimaの返信を完了するには本物すべての小さな詳細が必要なので、以下の2つのルールがほとんどの構成で一致しない理由です。
--append INPUT --proto all --fragment --jump DROP
そして
--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0" --jump DROP
--match u32 ! --u32 "0x4&0x3fff=0x0"
MFフラグを含めることができることを除いて、洗練された低レベルの書き込み方法--fragment
です。フラグメントオフセット(+フラグMF)は次のとおりです。IPパケットのオフセット4のu32ワード(0x4
)、最も低いビット部分(&0x3fff
):null以外の値は、フラグメントを所有するもの(またはより多くのフラグメントを宣言するもの)と同じです。
--match state
ただし、(少なくとも)モジュールがロードされるため、nf_conntrack
モジュールが必要ですnf_defrag_ipv4
。このデフラグはPREROUTING
フックで行われます。優先順位-400したがって、フラグメントを見ることができるものは何も許可せず、新しく再組み立てられたパケットのみを見ることができます。最新のカーネルでは、raw
テーブルをより低い優先順位でロードできます。
# modinfo -p iptable_raw
raw_before_defrag:Enable raw table before defrag (bool)
したがって、これらのパケットを見ることは許可されますが、元のテーブルでのみ可能です(明らかにconntrackを使用しません)。
今またなるでしょう本物ip_tables
前の例とは異なり、デフォルトではDebianバスターはどのモジュールも使用しませんiptable_*
。なぜならiptables
、Debianバスターデフォルトで使用 iptables-nft
これはnftablesを介して翻訳されたiptablesですが、まだ時々使用されます。iptables 拡張'xt_*
モジュール。
更新:まだu32
モジュールを使用して動作できますが、nftを介してルールを変更しようとするのをブロックします(たとえば、保存して復元することはできません。シミュレーションは常にチェーンの優先順位-300を選択しますraw/PREROUTING
)。
root@buster-amd64:~# update-alternatives --display iptables|head -3
iptables - auto mode
link best version is /usr/sbin/iptables-nft
link currently points to /usr/sbin/iptables-nft
# iptables -A INPUT -p udp --fragment -j DROP
# iptables -A INPUT -p icmp --match u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -p udp -f -j DROP
-A INPUT -p icmp -m u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# nft --debug=netlink list ruleset -a
ip filter INPUT 4
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000011 ]
[ payload load 2b @ network header + 6 => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x0000ff1f ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ counter pkts 0 bytes 0 ]
[ immediate reg 0 drop ]
ip filter INPUT 5 4
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ match name u32 rev 0 ]
[ counter pkts 4 bytes 4096 ]
[ immediate reg 0 drop ]
table ip filter { # handle 5
chain INPUT { # handle 1
type filter hook input priority 0; policy accept;
meta l4proto udp ip frag-off & 8191 != 0 counter packets 0 bytes 0 drop # handle 4
meta l4proto icmp # u32 ! "0x4&0x3fff=0x0" counter packets 4 bytes 4096 drop # handle 5
}
chain FORWARD { # handle 2
type filter hook forward priority 0; policy accept;
}
chain OUTPUT { # handle 3
type filter hook output priority 0; policy accept;
}
}
ルールハンドル#5の前にコメントがあることに注意してください。u32
うまくいかず、基本では処理できないからですnft
。バイトコードダンプは他の場所に保存されている実際のペイロードチェックを表示しませんが、期待どおりに実行され、実際のフラグメントが受信され削除されるとカウンタが増加します。
答え2
あなたのロゴの組み合わせを提案します(規則6待つ)は、ほぼ常にルール2、によってキャプチャされます--state INVALID
。
私はパブリックサーバー上で非常に厳格なルールセットを実行し、カスタムルールはすぐfail2ban
上にあります。 (私は数時間外出できるストライクを3回実行し、3回のアウトは1ヶ月間の禁止を意味しました。完全にブロックされるのを防ぐためにいくつかのIPアドレスベースの例外がありました。)
rules.v4
これは私のキットです(ライトバージョン)。
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
...
# Exceptions to allow suitably authorised traffic
...
-A INPUT -j LOG --log-level info --log-prefix "firewall: REJECT "
-A INPUT -j REJECT
iptables --line-numbers -nvL INPUT
月初以降の一部の該当パケット数
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 97753 26M f2b-recidive tcp -- * * 0.0.0.0/0 0.0.0.0/0
2 94046 26M f2b-XXXXXXXXXXXX tcp -- * * 0.0.0.0/0 0.0.0.0/0
3 94046 26M f2b-XXXXXXXXXXXX tcp -- * * 0.0.0.0/0 0.0.0.0/0
4 88576 26M f2b-sshd tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 902K 333M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
6 2463M 2399G ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
7 1152 52453 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
...
19 417K 13M ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
20 56921 4276K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "firewall: REJECT "
21 56921 4276K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ご覧のとおり、間違ったデータを含む多くのパケットを受け取りましたが、ほとんどは単純なTCP / IPプローブでした。これらのほとんどはfail2ban
通常ルールを実行します。