高度匿名代理、普通匿名代理和透明
參考URL: https://blog.csdn.net/bytxl/article/details/15334153
從隱藏使用代理用戶(hù)的級別上劃分,代理可以分為三種,即高度匿名代理、普通匿名代理和透明代理.
(1)高度匿名代理不改變客戶(hù)機的請求.這樣在服務(wù)器看來(lái)就像有個(gè)真正的客戶(hù)瀏覽器在訪(fǎng)問(wèn)它,這時(shí)客戶(hù)的真實(shí)IP是隱藏的,服務(wù)器端不會(huì )認為我們使用了代理.
(2)普通匿名代理能隱藏客戶(hù)機的真實(shí)IP,但會(huì )改變我們的請求信息,服務(wù)器端有可能會(huì )認為我們使用了代理.不過(guò)使用此種代理時(shí),雖然被訪(fǎng)問(wèn)的網(wǎng)站不能知道你的ip地址,但仍然可以知道你在使用代理,當然某些能夠偵測ip的網(wǎng)頁(yè)仍然可以查到你的ip.
(3)透明代理,它不但改變了我們的請求信息,還會(huì )傳送真實(shí)的IP地址.
三者隱藏使用代理者身份的級別依次為高度匿名代理最隱蔽,其次是普通匿名代理,最差的是透明代理.
linux tproxy是linux內核支持透明代理的一技術(shù),在linux內核2.6.28版本后, tproxy已經(jīng)成為linux內核的一部分。
tproxy的核心原理, 是承接netfilter(通過(guò)iptables配置)路由過(guò)來(lái)的網(wǎng)絡(luò )包, 然后對網(wǎng)絡(luò )包進(jìn)行處理。處理的結果之一,是將一個(gè)目的地為非本地ip(用戶(hù)ip)的網(wǎng)絡(luò )包, 遞交給本地進(jìn)程(haproxy)進(jìn)行處理,最終由haproxy將該返回包返回到客戶(hù)端。
iptables:tproxy做透明代理
參考URL: https://blog.csdn.net/u011431128/article/details/77481678
如何建立透明代理
本地socket捕獲數據包
nat方式
iptables -t nat -N MY_TCP #在nat表上新建名為MY_TCP自定義鏈
iptables -t nat -p tcp -A MY_TCP -j REDIRECT --to-ports 8081 #將進(jìn)入MY_TCP鏈的數據包端口重定向到8081上
iptables -t nat -N MYNAT #在nat表上新建名為MYNAT自定義鏈
iptables -t nat -A PREROUTING -p tcp -j MYNAT #將MYNAT加入到PREROUTING鏈后
iptables -t nat -A MYNAT -p tcp -m multiport --dports 80 -j MY_TCP #在端口為80時(shí)執行MY_TCP鏈
nat方式在代理機上使用netstat查看,看到的目標地址將是本機socket偵聽(tīng)的地址。而下面的tproxy不會(huì )改變服務(wù)端地址。
tproxy方式
iptables -t mangle -N DIVERT #在nat表上新建名為DIVERT自定義鏈
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT #已建立的socket且被tproxy標記過(guò)的數據包執行DIVERT
iptables -t mangle -A DIVERT -j MARK --set-xmark 0x10000000/0xf0000000 #進(jìn)入DIVERT設置標記
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -N MY_TCP
iptables -t mangle -p tcp -A MY_TCP -j TPROXY --on-port 8081 --tproxy-mark 0x10000000/0xf0000000
#MY_TCP執行TPROXY轉發(fā)為8081端口并進(jìn)行標記
iptables -t mangle -A MY_TCP -j ACCEPT
iptables -t mangle -N MYMANGLE
iptables -t mangle -A PREROUTING -p tcp -j MYMANGLE #MYMANGLE鏈加入到PREROUTING
iptables -t mangle -A MYMANGLE -p tcp -m multiport --dports 80 -j MY_TCP #80端口的包執行MY_TCP
ip rule add fwmark 0x10000000/0xf0000000 table 200 pref 200 #對標記過(guò)的數據包執行序號為200的規則
ip route add local default dev lo table 200 #200規則:數據包發(fā)送到本地回環(huán)
更推薦tproxy做透明代理
注:tproxy對于內核以及iptables版本有一定要求,需要先查閱是否支持
為socket設置IP_TRANSPARENT選項
在設置完iptables規則之后,還須為socket設置IP_TRANSPARENT選項。
設置之后可以bind一個(gè)不屬于本機的IP地址,作為客戶(hù)端,它可以使用一個(gè)不屬于本機地址的IP地址作為源IP發(fā)起連接,作為服務(wù)端,它可以偵聽(tīng)在一個(gè)不屬于本機的IP地址上,而這正是透明代理所必須的。面對真實(shí)的客戶(hù)端,透明代理明知道目標地址不是自己,卻還是要接受連接,對于真實(shí)的服務(wù)器,透明代理明顯不是真實(shí)的客戶(hù)端,卻還要使用真實(shí)客戶(hù)端的地址發(fā)起連接。
setsockopt(fd,SOL_IP, TRANSPARENT,&opt,sizeof(opt));
setsockopt之后,作為代理服務(wù)器bind真實(shí)服務(wù)器addr,作為代理客戶(hù)端bind真實(shí)客戶(hù)端addr。
haproxy透傳用戶(hù)ip-方法和原理
參考URL: https://blog.csdn.net/frockee/article/details/78641188
為了透傳用戶(hù)ip到后端server, proxy機器需要解決兩個(gè)問(wèn)題:
1.在創(chuàng )建到后端server的套接字時(shí), 將用戶(hù)ip作為套接字的源ip,從而讓后端server看到;
2.后端server在回包時(shí), 能夠將目的地為用戶(hù)ip的回包,返回給proxy機器,而proxy機器能夠將該包,從網(wǎng)卡驅動(dòng)(鏈路層)收下來(lái),并正確遞交給應用層的haproxy進(jìn)程
為了解決這兩個(gè)問(wèn)題,haproxy進(jìn)程和所在機器需要做三個(gè)事情:
1.haproxy進(jìn)程在創(chuàng )建到后端server的tcp套接字時(shí),開(kāi)啟IP_TRANSPARENT選項, 并綁定用戶(hù)ip為源ip;
2.后端server修改路由規則,將目的地為用戶(hù)ip的回包,路由給proxy機器;
3.proxy機器在處理回包時(shí), 在ip層, 由TProxy通過(guò)結合netfilter/iptables, 對該回包做一些小動(dòng)作,將該回包的skb->sk = sk(sk為haproxy進(jìn)程創(chuàng )建的對應套接字),從而讓tcp層能夠根據skb->sk, 將該回包遞交給haroxy進(jìn)程進(jìn)行處理,最終返回給客戶(hù)端。
聯(lián)系客服