Apr 29 2009

在vpn上面实现透明代理

Category: 技术ssmax @ 12:22:03

在很久以前,曾经在ip tunnel上面实现过

https://ssmax.net/archives/86.html

但是当时openvpn怎么设置都不行,今天有一台内网的机器需要这么搞透明代理,ip tunnel不管用了,只能用vpn来搞了。

 

先设置好openvpn

A(内网):
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:183 errors:0 dropped:0 overruns:0 frame:0
          TX packets:134 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:27301 (26.6 KiB)  TX bytes:53300 (52.0 KiB)

 

B(外网):

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:134 errors:0 dropped:0 overruns:0 frame:0
          TX packets:186 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:53300 (52.0 KiB)  TX bytes:27457 (26.8 KiB)

 

现在需要实现的是所有发到B的外网ip,80端口的包,都转发到A的80端口:

B机器上面,开打ip转发:

B> echo 1 > /proc/sys/net/ipv4/ip_forward

增加DNAT的iptable:

B> iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.8.0.6

 

在A机器上面,增加一个路由表vpntun,先看看/etc/iproute2/rt_tables 里面有什么路由表,然后在决定TABLE_ID,取值是 0 – 255,但是 0,253,254,255 都是系统保留的,不能用:

A> echo “200     vpntun” > /etc/iproute2/rt_tables

然后增加vpntun的默认路由,这里也可以指定via,不指定的话ip route 会自动去找。

A> ip route add default dev tun0 table vpntun

(((

或者指定via:

 ip route add default dev tun0 via 10.8.0.5 table vpntun

)))

最后把从本机outbound的包,也就是从 10.8.0.6 发出来的包,全部指定查找路由表vpntun

ip rule add from 10.8.0.6 table vpntun

这样子,从A的tun0出去的响应包,就会默认回到B的vpn上面,再回到请求的client机上面。

这样实现的代理,传过来的ip包就是原来客户端请求的ip包,服务器也能直接拿到客户端的ip,所以对服务器来说,是透明的代理,其实应该叫NAT更好了,说明白一点就是端口映射,嘿嘿。