IPテーブルを使用したURLフィルタリング

IPテーブルを使用したURLフィルタリング

を使用しようとしましたが、Iptables2つのインターフェイスが設定されています。トラフィックはあるインターフェイスから入り、他のインターフェイスから出ます。

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ペイロードを見たいと思います。

おすすめ記事