分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
socket有一个IP_TRANSPARENT选项,其含义就是可以使一个服务器程序侦听所有的IP地址,哪怕不是本机的IP地址,这个特性在实现透明代理服务器时十分有用,而其使用也很简单:
int opt =1;
setsockopt(server_socket,SOL_IP, IP_TRANSPARENT,&opt,sizeof(opt));
因此如果我有一个没有设置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选项。
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选项。