使用Squid 3.2 建立Fully Transparent Proxy(TPROXY4.1+)

環境中有使用NLTM驗證 + IIS7.5的應用服務並且會檢查Client端IP位址. 原來的transparent proxy無法通過檢查, 需改成TPROXYv4.1+ (Fully Transparent Proxy), 如此一來伺服器看到Client的IP才不會是Proxy Server的IP.

安裝過程發現Squid 3.2.0的ntlm支援有問題, IE會不段重複跳出要求使用者輸入帳號密碼, 查了論壇發現該版本有bug, 改成3.2.7就解決了.

 

系統:Centos 6.4

軟體:squid-3.2.7,bridge-utils,ebtables,libcap,libecap. Squid網路上都有包好的rpm檔,下載回來裝即可.若自行編譯核心或想自行編譯squid者請參考http://wiki.squid-cache.org/Features/Tproxy4. 其他package使用yum安裝.

網路架構:IPv4,主機為bridge模式接在gateway後

軟體設定

  1. 將主機設定為Bridge.記得先關閉NetworkManager以免設定衝突
    建立 /etc/sysconfig/network-scripts/ifcfg-br0 內容如下

    DEVICE=”br0″
    NM_CONTROLLED=”no”
    TYPE=”Bridge”
    BOOTPROTO=”none”
    IPADDR=”10.0.0.2″
    NETMASK=”255.255.255.0″
    BROADCAST=”10.0.0.255″
    NETWORK=”10.0.0.0″
    ONBOOT=”yes”
    GATEWAY=”10.0.0.1″
    DNS1=10.0.0.3
    DNS2=10.0.0.4
    DOMAIN=mydomain.com

    外部網卡 /etc/sysconfig/network-scripts/ifcfg-eth0 內容如下

    DEVICE=”eth0″
    NM_CONTROLLED=”no”
    ONBOOT=”yes”
    TYPE=”Ethernet”
    BRIDGE=”br0″

    內部網卡 /etc/sysconfig/network-scripts/ifcfg-eth1 內容如下

    DEVICE=”eth1″
    NM_CONTROLLED=”no”
    ONBOOT=”yes”
    TYPE=”Ethernet”
    BRIDGE=”br0″

    設定完成後重新開機或重起network服務.
  2. 確認 /etc/sysctl.conf的相關設定包含下面幾行

    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 01
    net.bridge.bridge-nf-call-iptables = 01
    net.bridge.bridge-nf-call-arptables = 01
    net.ipv4.conf.default.rp_filter = 01
    net.ipv4.conf.all.rp_filter = 01
    net.ipv4.conf.eth0.rp_filter = 01
    net.ipv4.conf.eth1.rp_filter = 01

    執行以下指令使設定生效

    [root@centos6 etc]# sysctl –p

  3. 設定iptables及ebtables規則

    建立執行檔 /usr/local/bin/tproxy.init

    #!/bin/bash
    # IPv4-only
    # 在lo介面上建立代號為100的路由表格給iptables比對fwmark
    ip -f inet rule add fwmark 1 lookup 100
    ip -f inet route add local default dev lo table 100
    # 以下是不需要進入squid的例外規則, 例如本機有提供web服務
    iptables -t mangle -A PREROUTING -d 127.0.0.1 -p tcp –dport 80 -j ACCEPT
    #加入Divert規則將TCP80埠的流量重導到TCP3129
    iptables -t mangle -N DIVERT
    iptables -t mangle -A DIVERT -j MARK –set-mark 1
    iptables -t mangle -A DIVERT -j ACCEPT
    iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
    iptables -t mangle -A PREROUTING -p tcp –dport 80 -j TPROXY –tproxy-mark 0x1/0x1 –on-port 3129
    # 將橋接模式的封包移到路由模式
    ebtables -t broute -A BROUTING -i eth1 -p ipv4 –ip-proto tcp –ip-dport 80 -j redirect –redirect-target DROP
    ebtables -t broute -A BROUTING -i eth0 -p ipv4 –ip-proto tcp –ip-sport 80 -j redirect –redirect-target DROP

    賦予執行權限

    [root@centos6 bin]# chmod 755 tproxy.init

    將上面檔案加入開機程序 /etc/rc.d/rc.local

    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don’t
    # want to do the full Sys V style init stuff.
    touch /var/lock/subsys/local
    /usr/local/bin/tproxy.init

  4. 修改squid設定檔 /etc/squid/squid.conf .確認下面2行存在

    #限定IPv4, 避免LOG有錯誤訊息
    http_port 0.0.0.0:3128
    http_port 0.0.0.0:3129 tproxy

    重起squid服務.

  5. 雖然主機為橋接模式, 但為了讓Squid服務可以運作所以仍需給予伺服IP及相關路由, DNS以存取Web. 另外若使用selinux則另需以下設定:

    setsebool squid_connect_any=yes
    setsebool squid_use_tproxy=yes

  6. 檢查 /var/log/squid/access.log 若有client的瀏覽紀錄表示squid開始運作.