を使用しようとしましたが、Iptables
2つのインターフェイスが設定されています。トラフィックはあるインターフェイスから入り、他のインターフェイスから出ます。
Iptables
私が設定した内容は次のとおりです。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:TCPFILTER - [0:0]
:URLFILTER - [0:0]
#######################
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
#BGP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 179 -j ACCEPT
# Pass traffic to filters which have TCP Flags PSH,ACK and DST Port 80
-A FORWARD -p tcp --tcp-flags PSH,ACK PSH,ACK --dport 80 -j TCPFILTER
-A FORWARD -p tcp --dport 80 -j TCPFILTER
-A FORWARD -j ACCEPT
# Further process only packets with HTTP Get Request
-A TCPFILTER -m string --string "GET /" --algo bm --from 1 --to 70 -j URLFILTER
-A TCPFILTER -j ACCEPT
-A URLFILTER -m string --algo bm --to 500 --string "Host: www.tutorialspoint.com" -p tcp -j REJECT --reject-with tcp-reset
-A URLFILTER -j ACCEPT
COMMIT
受信したパケットに基づくWireshark出力は次のとおりです。
私はそれがうまくいくと信じていますが、次のようにチェーンにヒットすることはありませんURLFILTER
。
# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
7 352 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255
108 6621 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:2002
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:179
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
39 34674 TCPFILTER tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x18/0x18
253 13392 TCPFILTER tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 75 packets, 13141 bytes)
pkts bytes target prot opt in out source destination
Chain TCPFILTER (2 references)
pkts bytes target prot opt in out source destination
0 0 URLFILTER all -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "GET /" ALGO name bm FROM 1 TO 70
292 48066 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain URLFILTER (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 STRING match "Host: www.tutorialspoint.com" ALGO name bm TO 500 reject-with tcp-reset
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
トラフィックは許可され転送されますが、文字列と一致することTCPFILTER
はできません。GET /
どんな助けでも大変感謝します。
ベストアンサー1
これがうまくいかない理由を見つけました。
単一パケットの完全なHTTP要求を調べるためにnetfilterに頼ることはできません。ペイロードは複数のパケットに分散されているため、同じパケットは「GET /」および「Host:*」と一致しません。
次のルールのリストを検討してください。
-A OUTPUT -p tcp -m tcp --dport 80 -j URLFILTER # would be FORWARD in your case
-A URLFILTER -m string --string "Host: www.kernel.org" --algo bm --from 1 --to 500 --icase -j LOG --log-prefix UF_MATCHHOST
-A URLFILTER -m string --string "GET /" --algo bm --from 1 --to 500 --icase -j LOG --log-prefix UF_MATCHGET
www.kernel.orgへのHTTP呼び出しは次のとおりです。
GET / HTTP/1.0
Host: www.kernel.org
2 つのルールが逆の順序で一致し、URLFILTER チェーンが複数のパケットによって渡されたことを証明します。最初のルールはGET文字列を渡し、2番目のルールはホスト文字列を渡します。したがって、追加の操作がなければ、GETとHostの両方を一致させることはできません。
[471493.767020] UF_MATCHGETIN= OUT=enp0s31f6 SRC=192.168.20.204 DST=147.75.205.195 LEN=67 TOS=0x00 PREC=0x00 TTL=64 ID=65494 DF PROTO=TCP SPT=51624 DPT=80 WINDOW=229 RES=0x00 ACK PSH URGP=0
[471499.761216] UF_MATCHHOSTIN= OUT=enp0s31f6 SRC=192.168.20.204 DST=147.75.205.195 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=65495 DF PROTO=TCP SPT=51624 DPT=80 WINDOW=229 RES=0x00 ACK PSH URGP=0
おそらくGET /と一致し、次のパケットと一致するすべての接続を追跡できます。可能だと思います。
Netfilterはこれを行うことができますが、それに最適なツールではありません。
元の答え:
あなたの
-A TCPFILTER -m 文字列 --string "GET/" --algo bm --1 から 70 まで -j URLFILTER
項目が一致しません。文字列を生のHTTPトラフィックと一致させることはできますか? tcpdump -vvを使用してこの文字列を表示できますか?より簡単なマッチを試してみて、動作しているかどうかを確認できますか?
表示されるWireshark出力は、iptablesが見るものではなく、解析されたパケットです。再確認するために、パケットの16進数/ ASCIIペイロードを見たいと思います。