tproxy TPROXY使用介紹

2021-10-13 02:12:39 字數 4043 閱讀 9150

1、tproxy是什麼

你可能聽說過tproxy,它通常配合負載均衡軟體haprxoy或者快取軟體squid使用。

在所有"proxy"型別的應用中都乙個共同的問題,就是後端的目標伺服器上看到的連線的source ip都不再是使用者原始的ip,而是前端的"proxy"伺服器的ip。

拿haproxy舉例來說,假設你有3台後端web伺服器提供服務,前端使用haproxy作為負載均衡裝置。所有使用者的http訪問會先到達haproxy,haproxy作為**,將這些請求按照指定的負載均衡規則分發到後邊的3臺web伺服器上。這個操作本身沒有任何問題,因為haproxy就應該是這麼工作的。但是對於某些對於使用者的訪問ip有限制的敏感應用,問題來了: 後端伺服器上的acl無法限制哪些ip可以訪問,因為在它看來,所有連線的source ip都是haproxy的ip。

這就是為什麼tproxy產生的原因,最早tproxy是作為linux核心的乙個patch,從2.6.28以後tprxoy已經進入官方核心。tprxoy允許你"模仿"使用者的訪問ip,就像負載均衡裝置不存在一樣,當http請求到達後端的web伺服器時,在後端伺服器上用netstat檢視連線的時候,看到連線的source

ip就是使用者的真實ip,而不是haproxy的ip。tproxy名字中的t表示的就是transparent(透明)。

tproxy主要功能如下:

1.重定向一部分經過路由選擇的流量到本地路由程序(類似nat中的redirect)

2.使用非本地ip作為source

ip初始化連線

3.無需iptables參與,在非本地ip上起監聽

如果想要了解tproxy的具體工作原理,請參考作者本人寫的ppt,介紹的比較詳細了:

2、如何編譯tproxy

在2.6.28以後的核心中,tproxy已經是官方核心的一部分了。可以檢視當前核心是否支援tproxy

# grep

"tproxy" config-`uname -r`

config_netfilter_tproxy=m

config_netfilter_xt_target_tproxy=m

如果沒有支援,則需要自己重新編譯核心,但不需要再對核心打patch,只需要在編譯核心時選擇tproxy即可。

networking

support (net [=y])

-> networking

options

-> network packet

filtering framework (netfilter) (netfilter [=y])

-> core netfilter

configuration

transparent proxying support

(experimental)

"tproxy" target support

(experimental) (new)

"socket" match support

(experimental) (new)

然後在編譯haproxy時,選擇tproxy支援即可。

make target=linux26

use_linux_tproxy=1

make install target=linux26

3、如何使用tproxy(配合haproxy)

首選,需要在haproxy的group配置中加入如下一行;

source 0.0.0.0 usrsrc clientip

這行配置告訴haproxy使用使用者的真實ip作為source

ip訪問這個group。

整個的配置看起來會像下邊這樣:

接下來,使用netfilter

mangle表中乙個名為"socket"的match識別出發往本地socket的資料報(通過做一次socket檢查)。

然後我們需要配置iptables規則,給那些發往本地socket的資料報打上mark。

然後新增一條路由規則,告訴核心將這些帶有mark的資料報直接傳送到本地回環位址進行路由處理。

#!/bin/sh

/sbin/iptables -t mangle -n divert

/sbin/iptables -t mangle -a prerouting -p tcp -m socket -j

divert

/sbin/iptables -t mangle -a divert -j mark --set-mark 1

/sbin/iptables -t mangle -a divert -j accept

/sbin/ip rule add fwmark 1 lookup 100

/sbin/ip route add local 0.0.0.0/0 dev lo table 100

4、部署tproxy需要注意的點

在部署tproxy時,最常見的錯誤是遺忘將返回流量通過haproxy。

因為我們"偽裝了"通過haproxy的資料報的source

ip,後端web伺服器看到的就是使用者的ip,那麼web伺服器使用自己的ip返回響應資料報,使用使用者真實ip作為destination

ip。當返回的資料報到達使用者端的時候,使用者看到返回的包的源ip不是自己請求的haproxy的ip,則會認為這個包不是合法的回應而丟棄這個資料報。

要解決這個問題,有兩個辦法:

第乙個辦法是將haproxy配置成網橋模式。

第二個辦法是將haproxy和後端web伺服器放到同一子網中,後端伺服器將自己的預設閘道器指向haproxy,haproxy同時需要承擔nat功能。

在後端伺服器上:

ip route add default via haproxy's_lan_ip

在haproxy上: /sbin/iptables -t nat -a postrouting -s backend's_ip -o

eht0 -j masquerade

5、haproxy上需要配合修改的一些核心引數

# 允許ip**

echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

# 設定鬆散逆向路徑過濾

echo 2 >

/proc/sys/net/ipv4/conf/default/rp_filter

echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter

echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

# 允許icmp重定向

echo 1 >

/proc/sys/net/ipv4/conf/all/send_redirects

echo 1 >

/proc/sys/net/ipv4/conf/eth0/send_redirects

將上邊的配置持久化,寫入/etc/sysctl.conf

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 2

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.eth0.rp_filter = 0

net.ipv4.conf.all.send_redirects = 1net.ipv4.conf.default.send_redirects = 1

參考文件:

iOS description方法的使用介紹

在輸出字串 一些基本資料型別以及 oc 物件,我們都可以使用 nslog 函式進行輸出。本次主要談談使用nslog輸出 oc 物件的應用。一般情況下,我們在使用nslog 和 輸出某個物件時,就會呼叫這個物件的 description 方法,它的返回值就是 nsstring 字串型別,所以 desc...

HiveSQL中row number使用介紹

方式一 select t2.user log acct t2.item sku id t2.time from select from distribute by item sku id sort by user log acct,item sku id,time desc t2 where row...

Mysql點滴 DATE FORMAT使用介紹

基本上每個專案的資料庫的表都要涉及到時間方面,在進行資料統計的時候,會發現很多需要對資料進行統計,當然啦,肯定是基於時間來進行的 這個時候,可以使用mysql 內建的date format函式來進行 mysql點滴 date format date format date,format 根據form...