一些背景知識:
(1) HTTP/1.0 協議中,定義了web server 和client使用代理(proxy)時,在HTTP request 和response頭中,使用Via: 標識使用的proxy server,用來防止server loop;
(2) snort 是開放源代碼的IDS(入侵檢測系統),可以用于主機或網絡IDS。具有很多IDS規則,可以對捕捉的(ip,tcp,udp,icmp)包進行模式識別和匹配,并可產生相應記錄。
(3) libnet是開放源代碼的軟件,可以作為網絡協議/包生成器。
(4) TCP/IP網絡是包交換網絡
(5) snort 同時具有使用libnet庫生成IP包的功能,可以通過發出TCP_RESET包,中斷TCP連接。
前提:
(1) snort 運行于路由上(linux)或者通過交換機的port mirror功能,運行在路由的同一網絡段
實施:
(1) compile snort with flexresp(flex response) feature
(2) 定義snort 規則:
alert tcp $HOME_NET any <> $EXTER_NET 80 (msg:"block proxy"; uricontent:"Via:"; resp: rst_all;)
效果:
內部網絡用戶可以正常瀏覽外部網站,如果內部用戶的瀏覽器設置了外部的一個代理后,HTTP REQUEST 頭和RESPONSE頭會包括Via: ...字符,snort規則會捕捉到這個連接,然后向client 和server的socket發送RST包。這樣TCP連接就被終止了。