OpenBSD PF & 之橋接模式﹝Bridge Mode﹞+ Squid with Transparent proxying

Description:

        前一陣子當我在玩 FreeBSD 時,曾經有嘗試過 Ipfw + Bridge + Transparent proxying + Squid 可惜失敗了,之後因為忙碌就把它擺到一旁,因此就再也沒有碰它了,最近有位網友 Mike 剛好也碰到這樣的問題,他問我是否 Transparent proxying 只能建構於 NAT 架構下,而不能用在單純的 Bridge 模式下?我的答案是當然是不限制只架構於 NAT 下,單純的 Bridge Mode 下也可行,想一想 Squid 都可獨立執行,那麼怎麼可能會受限 NAT  模式下呢?所以我決定再測試一次,不過手邊已經沒 FreeBSD 的機器可測試,因為最近都在玩 OpenBSD 所以就改用 OpenBSD 來測試好了,果然跟我想的是一樣,非 NAT 模式下還是可以跑 Squid with Transparent proxying 。

Environment :


                  WAN                                            ext_if                                   int_if                                                                                              LAN
             88.88.88.0/24                               88.88.88.1                          88.88.88.2                                                                                  88.88.88.0/24
              E1 -------------------------------   fxp0   [ OpenBSD ]   de0    -----   ( 3com Switch 24 port )   -----  [  Computer Group  ]

Setp 1.

Bridge Mode 之設定:

確認 PF 防火牆的基本運做是否都打開:

#vi /etc/rc.conf

PF=YES
#vi /etc/sysctl.conf
net.inet.ip.forwarding=1

開始設定 Bridge Mode,讓兩片網卡通透,並且各自設定一個 IP :

#vi /etc/hostname.fxp0
inet 88.88.88.1 255.255.255.0 NONE   

#vi /etc/hostname.de0

inet 88.88.88.2 255.255.255.255 NONE    #  同一網段內的 IP ,第二片網卡的 IP Mask 不能設 255.255.255.0 要改 255.255.255.255

#vi bridgename.bridge0

add fxp0
add de0
up


Setp 2.

Squid 之設定:

安裝 Squid 我用 pkg_add 安裝 因為  ports 安裝一直出現錯誤所以就改用 pkg_add


#setenv PKG_PATH ftp://openbsd.csie.nctu.edu.tw/pub/OpenBSD/3.5/packages/i386/
#pkg_add ${PKG_PATH}squid-2.5.STABLE5.tgz     #  squid 的主程式
#pkg_add ${PKG_PATH}transproxy-1.4.tgz    #  讓 squid 具備 transparent 能力的套件

設定 #vi /etc/squid.conf  下的的環境


http_port 88.88.88.2:3128      #  這一行很重要一定要將 IP 設為對內 int_if 那片網卡上的 IP
acl our_networks src 88.88.88.0/24
acl msn dstdomain .msn.com
#
http_access deny msn
http_access allow our_networks
#
visible_hostname OBSD.ntut.idv.tw
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

初始化 Squid 環境
#/usr/local/sbin/squid -z
重新讀取載入 Squid 之設定檔#/usr/local/sbin/squid -k reconfigure
設定開機自動啟動 Squid # vi /etc/rc.local

    if [ -x /usr/local/sbin/squid ]; then
        echo -n ' squid';       /usr/local/sbin/squid
    fi

Setp 3.

PF 之設定:

#vi /etc/pf.conf

# macros

ext_if = "fxp0"
int_if = "de0"

# rdr
rdr on $int_if inet proto tcp from any to any port www -> 88.88.88.2 port 3128    #  這行也是要將 IP 設為對內那片網卡 IP

# filter rules
pass in all
pass out all

#pfctl -f /etc/pf.conf
#reboot

參考資料:

http://www.benzedrine.cx/transquid.html