26.2. 防火墙规则集示例

Note

在Suricata 8中,防火墙模式属于实验性功能,后续可能发生变更。

26.2.1. HTTP规则

本示例展示一个简单的HTTP规则集。该规则集在满足以下条件时允许HTTP流量通过:

  • 请求方法为GET或POST

  • User-Agent为"curl"

  • 状态码为200

首先允许TCP 80端口的流量:

accept:hook tcp:all any any <> any 80 (sid:10;)

流追踪功能与默认的异常策略处理相结合,将强制执行完整的TCP握手等流程。

HTTP规则需要为每个状态设置``accept``规则::

# 允许请求行未完成时的流量 accept:hook http1:request_started any any -> any any (sid:100;) # 允许GET方法 accept:hook http1:request_line any any -> any any (

http.method; content:"GET"; sid:101;)

# 或允许POST方法 accept:hook http1:request_line any any -> any any (

http.method; content:"POST"; sid:102;)

# 允许User-Agent为curl accept:hook http1:request_headers any any -> any any (

http.user_agent; content:"curl"; sid:103;)

# 允许请求体(如果存在) accept:hook http1:request_body any any -> any any (sid:104;) # 允许尾部信息(如果存在) accept:hook http1:request_trailer any any -> any any (sid:105;) # 允许请求完成 accept:hook http1:request_complete any any -> any any (sid:106;)

# 允许响应行未完成时的流量 accept:hook http1:response_started any any -> any any (sid:200;) # 允许200状态码 accept:hook http1:response_line any any -> any any (

http.stat_code; content:"200"; sid:201;)

# 允许其他所有状态 accept:hook http1:response_headers any any -> any any (sid:202;) accept:hook http1:response_body any any -> any any (sid:203;) accept:hook http1:response_trailer any any -> any any (sid:204;) accept:hook http1:response_complete any any -> any any (sid:205;)

每个状态都需要对应的``accept``规则。每个状态至少会被评估一次。

26.2.2. TLS SNI与复杂TCP规则

本示例中,``packet_filter``规则将对流量施加更多限制::

# 允许三次握手 accept:hook tcp:all $HOME_NET any -> $EXTERNAL_NET 443 (flags:S;

flow:not_established; flowbits:set,syn; sid:1;)

accept:hook tcp:all $EXTERNAL_NET 443 -> $HOME_NET any (flags:SA;

flow:not_established; flowbits:isset,syn; flowbits:set,synack; sid:2;)

accept:hook tcp:all $HOME_NET any -> $EXTERNAL_NET 443 (flags:A;

flow:not_established; flowbits:isset,synack; flowbits:unset,syn; flowbits:unset,synack; sid:3;)

# 允许已建立的连接 accept:hook tcp:all $HOME_NET any <> $EXTERNAL_NET 443 (flow:established; sid:4;)

然后在TLS层面实现TLS SNI防火墙功能。

同样需要接受所有状态。仅在``client_hello_done``状态会附加额外限制条件::

accept:hook tls:client_in_progress $HOME_NET any -> $EXTERNAL_NET any (sid:100;) # 允许访问指定站点 accept:hook tls:client_hello_done $HOME_NET any -> $EXTERNAL_NET any (tls.sni;

pcre:"/^(suricata.io|oisf.net)$/; sid:101;)

accept:hook tls:client_cert_done $HOME_NET any -> $EXTERNAL_NET any (sid:102;) accept:hook tls:client_handshake_done $HOME_NET any -> $EXTERNAL_NET any (sid:103;) accept:hook tls:client_finished $HOME_NET any -> $EXTERNAL_NET any (sid:104;)

accept:hook tls:server_in_progress $EXTERNAL_NET any -> $HOME_NET any (sid:200;) accept:hook tls:server_hello $EXTERNAL_NET any -> $HOME_NET any (sid:201;) accept:hook tls:server_cert_done $EXTERNAL_NET any -> $HOME_NET any (sid:202;) accept:hook tls:server_hello_done $EXTERNAL_NET any -> $HOME_NET any (sid:203;) accept:hook tls:server_handshake_done $EXTERNAL_NET any -> $HOME_NET any (sid:204;) accept:hook tls:server_finished $EXTERNAL_NET any -> $HOME_NET any (sid:205;)