发新话题
打印

linux透明代理编程求助

linux透明代理编程求助

linux透明代理编程求助
想完成linux透明代理,在代理服务器上利用ipchains采用-j REDIRCT port到诊听端口
port,客户机把网关设到代理服务器上,直接利用透明代理。现在编程需要建立透明通
道,需要得到我看到有文章说,在代理上得到利用redirct转发客户机请求的socket
后,可以利用getsockname得到请求远端服务器的ip和port,但是我测试得到的是代理服
务器代理的端口。请问各界高手,要代理服务器得到远端请求的ip应该如何处理



      

TOP

理论上不可能得到,除非那个代理程序有问题,因为你与代理的连接和代理与远程服务器的连接是两个完全不同的连接      

TOP

下面的文章说行,就是没有看懂它的实现过程,请帮忙

1.虽然理论上透明代理可以对任何协议通用, 目前能实现的主要有NS, sendmail relay, 和 HTTP.
  1). DNS, sendmail relay服务本身与目标地址无关, 因此只需简单的重定向一下端口.
ipchains -A input -d 0/0 53 -p tcp -j REDIRECT
ipchains -A input -d 0/0 53 -p udp -j REDIRECT
ipchains -A input -d 0/0 25 -p tcp -j REDIRECT
  2). HTTP服务(也可以用于proxy服务). 有两种方法, 各有优缺点:
  (1) 使用专用的转换进程httpd_transp.c, 这种方法是用专用进程在定向后的端口上读取http请求, 用getsockname获得目标地址, 再把连接转换到http proxy server上.这种方法需要专用的进程处理, 消费系统资源, 但可以使用其它机上的proxy, 而且兼容非HTTP/1.1请求.
  (2) squid的透明代理功能. 此方法比较方便, 它使用HTTP协议固有的功能,但不适合与不带host请求标志的连接.(现在的标准浏览器都支持host标志). 还有, squid必须装在firewall主机上. 方法:
ipchains -A input -d 0/0 80 -p tcp -j REDIRECT 3128
ipchains -A input -d 0/0 8080 -p tcp -j REDIRECT 3128
ipchains -A input -d 0/0 3128 -p tcp -j REDIRECT
在squid.conf里加上
httpd_accel_with_proxy on
httpd_accel virtual 80
  后面两条ipchains用于定向对外的代理访问统统限制在本地代理上, 由于squid本身不会通过getsockname来确定目标地址,这种方法只能对80段口的http有效.

  2. 端口重定向(服务定向,平衡).
  目前linux核心支持两种途径实现服务重定向和服务平衡
  1). IP portfw. 这是比较老的实行方法.对2.0.36的核心也实用.ipmasqadm portfw -a -p tcp -L 1.1.1.1 80 -R 10.1.1.1 80 这里的1.1.1.1是firewall的地址, 防火墙内的10.1.1.1实际地址在这里,可以对同一服务加多条规则. 实现服务平衡, 如:
ipmasqadm portfw -a -p tcp -L 1.1.1.1 80 -R 10.1.1.1 80 -P 1
ipmasqadm portfw -a -p tcp -L 1.1.1.1 80 -R 10.1.1.2 80 -P 2
  这里, 该服务将以1:2分配到10.1.1.1/10.1.1.2两台机上
  2). ip mark fw. 这是较新的一种方式, 比较灵活. 如果不是历史原因, 建议使用这种方式ipmasqadm mfw -A -m mark -r raddr [rport] [-p pref]这里的-r相当于portfw的-R, -p相当于portfw的-P. 这里的rport可以不声明, 表明使用源数据的端口. 如:
ipchains -A input -p tcp -d 0/0 137:139 -m 1 -j ACCEPT
ipchains -A input -p udp -d 0/0 137:139 -m 1 -j ACCEPT
ipchains -A input -p tcp -d 0/0 80 -m 1 -j ACCEPT
ipchains -A input -p tcp -d 0/0 81 -m 2 -j ACCEPT
ipmasqadm mfw -A -m 1 -r 10.1.1.1
ipmasqadm mfw -A -m 2 -r 10.1.1.2 80
  这里, 把netbios, 和http(80)定向到10.1.1.1机上而把81上的http定向到10.1.1.2机上.
  3). 以上两种方式用于ftp时,都只能提供普通的port ftp方式,对于passive的ftp方式, 要加载一个类似ip_masq_ftp的模块, 如果有需要, 请注明核心版本, 与我联系. (由于此patch是历史之作,目前我已经没有继续维护了).
  4). 以此相关的autofw可以实现一些独占服务的访问(masq). 如SGI MediaBase MPEG Player.ipmasqadm autofw -A -r udp 7000 7000 -c udp 6311把firewall内player的设为proxy方式,端口7000即可

  3. MAC/IP地址问题? 你能给出更清楚的需求吗? 现在就大概谈一下.
  1) 获取本地IP地址和interface清单. 使用
struct ifreq ifr[32];
struct ifconf ifc;
int num, i;
int sock = socket( AF_INET, SOCK_DGRAM, 0 );
ifc.ifc_len = sizeof ifr;
ifc.ifc_req = ifr;
num = ioctl( sock, SIOCGIFCONF, &ifc );
for( i = 0; i < num/sizeof(struct ifreq); i++){
/* process each ifr */
}
  2) 获取interface的IP/MAC地址.
struct ifreq ifr;
int sock = socket( AF_INET, SOCK_DGRAM, 0 );
ioctl( sock, SIOCGIFHWADDR, &ifr );
  此外, 还有SIOCGIFFLAGS, SIOCGIFDSTADDR, SIOCGIFBRDADDR...
  3) 读取arp cache的内容. 直接打开/proc/net/arp文件.或者通过ioctl/SIOCGARP来实现.      

TOP

那说的是代理端,不是客户端      

TOP

发新话题