補充 BrazilFW 實現 Transparent Proxy 的方法
前言:
-------------------------------------------------
BrazilFW 雖然有 Proxy 的 add-ons
但事實上,沒有一個是派的上用場的
根據 BrazilFW 官方組織的回答:
Tiny-proxy is not a proxy (它不是 proxy,僅是方便阻擋網站)
proxy add-ons 則是 test 當中,僅有看不懂的巴西文
BrazilFW 是一個很棒的軟體路由器
但不支援 Proxy 這點,讓它失色不少
縱然有超強的,無可匹敵的 QoS 和 l7-filter
不過缺少了 proxy
在大環境使用下,會讓頻寬白白浪費掉,且也無法使用 SARG 監控上網
以至於讓它好像上不了大企業環境的檯面
然而,山不轉路轉,路不轉人轉
以 BrazilFW 這個基於 Linux 的 OS 來說,擁有這麼大的自由度
豈有不支援 Transparent Proxy 的道理
方法是有的,只不過要繞一大圈...
此篇補充,演示如何讓 BrazilFW 實現 Transparent Proxy
但有一些條件,必須先說明如下,以免產生誤解:
-------------------------------------------------
1.BrazilFW 本身是沒有 Porxy 功能的,這邊說的 Porxy,是必須有「另一台 Linux squid 主機」。
真正在跑 proxy 的,是那台 Linux squid 主機,BrazilFW 僅是負責重新導向。
2.此篇僅適合 Linux 使用者,至少需懂 iptables 和 iproute2 的作用,才能看的懂以下內容。
BrazilFW 實現 Transparent Proxy 的方法 之 「心得」
-------------------------------------------------------------------
1.
首先,這邊不會說明 squid 如何架設,以及 squid 如何才能支援通透模式 (Transparent)。
這裡是假設您已經架好了這麼一台 squid server 了
若不是的話,請參閱相關 Linux 書籍,或上鳥哥的網站學習 squid。
2.
BrazilFW 實現 Transparent Proxy 的關鍵,在於三點:
一. iptables 給 封包貼標籤
二. iproute2 多重路由,抓出有貼標籤的封包,送到指定路由表,亦即傳回 squid 主機
三. squid 那台主機,要設定 iptables 重新導向
參考資料:(其實這篇已經有完整說明了,只不過是英文的)
http://www.tldp.org/HOWTO/Adv-Routin...ook.squid.html
3.
原裝的 BrazilFW 是沒有 iproute2 的,需加裝 add-ons 外掛
檔名:ip.tgz
下載點:
http://www.brazilfw.com.br/forum/vie...db3503814255ef
※註:事實上原裝的 BrazilFW,是有 ip 這個指令,但它不是 iproute2,它只是嵌入式核心 busybox 提供的一個功能。
安裝 iproute2 外掛後,即可擁有 iproute2 多重路由功能
唯有一點要注意的是:下指令時,必須下 /usr/sbin/ip
如直接下 ip,依照預設 path,會使用到 busybox 的 ip 指令,就會產生錯誤
範例環境:
-------------------------------------
BrazilFW 對內網卡為: eth0,192.168.0.254
squid 主機,連接 BrazilFW 的網卡為:eth0,192.168.0.1
※以下指令
以 BrazilFW# 開頭,代表在 BrazilFW 主機設定
以 squid# 開頭,代表在 squid 主機設定
有些指令太長,為了排版美觀,會以 \ 作分隔
實際上是一行完成
不過要用 \ 分隔,也屬 shell 的合法語法
語法:
BrazilFW# iptables -t mangle -A PREROUTING -i eth0 \
-s ! 192.168.0.1 -p tcp --dport 80 -j MARK --set-mark 2
由對內網卡 eth0 進入,欲路由出去,目標是 tcp 80 的封包
貼上標籤 2
但如果來源是 192.168.0.1 (squid 主機) 則忽略掉,以免產生無窮迴圈路由
(標籤不一定要貼 2,只要是數字即可,但注意不要和 QoS 的標籤衝到)
語法:
BrazilFW# /usr/sbin/ip rule add fwmark 2 table 80
BrazilFW# /usr/sbin/ip route add default via 192.168.0.1 dev eth0 table 80
BrazilFW# /usr/sbin/ip route flush cache
新增多重路由表
1.新增規則,凡貼有 fw (防火牆)標籤 2 的封包,指定使用 table 80 (table 1~253 可自由選擇,不一定要 80)
2.設定 table 80 的預設閘道為 192.168.0.1 (squid 主機),過去的時候,要走 dev eth0
3.清除路由表快取,使新的設定值立刻生效
語法:
BrazilFW# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
BrazilFW# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
BrazilFW# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
設定核心 ipv4 規則
關閉 (set 0) icmp 重新導向功能。
If router and firewall is on the same subnet then firewall should not send out icmp REDIRECT messages.
In this case it is, so icmp REDIRECTs has to be disabled
"假如「連接 internet 的路由器」和「防火牆主機」是在同一個子網路,那麼必須禁止它送出 icmp 重新導向訊息。"
老外的教學文章,是這樣寫的。
在這範例中,路由器和防火牆,都是 BrazilFW ,同一台,,子網路當然相同,所以應該設定關閉吧....
(不太確定,有待高手指教)
語法:
squid# iptables -t nat -A PREROUTING -i eth0 \
-p tcp --dport 80 -j REDIRECT --to-port 3128
路由出去的封包,由 eth0 進入,目標是 tcp 80,重新導向為 prot 3128 (也就是由 squid 接收處理)
這是一般在 Linux 設定 Transparent Proxy 常用的方法
結論:
------------------------------------------------------------
1.已經測試實驗過,確實有效
2.
這個方法,其實適用於任何「Linux 閘道主機」與「squid 主機」分離的環境
只是 BrazilFW 剛好也是 Linux,所以可以用
3. 提供給有需要的朋友參考
書籤