在很久以前,曾经在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更好了,说明白一点就是端口映射,嘿嘿。
Leave a Reply