socket的IP TRANSPARENT选项实现代理

socket的IP TRANSPARENT选项实现代理
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                socket有一个IP_TRANSPARENT选项,其含义就是可以使一个服务器程序侦听所有的IP地址,哪怕不是本机的IP地址,这个特性在实现透明代理服务器时十分有用,而其使用也很简单:
int opt =1;
setsockopt(server_socket,SOL_IP, IP_TRANSPARENT,&opt,sizeof(opt));

0.导引:TCP绑定0.0.0.0的情况

TCP可以绑定0.0.0.0,这个都知道,那么到底用哪一个地址何时确定呢?答案是“根据连接源的地址反向做路由查找后确定的”。如果有一个地址A连接该服务器,那么在服务器收到syn后,就会查找目的地址为A的路由,进而确定源地址,然而如果不设置IP_TRANSPARENT选项,则这个被连接的地址必须在local路由表中被找到,否则一切都免谈。
        因此如果我有一个没有设置IP_TRANSPARENT选项的TCP服务器绑定了0.0.0.0这个地址,端口绑定到80,我想这个服务器截获经过此地访问56.56.56.56:80的流量,怎么办?很简单,知道了TCP源地址选择的原理之后,我们只需要设置下面的路由即可:
ip route add local 56.56.56.56 dev lo tab local
这样一来,所有访问56.56.56.56这个地址的流量在经过本机时,都会进入local_in,因为它在local表中找到了路由。但是本机没有56.56.56.56这个地址,本机的80端口服务器回复syn-ack的时候,执行反向路由查找,在local表中找到了56.56.56.56的路由,进而成功返回,最终连接成功在A和56.56.56.56:80之间建立。
        然而思考一下,以上虽然圆满完成了任务,但是如果有N多个目的地址,岂不是要设置N多地址在local路由表?有没有什么办法只设置很少的规则就能截获所有到达80端口的流量呢?有的,那就是在代理服务器的socket上设置IP_TRANSPARENT选项。

1.总体配置

如果你想操作路由查找的过程,还是要使用策略路由。针对上述的需求&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值