天天看點

透明代理和SNAT問題。

一般在做透明代理時,當代理程式在發起到伺服器的連接配接時,不改變客戶機的源IP和源端口,若此時代理機器出口使用了SNAT,則無法建立同伺服器的通信。

原因是:

    在客戶機同代理程式建立連接配接後,在系統的conntrack表中建立了無SNAT的會話。而當代理程式同伺服器再發起連接配接時,需要做SNAT,但是按其五元組對conntrack表查詢時,會找到無SNAT的會話,導緻資料包不走nat表做SNAT政策。

解決方案:

conntrack表有zone的概念,即使相同的五元組可以将其綁定到不同的zone中,使得系統中可以存在相同五元組的會話,通過zone id來區分。

    1、檢視核心編譯選項CONFIG_NF_CONNTRACK_ZONES是否開啟。

    2、設定iptable規則。

            iptables -t raw -A OUTPUT -p tcp --dport 100 -j CT --zone 1

            iptables -t raw -A PRETOUTING -p tcp --sport 100 -j CT --zone 1

          上述兩條規則,分别是對出口且目地端口100和入口且源端口為100的tcp資料包使用zone 1進行會話查找。而客戶機方向則是出口且源端口100和入口且目地端口100,這裡不需要對客戶機的資料包進行iptables配置,可以保證當代理程式使用SO_ORIGINAL_DST屬性擷取真實的伺服器IP時,可以在預設zone中查找到。 

繼續閱讀