Merge branch 'master' into proxychain_fixes

Conflicts:
	proxychains/libproxychains.c
proxychain_fixes
Adam Hamsik 2011-03-23 11:20:55 +01:00
commit f85edffeea
3 changed files with 44 additions and 9 deletions

View File

@ -38,6 +38,7 @@ typedef enum {RANDOMLY,FIFOLY} select_type;
typedef struct typedef struct
{ {
struct in_addr in_addr, netmask; struct in_addr in_addr, netmask;
unsigned short port;
} localaddr_arg; } localaddr_arg;
typedef struct typedef struct

View File

@ -152,8 +152,8 @@ static inline void get_chain_data(
int count=0,port_n=0,list=0; int count=0,port_n=0,list=0;
char buff[1024],type[1024],host[1024],user[1024]; char buff[1024],type[1024],host[1024],user[1024];
char *env; char *env;
char local_in_addr[16], local_netmask[16]; char local_in_addr_port[32];
char local_in_addr[32], local_in_port[32], local_netmask[32];
FILE* file; FILE* file;
if(proxychains_got_chain_data) if(proxychains_got_chain_data)
@ -220,8 +220,23 @@ static inline void get_chain_data(
} }
else if(strstr(buff,"localnet")) else if(strstr(buff,"localnet"))
{ {
sscanf(buff,"%s %16[^/] %16s", user, local_in_addr, local_netmask) ; if (sscanf(buff,"%s %21[^/]/%15s", user,
PDEBUG("added localnet = %s%s\n", local_in_addr, local_netmask); local_in_addr_port, local_netmask) < 3) {
fprintf(stderr, "localnet format error");
exit(1);
}
/* clean previously used buffer */
memset(local_in_port, 0,
sizeof(local_in_port) / sizeof(local_in_port[0]));
if (sscanf(local_in_addr_port, "%15[^:]:%5s",
local_in_addr, local_in_port) < 2) {
PDEBUG("added localnet: netaddr=%s, port=%s\n",
local_in_addr, local_netmask);
} else {
PDEBUG("added localnet: netaddr=%s, port=%s, netmask=%s\n",
local_in_addr, local_in_port, local_netmask);
}
if (num_localnet_addr < MAX_LOCALNET) if (num_localnet_addr < MAX_LOCALNET)
{ {
int error; int error;
@ -231,12 +246,17 @@ static inline void get_chain_data(
fprintf(stderr, "localnet address error\n"); fprintf(stderr, "localnet address error\n");
exit(1); exit(1);
} }
error = inet_pton(AF_INET, local_netmask + 1, &localnet_addr[num_localnet_addr].netmask); error = inet_pton(AF_INET, local_netmask, &localnet_addr[num_localnet_addr].netmask);
if (error <= 0) if (error <= 0)
{ {
fprintf(stderr, "localnet address error\n"); fprintf(stderr, "localnet netmask error\n");
exit(1); exit(1);
} }
if (local_in_port[0]) {
localnet_addr[num_localnet_addr].port = (short)atoi(local_in_port);
} else {
localnet_addr[num_localnet_addr].port = 0;
}
++num_localnet_addr; ++num_localnet_addr;
} }
else else
@ -269,6 +289,7 @@ int connect (int sock, const struct sockaddr *addr, unsigned int len)
int socktype=0,optlen=0,flags=0,ret=0; int socktype=0,optlen=0,flags=0,ret=0;
char str[256]; char str[256];
struct in_addr *p_addr_in; struct in_addr *p_addr_in;
unsigned short port;
size_t i; size_t i;
if(!init_l) if(!init_l)
@ -279,17 +300,20 @@ int connect (int sock, const struct sockaddr *addr, unsigned int len)
return true_connect(sock,addr,len); return true_connect(sock,addr,len);
p_addr_in = &((struct sockaddr_in *)addr)->sin_addr; p_addr_in = &((struct sockaddr_in *)addr)->sin_addr;
port = ntohs(((struct sockaddr_in *)addr)->sin_port);
//PDEBUG("localnet: %s; ", inet_ntop(AF_INET,&in_addr_localnet, str, sizeof(str))); //PDEBUG("localnet: %s; ", inet_ntop(AF_INET,&in_addr_localnet, str, sizeof(str)));
//PDEBUG("netmask: %s; " , inet_ntop(AF_INET, &in_addr_netmask, str, sizeof(str))); //PDEBUG("netmask: %s; " , inet_ntop(AF_INET, &in_addr_netmask, str, sizeof(str)));
//PDEBUG("target: %s\n", inet_ntop(AF_INET, p_addr_in, str, sizeof(str))); //PDEBUG("target: %s\n", inet_ntop(AF_INET, p_addr_in, str, sizeof(str)));
//PDEBUG("port: %d\n", port);
for (i = 0; i < num_localnet_addr; i++) { for (i = 0; i < num_localnet_addr; i++) {
if ((localnet_addr[i].in_addr.s_addr & localnet_addr[i].netmask.s_addr) if ((localnet_addr[i].in_addr.s_addr & localnet_addr[i].netmask.s_addr)
== (p_addr_in->s_addr & localnet_addr[i].netmask.s_addr)) == (p_addr_in->s_addr & localnet_addr[i].netmask.s_addr))
{ {
PDEBUG("accessing localnet using true_connect\n"); if (localnet_addr[i].port && localnet_addr[i].port == port) {
return true_connect(sock,addr,len); PDEBUG("accessing localnet using true_connect\n");
return true_connect(sock,addr,len);
}
} }
} }

View File

@ -41,6 +41,16 @@ proxy_dns
tcp_read_time_out 15000 tcp_read_time_out 15000
tcp_connect_time_out 8000 tcp_connect_time_out 8000
# Example for localnet exclusion
## Exclude connections to 192.168.1.0/24 with port 80
# localnet 192.168.1.0:80/255.255.255.0
## Exclude connections to 192.168.100.0/24
# localnet 192.168.100.0/255.255.255.0
## Exclude connections to ANYwhere with port 80
# localnet 0.0.0.0:80/0.0.0.0
# ProxyList format # ProxyList format
# type host port [user pass] # type host port [user pass]
# (values separated by 'tab' or 'blank') # (values separated by 'tab' or 'blank')