SL Linux 6.0 上安裝 haproxy 通透模式(tproxy) 安裝筆記

SL Linux 是 RHEL 6.0 的翻版 , 所以核心是 2.6.32 , 因此這個版本本身就俱備 TProxy 的功能可以做 socket 的通透代理 , 意思就是說 , 在做 Proxy 時 , 傳遞給目標主機時 , 仍然會把來源真實 IP 帶過去 , 目標主機得到的不會是 Proxy Server 的 IP .
好了 , 廢話不說 , 下圖是一個實驗性的 Web Loading Balance 簡單配置架構 , 我將以此架構來做 Haproxy 通透代理

除了 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 比 , 但也不會慢到那 , 算是一種窮人解決方案

安裝前的準備

  1. 確定 Haproxy 上有沒有 epel 可以給 yum 用 , 可以參考這篇 http://fedoraproject.org/wiki/EPEL , 去下載 RHEL 6.0 的 rpm 來裝
  2. 用 yum install haproxy 安裝 haproxy
  3. 確定一下 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

Exit mobile version