用tproxy+haproxy实现透明代理



haproxy机器准备安装源:

root@ubuntu-haproxy:~# cat /etc/apt/sources.list

deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse

deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse

deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse

deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse

deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse

deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse

deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

root@ubuntu-haproxy:~# apt update

haproxy机器安装依赖

apt install make wget -y

apt-get install build-essential -y

apt-get install libssl-dev -y

apt-get install libpcre++-dev -y

wget http://www.haproxy.org/download/1.8/src/devel/haproxy-1.8-dev1.tar.gz

tar -zxf haproxy-1.8-dev1.tar.gz

cd haproxy-1.8-dev1

make TARGET=linux26 USE_STATIC_PCRE=1 USE_LINUX_TPROXY=1

cp haproxy /usr/bin/haproxy

mkdir -p /etc/haproxy/errors

cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg

mv errorfiles/  /etc/haproxy/errors/

haproxy机器编辑/etc/haproxy/haproxy.cfg

root@ubuntu-haproxy:~#cat /etc/haproxy/haproxy.cfg

global

log 127.0.0.1 local0 info

maxconn 40000

daemon

nbproc 2

stats socket /var/run/haproxy.1 process 1

defaults

log    global

option  dontlognull

option  redispatch

retries 3

maxconn 5000

timeout connect  5s

timeout client  50s

timeout server  50s

timeout tunnel  1h

errorfile 400 /etc/haproxy/errors/400.http

errorfile 403 /etc/haproxy/errors/403.http

errorfile 408 /etc/haproxy/errors/408.http

errorfile 500 /etc/haproxy/errors/500.http

errorfile 502 /etc/haproxy/errors/502.http

errorfile 503 /etc/haproxy/errors/503.http

errorfile 504 /etc/haproxy/errors/504.http

listen lbl-m0hn6a07

bind *:80

mode tcp

option tcplog

maxconn 5000

timeout client 50s

default_backend lbl-m0hn6a07_default

backend lbl-m0hn6a07_default

mode tcp

option tcplog

balance roundrobin

timeout server 50s

timeout check  5000

server lbb-sg5j2sr5 192.168.10.244:80 check inter 10000 fall 2 rise 5 weight 1

source 0.0.0.0 usesrc clientip

haproxy机器执行iptables mark及转发表查找(假设对外的SLB或者说vip  为1.1.1.1)

root@ubuntu-haproxy:~#cat  test.sh

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

ip rule add fwmark 111 lookup 100

ip route add local 0.0.0.0/0 dev lo table 100

ip link show dev dummy || ip link add dummy type dummy

ip link set dev dummy up

ip addr replace 1.1.1.1/32 dev dummy

haproxy开启转发,重定向,及关闭rp_filter

root@ubuntu-haproxy:~#vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.eth0.send_redirects = 0

net.ipv4.conf.lo.send_redirects = 0

net.ipv4.conf.all.rp_filter = 0

net.ipv4.conf.default.rp_filter = 0

net.ipv4.conf.lo.rp_filter = 0

net.ipv4.conf.eth0.rp_filter = 0

net.ipv4.conf.eth1.rp_filter = 0

net.ipv4.conf.eth2.rp_filter = 0

net.ipv4.conf.eth3.rp_filter = 0

执行test.sh及haproxy

root@ubuntu-haproxy:~# sh test.sh

Device "dummy" does not exist.

root@ubuntu-haproxy:~# /usr/bin//haproxy  -d -f /etc/haproxy/haproxy.cfg

Available polling systems :

epoll : pref=300,  test result OK

poll : pref=200,  test result OK

select : pref=150,  test result FAILED

Total: 3 (2 usable), will use epoll.

Available filters :

[SPOE] spoe

[COMP] compression

[TRACE] trace

Using epoll() as the polling mechanism.

后端web机器的安装




web机器的默认路由要指向haproxy

开始测试

测试机器的ip为10.5.39.64,在测试机器上增加一条经haproxy ip到1.1.1.1/32的路由

root@kickseed:~#ip add li eno3

10.5.39.64

root@kickseed:~# ip route add 1.1.1.1/32 via 10.5.39.241

root@kickseed:~# telnet 1.1.1.1  80

Trying 1.1.1.1...

Connected to 1.1.1.1.

Escape character is '^]'.

iptables -t mangle -L -v

tcpdump观察

client连接的是vip 1.1.1.1

root@kickseed:~# tcpdump -i eno3 port 80

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eno3, link-type EN10MB (Ethernet), capture size 262144 bytes

16:30:34.273433 IP 10.5.39.64.33064 > 1.1.1.1.http: Flags [S], seq 1331799978, win 29200, options [mss 1460,sackOK,TS val 256939645 ecr 0,nop,wscale 7], length 0

16:30:34.275458 IP 1.1.1.1.http > 10.5.39.64.33064: Flags [S.], seq 240490277, ack 1331799979, win 28960, options [mss 1460,sackOK,TS val 1676723 ecr 256939645,nop,wscale 7], length 0

16:30:34.275504 IP 10.5.39.64.33064 > 1.1.1.1.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 256939646 ecr 1676723], length 0

16:34:24.765216 IP 1.1.1.1.http > 10.5.39.64.33064: Flags [F.], seq 1, ack 1, win 227, options [nop,nop,TS val 1734345 ecr 256939646], length 0

16:34:24.765293 IP 10.5.39.64.33064 > 1.1.1.1.http: Flags [F.], seq 1, ack 2, win 229, options [nop,nop,TS val 256997268 ecr 1734345], length 0

16:34:24.771567 IP 1.1.1.1.http > 10.5.39.64.33064: Flags [.], ack 2, win 227, options [nop,nop,TS val 1734347 ecr 256997268], length 0

在web机器上看到的source ip确实是client的原生ip,即实现了透明代理(注意是haproxy在发起向后端的web连接时,使用的是非本地的ip,即原生的client ip)




REF:

https://www.kernel.org/doc/Documentation/networking/tproxy.txt

http://blog.csdn.net/dog250/article/details/7518054

https://www.haproxy.org/download/1.8/doc/configuration.txt

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容