環境中有使用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後
軟體設定
-
將主機設定為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服務. -
確認 /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
-
設定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 -
修改squid設定檔 /etc/squid/squid.conf .確認下面2行存在
#限定IPv4, 避免LOG有錯誤訊息
http_port 0.0.0.0:3128
http_port 0.0.0.0:3129 tproxy重起squid服務. -
雖然主機為橋接模式, 但為了讓Squid服務可以運作所以仍需給予伺服IP及相關路由, DNS以存取Web. 另外若使用selinux則另需以下設定:
setsebool squid_connect_any=yes
setsebool squid_use_tproxy=yes - 檢查 /var/log/squid/access.log 若有client的瀏覽紀錄表示squid開始運作.