【发布时间】:2015-03-22 18:23:48
【问题描述】:
我需要在两台主机之间的代理服务器上使用 c 语言的原始套接字编写程序。
我已经为它编写了一些代码(并为 iptable 设置了一些规则以将数据包的目标地址更改为代理的接口),我正在接收数据包,打印此数据包中的数据,然后将数据包发送给接收者。
它在原始套接字上的简单客户端/服务器程序上运行,但是当我尝试通过代理建立连接时 - 它不起作用。
您对如何在不使用内核的情况下编写此程序有任何想法吗?
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#define PCKT_LEN 8192
int main(void){
int s;
char buffer[PCKT_LEN];
struct sockaddr saddr;
struct sockaddr_in daddr;
memset(buffer, 0, PCKT_LEN);
s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if(s < 0){
printf("socket() error");
return -1;
}
int saddr_size = sizeof(saddr);
int header_size = sizeof(struct iphdr) + sizeof(struct tcphdr);
unsigned int count;
daddr.sin_family = AF_INET;
daddr.sin_port = htons(1234);
daddr.sin_addr.s_addr = inet_addr ("2.2.2.1");
while(1){
if(recvfrom(s, buffer, PCKT_LEN , 0, &saddr, &saddr_size) < 0){
printf("recvfrom() error");
return -1;
}
else{
int i = header_size;
for(; i < PCKT_LEN; i++)
printf("%c", buffer[i]);
if (sendto (s, buffer, PCKT_LEN, 0, &daddr, &saddr_size) < 0)
printf("sendto() error");
return -1;
}
}
}
close(s);
return 0;
}
【问题讨论】:
-
您能否详细说明“通过代理建立连接”?您是在尝试通过代码透明地强制执行代理,还是客户端已经支持代理?
-
我正在尝试通过代码透明地强制执行代理
-
你不能仅仅通过重定向数据包来实现透明代理。使用 HTTPS 需要保留原 IP 并建立 CONNECT 隧道;您还需要使用完整而不是相对 URL 等。这是一个非常广泛的问题。