SL Linux 6.0 上安裝 haproxy 通透模式(tproxy) 安裝筆記
除了 HA Proxy 俱備一個 123.123.123.1 (對外的 public ip) , 內部的 Web Server 則是用一個小 Hub 串接為一個 Private LAN , 這樣內部 Server 都與外隔絕了 , 而 HA Proxy 也必須充當 NAT Server , 不然內部的 Web Server 都沒辦法進行更新或 ntp 更新 , 這個架構是一個簡單的網站負載平衡架構 , HA Proxy 會依照設定將流量分別導到 Web Server 1 及 Web Server 2 , 當然也有其他方式可以做到 , 例如 lvs , 但 haproxy 可以做到 L7 的層級 , 雖然效能不能和 lvs 比 , 但也不會慢到那 , 算是一種窮人解決方案
安裝前的準備
- 確定 Haproxy 上有沒有 epel 可以給 yum 用 , 可以參考這篇 http://fedoraproject.org/wiki/EPEL , 去下載 RHEL 6.0 的 rpm 來裝
- 用 yum install haproxy 安裝 haproxy
- 確定一下 haproxy 那台的 iptables service 都要打開
設定方式
要讓 haproxy 以 tproxy 運作通透代理必須設定 ip rule 及 iptables , 從 google 上找到這篇 http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/ , 基本上按照這篇設定 ip rule 及 iptables 是可以動作的 , 但美中不足的是 , 若 Web Server 的 GateWay 都指向 Haproxy 那台 IP , 會發生由 Web Server 本身要抓取自己 url 會等老半天發生錯誤 , 當然也可以透過修改 /etc/hosts 方式解決 , 但總覺得很呆 , 於是又找了一下發現了一招 , 可以由 iptables 設定將特定 sub net 轉成另一組 sub net 來解決 , 於是綜合上述的網址 , ip rule 及 iptables 的設定方法寫成如下
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 111
iptables -t mangle -A DIVERT -j ACCEPT
iptables -A FORWARD -i eth+ -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j NETMAP --to 192.168.10.0/24
ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/eth0/send_redirects
注意一下 , iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j NETMAP --to 192.168.10.0/24 部分比較怪異 , 這是把內網(web server) 的 ip 改成 192.168.10 的區段 , 事實上這個區段必須是不存在的 , 這樣才可以內網WEB SERVER對自己的 URL 存取可正常運作 , 當設定好後 , haproxy 的設定檔部分 , 每個 backend server 的設定要加上 source 0.0.0.0 usesrc clientip 才會使用 transparent 模式 , 下面就列出一個以上面架構圖為主的 haproxy 設定範例
global
# 原本有 user 及 group 要註解掉 , 因為這種設定要用 root 才能跑
# user haproxy
# group haproxy
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
balance roundrobin
frontend frontend_main
bind 123.123.123.1:80
option forwardfor
mode http
# 下一行判斷是否為 crazy. 為開頭的網址
acl crazy_ha hdr_dom(host) -i crazy
# 如果符合 crazy_ha 的 rule , 就使用 backend_crazy 的設定
use_backend backend_crazy if crazy_funuv
# 下一行是預設的 backend 設定
default_backend backend_default
# 這個 backend_crazy 只是為了證明 haproxy L7 的用法
backend backend_crazy
mode http
option forwardfor
source 0.0.0.0 usesrc clientip
cookie SERVERID insert nocache indirect
server server1 192.168.0.11:80 weight 1 cookie server1 check
option redispatch
backend backend_default
mode http
option forwardfor
source 0.0.0.0 usesrc clientip
cookie SERVERID insert nocache indirect
server server1 192.168.0.11:80 weight 1 cookie server1 check
server server1 192.168.0.12:80 weight 1 cookie server1 check
option redispatch
以上設定完後並且執行那 ip rule 及iptables 設定後可能會因為 SSH 連線時也是內網 IP 而斷線 , 因為上面紅字的部分的關係啦 , 斷線後重連就好了, 接著重啟 haproxy 就可以觀察一下 web server 中的 httpd log 是否 ip 都換成了真實來源的 IP , 而內網自己抓自己時則會發現 ip 會變成 192.168.10.xx
完B
