透明代理学习
對透明代理,需要使用幾個功能,首先IP_TRANSPARENT,內核2.6.28就已經支持, centos6.3及以上是肯定支持的。
它的作用是,如果某個ip在本機不存在,監聽0.0.0.0一樣可以收到數據,而發送的時候,可以bind任意一個不存在的ip(當然這個bind你使用netstat是看不見的),這樣你就可以偽造任意客戶端的報文。
代碼也很簡單
監聽增加
setsockopt(fd,?SOL_IP,?IP_TRANSPARENT,?&value,?sizeof(value))發送增加
setsockopt(fd,?SOL_IP,?IP_TRANSPARENT,?&value,?sizeof(value)) if(getsockname(?s->client_sock?,?(struct?sockaddr?*)&server_addr,?&addrlen?)?) {http_close_stream(s,"adns_transparent_client");return; }這里獲取真正的服務器地址,寫入server_addr
if?(bind(s->server_sock,?(struct?sockaddr*)&s->client_addr,?addrlen?)?==?-1) {http_close_stream(s,?"adns_transparent_bind"); return; }綁定客戶端地址(雖然本機沒有這個ip)
r?=?connect_nonb(sock,?(struct?sockaddr?*)&server_addr);連接真正的服務器地址。
當然如果想收到報文,還是需要做一些操作的,比如我們收到路由器轉發的80端口的請求。
然后
注意你的服務器的監聽端口改成非80,比如81端口,這樣就能收到數據了。
可是我發現能收到數據,握手成功,但是服務器像真正的源站發送的握手又被交換機給轉發回來了。
因為對于交換機來說,客戶端發的握手和服務器發的握手在ip層面都一模一樣,源地址和目的地址都相同。
這里需要對交換機做一個限制,對于服務器mac地址的包,走默認路由。
如下是路由器配置
10.0.30.100是客戶端
10.0.3.15是服務器
ip?access-list?extended?ppcpermit?tcp?host?10.0.30.100?any?eq?www ip?access-list?extended?ppc-15permit?tcp?any?eq?www?host?10.0.30.100 route-map?ppc-15?permit?10match?ip?address?ppc-15set?ip?next-hop?10.0.3.15 ! route-map?ppc?permit?10match?ip?address?ppcset?ip?next-hop?10.0.3.15 ! route-map?ppc?permit?20 interface?Vlan300ip?address?10.0.30.1?255.255.255.0ip?policy?route-map?ppc interface?GigabitEthernet0/24no?switchportip?address?10.0.0.2?255.255.255.252no?ip?proxy-arpip?policy?route-map?ppc-15轉載于:https://blog.51cto.com/xzq2000/1775434
總結
- 上一篇: JavaEE PO VO BO DTO
- 下一篇: 济南长清104国道科目三考试流程(转载)