精华内容
下载资源
问答
  • 透明代理

    千次阅读 2019-03-29 17:42:42
    透明代理(简单代理):透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。 高度...

    概念

    高度匿名代理、普通匿名代理和透明
    参考URL: https://blog.csdn.net/bytxl/article/details/15334153

    从隐藏使用代理用户的级别上划分,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理.
    (1)高度匿名代理不改变客户机的请求.这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理.
    (2)普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理.不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip.
    (3)透明代理,它不但改变了我们的请求信息,还会传送真实的IP地址.
    三者隐藏使用代理者身份的级别依次为高度匿名代理最隐蔽,其次是普通匿名代理,最差的是透明代理.

    linux tproxy简介

    1. linux tproxy是linux内核支持透明代理的一技术,在linux内核2.6.28版本后, tproxy已经成为linux内核的一部分。

    2. tproxy的核心原理, 是承接netfilter(通过iptables配置)路由过来的网络包, 然后对网络包进行处理。处理的结果之一,是将一个目的地为非本地ip(用户ip)的网络包, 递交给本地进程(haproxy)进行处理,最终由haproxy将该返回包返回到客户端。

    iptables:tproxy做透明代理

    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 #将进入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时执行MY_TCP链
      nat方式在代理机上使用netstat查看,看到的目标地址将是本机socket侦听的地址。而下面的tproxy不会改变服务端地址。

    • tproxy方式
      iptables -t mangle -N DIVERT #在nat表上新建名为DIVERT自定义链
      iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT #已建立的socket且被tproxy标记过的数据包执行DIVERT
      iptables -t mangle -A DIVERT -j MARK --set-xmark 0x10000000/0xf0000000 #进入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转发为8081端口并进行标记
      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 #对标记过的数据包执行序号为200的规则
      ip route add local default dev lo table 200 #200规则:数据包发送到本地回环

    更推荐tproxy做透明代理
    注:tproxy对于内核以及iptables版本有一定要求,需要先查阅是否支持

    为socket设置IP_TRANSPARENT选项
    在设置完iptables规则之后,还须为socket设置IP_TRANSPARENT选项。
    设置之后可以bind一个不属于本机的IP地址,作为客户端,它可以使用一个不属于本机地址的IP地址作为源IP发起连接,作为服务端,它可以侦听在一个不属于本机的IP地址上,而这正是透明代理所必须的。面对真实的客户端,透明代理明知道目标地址不是自己,却还是要接受连接,对于真实的服务器,透明代理明显不是真实的客户端,却还要使用真实客户端的地址发起连接。
    setsockopt(fd,SOL_IP, TRANSPARENT,&opt,sizeof(opt));
    setsockopt之后,作为代理服务器bind真实服务器addr,作为代理客户端bind真实客户端addr。

    haproxy透传用户ip-方法和原理

    haproxy透传用户ip-方法和原理
    参考URL: https://blog.csdn.net/frockee/article/details/78641188

    为了透传用户ip到后端server, proxy机器需要解决两个问题:

    1.在创建到后端server的套接字时, 将用户ip作为套接字的源ip,从而让后端server看到;

    2.后端server在回包时, 能够将目的地为用户ip的回包,返回给proxy机器,而proxy机器能够将该包,从网卡驱动(链路层)收下来,并正确递交给应用层的haproxy进程

    为了解决这两个问题,haproxy进程和所在机器需要做三个事情:

    1.haproxy进程在创建到后端server的tcp套接字时,开启IP_TRANSPARENT选项, 并绑定用户ip为源ip;

    2.后端server修改路由规则,将目的地为用户ip的回包,路由给proxy机器;

    3.proxy机器在处理回包时, 在ip层, 由TProxy通过结合netfilter/iptables, 对该回包做一些小动作,将该回包的skb->sk = sk(sk为haproxy进程创建的对应套接字),从而让tcp层能够根据skb->sk, 将该回包递交给haroxy进程进行处理,最终返回给客户端。

    展开全文
  • squid透明代理

    千次阅读 2019-01-27 17:01:35
    透明代理透明代理的提供的功能和传统代理是一致的,但其依赖于默认路由和防火墙的重定向策略,因此更适用于局域网,而不适用于Internet中的客户机。、 案例:在Linux网关上构建Squid为客户机访问Internet提供...

    透明代理:

    透明代理的提供的功能和传统代理是一致的,但其依赖于默认路由和防火墙的重定向策略,因此更适用于局域网,而不适用于Internet中的客户机。

    案例:在Linux网关上构建Squid为客户机访问Internet提供代理服务,在客户机上设置IP地址,默认网关,不需要指定代理服务器的地址,端口等信息
    在这里插入图片描述
    环境
    192.168.80.100 主机名 squid 内网192.168.80.100 外网192.168.90.100 源码安装squid服务
    192.168.80.101 主机名web yum安装http服务 网页根目录创建test1.tgz大小为11M和test2.tgz大小为2M的文件
    192.168.90.101 Win7 局域网段 192.168.90.0/24

    在传统代理的服务基础下
    在这里插入图片描述
    在squid代理服务器上80.100:
    vi /etc/squid.conf //进入squid配置文件中

    http_port 192.168.90.100:3128 transparent //外网地址
    在这里插入图片描述
    yum install -y iptables* 安装iptables防火墙

    iptables -F #清空防火墙规则清空filter表

     iptables -t nat -A PREROUTING -i ens37 -p tcp --dport 80 -s 192.168.90.0/24 -j REDIRECT --to-ports 3128
     将80端口转到3128端口,由透明代理访问网站服务器 
    

    iptables -t nat -L //查看
    在这里插入图片描述
    service iptables save #保存规则

    service iptables start //开启iptables服务

    在测试win7客户端在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    去掉之前的代理
    输入192.168.80.101/test2.tgz
    在这里插入图片描述

    tail /usr/local/squid/var/logs/access.log //在squid中查看日志信息

    tail /var/log/httpd/access_log //在web中查看日志信息
    到此透明代理完成

    展开全文
  • 1、什么是透明代理? 2、透明代理的作用? 2.1 TCP代理服务器可以隐藏背后真正TCP服务器 2.2 保护TCP服务器免受应用层以下级别的协议栈攻击 2.3 TCP转址机 3、socket透明代理的实现原理? 4、在实现TCP代理...

    目录:

    1、什么是透明代理?

    2、透明代理的作用?

    2.1 TCP代理服务器可以隐藏背后真正TCP服务器

    2.2 保护TCP服务器免受应用层以下级别的协议栈攻击

    2.3 TCP转址机

    3、socket透明代理的实现原理?

    4、在实现TCP代理服务器时,遵循以下几点原则

    5、应用背景

    6、关键技术?

    7、如何建立透明代理?

    7.1 Tcp透明代理实现的中心思想

    7.2 搭建环境

    7.3 nat方式(对需要代理的数据包设置iptables规则)

    7.4 本地socket捕获数据包,为socket设置IP_TRANSPARENT选项:

    客户端代码socket_client_tcp.c:

    代理服务器端代码socket_proxy_server_tcp.c:

    服务器端代码socket_server_tcp.c:

    8、 结果显示:

    客户端(请求两次):

    代理服务器端(接受两次):

    服务器端(接受两次):

    9、调试代码时遇到的问题:

    10、参考连接:

    1、什么是透明代理?

    客户端向真实服务器发起连接,代理机冒充服务器与客户端建立连接,并以客户端ip与真实服务器建立连接进行代理转发。因此对于客户端与服务器来说,代理机都是透明的。

    2、透明代理的作用?

    2.1 TCP代理服务器可以隐藏背后真正TCP服务器

    如此便可以起到保护真正TCP服务器的作用。由于TCP代理服务器工作于应用层,所以,黑客对应用层以下级别的协议栈的攻击(比如TCP半连接攻击)就无法穿过TCP代理服务器,这样,即使TCP代理服务器挂了,我们真正的TCP服务器仍然可以正常运行。当然,如果黑客是针对应用层进行攻击的,这时,代理服务器就不起作用的。

    2.2 保护TCP服务器免受应用层以下级别的协议栈攻击

    当黑客攻击应用层以下级别的协议栈,我们可以在真正的TCP服务器前面部署N个代理服务器,并将它们分布于不同的地方,这样,当其中一个代理服务器因为遭遇攻击而挂掉时,受影响的只是连接到这台代理服务器的用户,而其它的代理服务器上的用户仍然是正常被服务的,就像下面这样:

     

    2.3 TCP转址机

    TCP代理服务器还有另外一个重要的作用,就是转址机。比如,我们的机房位于广州,而当北京的用户来访问服务时,网络延迟很大。我们可以在北京的机房部署一台代理服务器,并将该代理服务器与广州服务器之间的网络路由调节到最优。如此,北京的用户就可以通过这台代理服务器来快速地访问我们提供的服务了。对于转址机这项功能而言,有很多现有的软件可以做到,它们通常工作于网络协议层次中的IP层(即网络层),所以它们除了可以做TCP转址外,还可以做UDP的转址。

    3、socket透明代理的实现原理?

    • [需要代理方]向服务器发出请求信息;
    • [代理方]应答;
    • [需要代理方]接到应答后发送向[代理方]发送目的ip和端口;
    • [代理方]与目的连接;
    • [代理方]将[需要代理方]发出的信息传到目的方,将目的方发出的信息传到[需要代理方];
    • 代理完成。

    4、在实现TCP代理服务器时,遵循以下几点原则

    • 当客户端与代理服务器建立TCP连接成功时,代理服务器立即与TCP服务器建立连接,并将它们作为一个连接对管理起来。
    • 当连接对中的任何一个连接断开时,代理服务器都关闭另外一个连接,并释放该连接对所持有的任何资源。
    • 当接收到来自客户端的任何数据时,都原封不动地转发给TCP服务器;当接收到来自TCP服务器的任何数据时,都原封不动地转发给对应的客户端。
    • 通过客户端的端点地址IPEndPoint来识别不同的连接对。

    5、应用背景

    linux下tcp层透明代理简单实现, 在此基础上可以实现http层的透明代理以及,一切以tcp承载的协议的透明代理

    6、关键技术?

    c/c++技术,使用IP_TRANSPARENT的使用, 如何用非本地的ip地址与服务器建立连接, 如何收取非本服务器的数据

    7、如何建立透明代理?

    7.1 Tcp透明代理实现的中心思想

    对于网络数据的转发可以使用Linux的iptables命令进行设置;

    在路由器上【准确的说应该是在代理服务的的路由表上】使用iptables设置过转发规则后,路由器可以将收到的client程序的tcp数据转发给特定端口号,代理程序可在该端口号上使用tcp socket进行监听,获取连接后即可像普通socket程序一样进行与client端进行通讯;

    代理程序与server端连接时,需要获取到server端的ip地址与端口号,该信息可以通过getsockopt的方式获取

    getsockopt (clifd, SOL_IP, SO_ORIGINAL_DST, &orig_addr, &sin_size);

    SO_ORIGINAL_DST是一个socket参数(SOL_IP层的),使用时需要包含

    #include<linux/netfilter_ipv4.h>头文件。

    如果成功orig_addr将是客户真正需要去的方向

    之后代理程序可以将client的tcp转发server端,然后再将server端的数据转发给client端,即可实现透明代理

     

    换种方式说明:

     Linux下面使用netfilter(iptables)可以很容易的实现一个TCP透明代理,

     使用iptables的REDIRECT选项无需编写内核模块就可以把连接重定向到本地代理进程。

     然后代理进程accept到连接时通过SO_ORIGINAL_DST这个socket选项就可以得到原始目的地址,

     非常方便。

     不过这只是对TCP而言的,对应UDP而言,还是需要编写一个内核模块,自己做一些处理。

     对于UDP,可以用nf_register_hook注册一个Hook,然后保存socket目的地址。

     另外注册一个字符设备,在字符设备的IOCTL处理函数中把socket的原始目的地址发送给代理进程。

    7.2 搭建环境

    Linux开启路由转发功能(透明代理环境搭建)

     

    ip地址

    网关

    监听的端口

    备注

    客户端

    192.168.2.230

    192.168.2.56

    23

    客户端与服务器端不是一个网段

    代理服务器

    eth0:192.168.1.56

    192.168.1.255

    2223

    eth1 192.168.2.56

    192.168.2.255

    服务器

    192.1681.230

    192.168.1.56

    23

    7.3 nat方式(对需要代理的数据包设置iptables规则)

    1043 iptables -t nat -nvL #查看nat链

    1044 iptables -t nat -N MY_TCP #在nat表上新建名为MY_TCP自定义链 

    1045 iptables -t nat -nvL #查看nat链

    1046 iptables -t nat -A PREROUTING -j MY_TCP  #将MY_TCP加入到PREROUTING链后 

    1047 iptables -t nat -nvL #查看nat链

    1048 iptables -t nat -A MY_TCP -p tcp -d 192.168.1.230 -j REDIRECT --to-ports 23  #在端口为80, 目的地址是192.168.1.230时执行MY_TCP链 

    [root@localhost tool]# iptables -N MY_TCP   #在filter表上新建名为MY_TCP自定义链 

    [root @localhost tool]# iptables -A INPUT -j MY_TCP #把MY_TCP加入到INPUT链

    [root@localhost tool]# iptables -A MY_TCP -p tcp --dport 2223 -j ACCEPT #在端口为2223时执行MY_TCP链 

    7.4 本地socket捕获数据包,为socket设置IP_TRANSPARENT选项:

    在设置完iptables规则之后,还须为socket设置IP_TRANSPARENT选项。

    设置之后可以bind一个不属于本机的IP地址,作为客户端,它可以使用一个不属于本机地址的IP地址作为源IP发起连接,作为服务端,它可以侦听在一个不属于本机的IP地址上,而这正是透明代理所必须的。面对真实的客户端,透明代理明知道目标地址不是自己,却还是要接受连接,对于真实的服务器,透明代理明显不是真实的客户端,却还要使用真实客户端的地址发起连接。

    setsockopt(fd,SOL_IP, TRANSPARENT,&opt,sizeof(opt));

    setsockopt之后,作为代理服务器bind真实服务器addr,作为代理客户端bind真实客户端addr。

     

    客户端代码socket_client_tcp.c:

    #include <stdio.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    
    #define PORT 23			//目标地址端口号
    #define ADDR "192.168.1.230" //目标地址IP
    
    int main()
    {
    	int iSocketFD = 0; //socket句柄
    	unsigned int iRemoteAddr = 0;
    	struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息,服务器端地址
    	socklen_t socklen = 0;  	
    	char buf[4096] = {0}; //存储接收到的数据
    
    	iSocketFD = socket(AF_INET, SOCK_STREAM, 0); // 建立客户端socket
    	if(0 > iSocketFD)
    	{
    		printf("创建socket失败!\n");
    		return 0;
    	}	
    
    	//定义要连接的代理服务器端地址
    	stRemoteAddr.sin_family = AF_INET;
    	stRemoteAddr.sin_port = htons(PORT);
    	inet_pton(AF_INET, ADDR, &iRemoteAddr);
    	stRemoteAddr.sin_addr.s_addr=iRemoteAddr;
    	
    	//连接到代理服务器:连接方法: 传入句柄,目标地址,和大小
    	if(0 > connect(iSocketFD, (void *)&stRemoteAddr, sizeof(stRemoteAddr)))
    	{
    		printf("连接失败!\n");
    		//printf("connect failed:%d",errno);//失败时也可打印errno
    	}else{
    		printf("连接成功!\n");
    		//向代理服务器发送数据
    		send(iSocketFD, "客户端-客户端-客户端", strlen("客户端-客户端-客户端"), 0);
    		//从代理服务器接收数据
    		recv(iSocketFD, buf, sizeof(buf), 0); 将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。 
    		printf("Received:%s\n", buf);
    	}
    	
    	close(iSocketFD);//关闭socket	
    	return 0;
    }
    

    代理服务器端代码socket_proxy_server_tcp.c:

    #include <stdio.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <linux/netfilter_ipv4.h>
    #define PORT 2223		//端口号
    #define BACKLOG 5	//最大监听数
    
    int main()
    {
    	int iSocketFD = 0;  //socket句柄
    	int iRecvLen = 0;   //接收成功后的返回值
    	int new_fd = 0; 	//建立连接后的句柄
    	char buf[4096] = {0}; //
    	int n = 0;
    	int ret = 0;
    	struct sockaddr_in stLocalAddr = {0}; //本地地址信息结构图,下面有具体的属性赋值
    	struct sockaddr_in stRemoteAddr = {0}; //对方地址信息
    	socklen_t socklen = 0;  
    
    	iSocketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
    	if(0 > iSocketFD)
    	{
    		printf("创建socket失败!\n");
    		return 0;
    	}	
    
    	stLocalAddr.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
    	stLocalAddr.sin_port = htons(PORT); /*端口号*/
    	stLocalAddr.sin_addr.s_addr=htonl(INADDR_ANY); /*IP,括号内容表示本机IP*/
    
    	//绑定地址结构体和socket
    	if(0 > bind(iSocketFD, (void *)&stLocalAddr, sizeof(stLocalAddr)))
    	{
    		printf("绑定失败!\n");
    		return 0;
    	}
    
    	//开启监听 ,第二个参数是最大监听数
    	if(0 > listen(iSocketFD, BACKLOG))
    	{
    		printf("监听失败!\n");
    		return 0;
    	}
    
    	printf("iSocketFD: %d\n", iSocketFD);	
    	//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小
    	while(1)
    	{
    		new_fd = accept(iSocketFD, (void *)&stRemoteAddr, &socklen);
    		printf("new_fd: %d\n", new_fd);	
    		if(0 > new_fd)
    		{
    			printf("接收失败!\n");
    			return 0;
    		}else{
    			printf("接收成功!\n");
    			n = sizeof(struct sockaddr_in);
    			ret = getsockopt(new_fd, SOL_IP, SO_ORIGINAL_DST, &stRemoteAddr, &n);
    			if(0 != ret)
    			{
    				printf ("error getting original destination address.\n");
    				close (new_fd);
    				return -1;
    			}
    			stRemoteAddr.sin_family = AF_INET; 
    			printf("original destination address %u:%hu\n", ntohl(stRemoteAddr.sin_addr.s_addr), ntohs(stRemoteAddr.sin_port));	
    			//发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可) 
    			recv(new_fd, buf, sizeof(buf), 0);
    			printf("从客户端上接收到的信息是:%s\n", buf);
    			//send(new_fd, "这是代理服务器接收成功后发回的信息!", sizeof("这是代理服务器接收成功后发回的信息!"), 0);
    
    			/* 连接服务器*/
    			int iSockClientFD = 0;
    			iSockClientFD = socket(AF_INET, SOCK_STREAM, 0);
    			if(0 > iSockClientFD)					
    			{
    				printf("代理向服务器建立连接失败!\n");
    				return 0;
    			}
    			if(0 > connect(iSockClientFD, (void *)&stRemoteAddr, sizeof(stRemoteAddr)))
    			{
    				printf("代理向服务器建立连接失败!\n");
    				return 0;
    			}
    			send(iSockClientFD, buf, sizeof(buf), 0);//向服务器发送消息
    			recv(iSockClientFD, buf, sizeof(buf), 0);//接收来自服务器的消息
    			printf("从服务器端收到的消息:%s\n", buf);//打印接收到的来自服务器的消息
    			send(new_fd, buf, sizeof(buf), 0);//向客户端发送消息		
    			sleep(5);	
    		}
    	}
    	close(new_fd);
    	close(iSocketFD);
    
    	return 0;
    }

    服务器端代码socket_server_tcp.c:

    #include <stdio.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    
    #define PORT 23		//端口号
    #define BACKLOG 5	//最大监听数
    
    int main()
    {
    	int iSocketFD = 0;  //socket句柄
    	int iRecvLen = 0;   //接收成功后的返回值
    	int new_fd = 0; 	//建立连接后的句柄
    	char buf[4096] = {0}; 
    	struct sockaddr_in stLocalAddr = {0}; //本地地址信息结构图,下面有具体的属性赋值
    	struct sockaddr_in stRemoteAddr = {0}; //对方地址信息
    	socklen_t socklen = 0;  	
    
    	iSocketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
    	if(0 > iSocketFD)
    	{
    		printf("创建socket失败!\n");
    		return 0;
    	}	
    
    	stLocalAddr.sin_family = AF_INET;  /*该属性表示接收本机或其他机器传输*/
    	stLocalAddr.sin_port = htons(PORT); /*绑定端口号*/
    	stLocalAddr.sin_addr.s_addr=htonl(INADDR_ANY); /*IP,INADDR_IP表示任何IP地址*/
    
    	//绑定地址结构体和socket
    	if(0 > bind(iSocketFD, (void *)&stLocalAddr, sizeof(stLocalAddr)))
    	{
    		printf("绑定失败!\n");
    		return 0;
    	}
    
    	//开启监听 ,第二个参数是最大监听数
    	if(0 > listen(iSocketFD, BACKLOG))
    	{
    		printf("监听失败!\n");
    		return 0;
    	}
    
    	printf("iSocketFD: %d\n", iSocketFD);	
    	//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小 
    	//会阻塞进程,直到有客户端连接上来为止
    	while(1){
    		new_fd = accept(iSocketFD, (void *)&stRemoteAddr, &socklen);
    		if(0 > new_fd)
    		{
    			printf("接收失败!\n");
    			return 0;
    		}else{
    			printf("接收成功!\n");
    			//发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可) 
    			//send(new_fd, "这是服务器接收成功后发回的信息!", sizeof("这是服务器接收成功后发回的信息!"), 0);
    		}
    
    		printf("new_fd: %d\n", new_fd);	
    		iRecvLen = recv(new_fd, buf, sizeof(buf), 0);	
    		if(0 >= iRecvLen)    //对端关闭连接 返回0
    		{	
    			printf("接收失败或者对端关闭连接!\n");
    		}else{
    			//接收并打印代理服务器传过来的数据
    			printf("从客户端接收到的消息: %s\n", buf);
    		}
    
    		//向代理服务器发送数据
    		send(new_fd, "服务器-服务器-服务器" , strlen("服务器-服务器-服务器"), 0);
    	}
    	sleep(5);
    
    	close(new_fd);
    	close(iSocketFD);
    
    	return 0;
    }
    

    8、 结果显示:

    客户端(请求两次):

    [root@localhost 桌面]# ./socket_client_tcp
    
    连接成功!
    
    Received:服务器-服务器-服务器
    
    [root@localhost 桌面]# ./socket_client_tcp
    
    连接成功!
    
    Received:服务器-服务器-服务器

    代理服务器端(接受两次):

    [root@localhost 桌面]# ./socket_proxy_server_tcp.c
    
    iSocketFD: 3
    
    new_fd: 4
    
    接收成功!
    
    original destination address 3232236006:23
    
    从客户端上接收到的信息是:客户端-客户端-客户端
    
    从服务器端收到的消息:服务器-服务器-服务器
    
    
    
    new_fd: 6
    
    接收成功!
    
    original destination address 3232236006:23
    
    从客户端上接收到的信息是:客户端-客户端-客户端
    
    从服务器端收到的消息:服务器-服务器-服务器
    
    

    服务器端(接受两次):

    [root@localhost 桌面]# ./socket_server_tcp.c
    
    iSocketFD: 3
    
    接收成功!
    
    new_fd: 4
    
    从客户端接收到的消息: 客户端-客户端-客户端
    
    
    
    接收成功!
    
    new_fd: 5
    
    从客户端接收到的消息: 客户端-客户端-客户端

    9、调试代码时遇到的问题:

    [root@localhost tool]# make socket_server_tcp

    cc socket_server_tcp.c -o socket_server_tcp

    socket_server_tcp.c: 在函数‘main’中:

    socket_server_tcp.c:63:41: 错误:‘SO_ORIGINAL_DST’未声明(在此函数内第一次使用)

    ret = getsockopt(new_fd, IPPROTO_TCP, SO_ORIGINAL_DST, &stRemoteAddr, &n);

    ^

    socket_server_tcp.c:63:41: 附注:每个未声明的标识符在其出现的函数内只报告一次

    解决连接:

    https://www.jianshu.com/p/bb540ef76c38

    透明代理的原理如下:
    假设A为内部网络客户机,B为外部网络服务器,C为防火墙。当A对B有连接请求时,TCP连接请求被防火墙截取并加以监控。截取后当发现连接需要使用代理服务器时,A和C之间首先建立连接,然后防火墙建立相应的代理服务通道与目标B建立连接,由此通过代理服务器建立A 和目标地址B的数据传输途径。从用户的角度看,A和B的连接是直接的,而实际上A 是通过代理服务器C和B建立连接的。反之,当B对A有连接请求时原理相同。由于这些连接过程是自动的,不需要客户端手工配置代理服务器,甚至用户根本不知道代理服务器的存在,因而对用户来说是透明的。

    以上为百度百科的解释,此处防火墙也可以为路由器,路由器可以截获通过的网络数据,而将其转发到代理服务

    对于网络数据的转发可以使用Linux的iptables命令进行设置
    在路由器上使用iptables设置过转发规则后,路由器可以将收到的client程序的tcp数据转发给特定端口号,代理程序可在该端口号上使用tcp socket进行监听,获取连接后即可像普通socket程序一样进行与client端进行通讯;
    代理程序与server端连接时,需要获取到server端的ip地址与端口号,该信息可以通过getsockopt的方式获取

    getsockopt (clifd, SOL_IP, SO_ORIGINAL_DST, &orig_addr, &sin_size);
    

    SO_ORIGINAL_DST是一个socket参数(SOL_IP层的),使用时需要包含#include <linux/netfilter_ipv4.h>头文件。
    如果成功orig_addr将是客户真正需要去的方向

    之后代理程序可以将client的tcp转发server端,然后再将server端的数据转发给client端,即可实现透明代理

    小礼物



    作者:mayudong1
    链接:https://www.jianshu.com/p/bb540ef76c38
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    解决方式:

    增加头文件。使用时需要包含#include <linux/netfilter_ipv4.h>头文件。

     

    10、参考连接:

    https://blog.csdn.net/u011431128/article/details/77481678

    https://blog.csdn.net/zhuweisky/article/details/25787787

    https://www.jianshu.com/p/bb540ef76c38

    https://www.cnblogs.com/zhangdongsheng/p/3425929.html

    http://www.codeforge.cn/article/256149?go_blog_box=1

    https://blog.csdn.net/someonea/article/details/5864946

    https://blog.lilydjwg.me/2018/7/16/transparent-proxy-for-tcp-and-udp-with-iptables.213139.html

    【书籍】https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#DNATTARGET

     

    展开全文
  • 透明代理和反向代理

    千次阅读 2015-10-27 10:15:16
    透明代理和反向代理 传统网络: 透明代理:   实现机制:划分Vlan 反向代理: 实现机制: 配置DNS解析以及WAF中配置防护Web服务器的NAT   SDN环境下: 透明代理和反向代
    

    透明代理和反向代理

    1. 传统网络:

      透明代理:


                                                     

      实现机制:划分Vlan

      反向代理:


    实现机制:

    配置DNS解析以及WAF中配置防护Web服务器的NAT

     

    1. SDN环境下:

      透明代理和反向代理都是通过流牵引方式进行,牵引流量是通过SDN控制器下发流表实现。区别在于,透明代理是二层,来回流量都需要牵引过WAF,此时可以把WAF看成一个交换机,最后一步牵引无需对数据包的匹配域进行修改。反向代理是三层,仅需要将来的流量进行牵引即可,最后需要将数据包的匹配域进行修改,类似于流量劫持。

       

      透明代理模式(也称网桥代理模式)这种部署模式对网络的改动最小,可以实现零配置部署。另外通过WAF的硬件Bypass功能在设备出现故障或者掉电时可以不影响原有网络流量,只是WAF自身功能失效。缺点是网络的所有流量(HTTP和非HTTP)都经过WAFWAF的处理性能有一定要求,采用该工作模式无法实现服务器负载均衡功能。

        反向代理模式这种部署模式需要对网络进行改动,配置相对复杂,除了要配置WAF设备自身的地址和路由外,还需要在WAF上配置后台真实WEB服务器的地址和虚地址的映射关系。另外如果原来服务器地址就是全局地址的话(没经过NAT转换)那么通常还需要改变原有服务器的IP地址以及改变原有服务器的DNS解析地址。采用该模式的优点是可以在WAF上同时实现负载均衡。

    
    展开全文
  • DNS 透明代理

    千次阅读 2019-01-08 13:02:00
    DNS 透明代理 一、使用DNS负载均衡虚拟服务器(DNS * 53)的方式 ---推荐使用的方式 注意:只会代理跨内网网段的DNS查询请求 -------------------------------- # 配置设备工作模式和开启的功能 > enable ...
  • 透明代理Transparent Proxy

    千次阅读 2017-03-15 11:03:07
    透明代理Transparent Proxy
  • 代理方式有三种:正向代理、透明代理和反向代理。反向代理比较容易理解,毕竟是运维必掌握的知识,但是对正向代理、透明代理可能比较模糊,所以主要解惑正向代理和透明代理透明代理 透明代理(transparent proxy...
  • 用nginx搭建http透明代理

    千次阅读 2019-05-15 09:55:09
    代理我们经常听,在技术层面我们谈论的代理往往是非透明代理,那么既然有非透明代理那就存在有透明代理。我们先看看什么是透明代理,引用百度百科的一句话可以描述明白 透明代理的意思是客户端根本不需要知道有代理...
  • centos7配置squid代理(透明代理

    千次阅读 2019-09-03 19:30:17
    squid透明代理 实验材料 一台centos7配置squid服务 添加一块网卡 vm1 网卡IP 192.168.100.102 模拟内网 vm2 网卡IP192.168.200.102 模拟外网 一台win7 vm1 IP 192.168.100.66 内网客户机 一台centos7 vm2 IP ...
  • openwrt 透明代理上网

    千次阅读 2019-08-14 15:34:54
    现在好了,用openwrt搭建一个透明代理,让所有接上这个router的人都通过代理上网,还可以对他们监控和进行一些规则设定: ) 我的Local proxy是这样的,如图: 我的squid版本为2.7 非常多的电脑接入我的openwrt,...
  • squid透明代理配置

    2017-08-04 01:36:31
    squid透明代理配置 在前面squid介绍中已经说过squid透明代理内网客户端不用进行设置,squid代理服务器设置iptables跳转,以及打开路由转发即可。与普通代理要区分开,普通代理squid代理不用做配置,需要配置的是...
  • iptables:tproxy做透明代理

    万次阅读 2017-08-22 16:16:48
    透明代理:客户端向真实服务器发起连接,代理机冒充服务器与客户端建立连接,并以客户端ip与真实服务器建立连接进行代理转发。因此对于客户端与服务器来说,代理机都是透明的。
  • 透明代理 匿名代理 混淆代理 高匿代理
  • squid配置透明代理

    千次阅读 2015-04-01 11:27:25
    搞了半个月的squid普通代理和透明代理终于差不多了!! squid配置透明代理主要有两步,见图:
  • 这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送...1、透明代理(Transparent Proxy) REMOTE_ADDR = Proxy IP HTTP_VIA = Proxy IP HTTP_X_FORWARDED_FOR = Your IP 透明代理虽然可以直接“隐藏...
  • 高匿代理IP和透明代理IP的区别

    千次阅读 2020-08-13 17:51:21
    代理IP按照隐匿的完全度来分,可分为透明代理,普通匿名代理和高度匿名代理。 1.透明IP代理顾名思义,如果你运用透明代理的时候并沒有隐藏你的IP,所以是透明的。在你发送请求时会改变你的请求信息,并且对方的...
  •  ...常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理解代理服务技术。 一、正向代理(Forward Proxy)  
  • 目前调试发现,当客户端与nginx处于同一机器上时,透明代理转发功能是正常的,但是当客户端与nginx处于不同机器,那么nginx发送的syn不被代理机器响应,问题是:怎么配置内核路由才能实现透明转发?
  • nginx做透明代理

    万次阅读 2014-07-29 10:57:17
    在VPN网关上设置一个透明代理能在一定程度上提高客户端的下载速度。最适合做透明代理的自然是squid,但squid有两个缺点: 不支持多CPU; 存在内存泄漏问题,我设置squid内存缓存64m,结果睡一觉起来发现squid...
  • 传统代理,透明代理
  • 关于透明代理的原理性描述

    千次阅读 2020-03-03 13:38:19
    最近因为ss被封禁被迫走上了trojan的路子,然后也就仔细研究了一下透明代理的基本原理,以前也基本上是无脑用,很多东西一知半解,正好也当学习rust练手,就用rust重写了一下trojan,另外增加了透明代理的支持,同时...
  • 使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。 透明代理访问对方服务器所带的HTTP头信息如下: REMOTE_ADDR = 代理服务器IP HTTP_VIA = 代理服务器IP HTTP_X_FORWARDED_FOR = 你的真实IP ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,867
精华内容 42,346
关键字:

透明代理