IP/Port forwarding

*nix

rinetd (http://www.boutell.com/rinetd/)

netcat ( http://netcat.sourceforge.net/)

1
2
mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

socat (http://www.dest-unreach.org/socat/)

iptables (http://www.netfilter.org/downloads.html)

ssh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ssh user@10.13.135.47 -L 7001:10.13.135.54:9081 -g
端口7001在当前运行这个命令的机器上打开
ssh user@10.13.135.47 -R 7001:10.13.135.54:9081 -g
端口7001在10.13.135.47机器上打开

A跟B是同一个网络,B跟C是一个网络,C跟D同一个网络,但A不能到达D。

B机上运行
ssh root@C_host -L 7001:D_host:9081 -g

B机上运行
netstat -an|grep 7001
会看到0.0.0.0的端口7001在监听(如果没有-g,会显示127.0.0.1:7001在监听)

这样A可以通过B的7001端口发送数据可以到达D的9081端口,其中B到C的数据链路是被加密了的,而A->B和C->D是没有的。

反向代理
如果A可以到B,但由于防火墙导致B不能到A,那么就可以使用ssh -R,让端口开在B。例如A是proxy,希望让B可以访问internet,可以使用如下方法:
A上运行:ssh -R 7001:localhost:8080 B
再在B上运行:export http_proxy=http://localhost:7001

题外话:
如果在C上配置nginx/squid了,这样可以使用C为proxy。
A->B(7001)->C(9081)->C(80/443)

java

mina (http://mina.apache.org)
netty (http://netty.io)
openportmapper (http://openportmapper.sf.net)

window

netcat (http://joncraton.org/blog/46/netcat-for-windows)
ncat (http://nmap.org)
3proxy (http://3proxy.ru/)

Ref:

http://en.wikipedia.org/wiki/Netcat
http://www.debianadmin.com/howto-use-ssh-local-and-remote-port-forwarding.html
http://fsfoundry.org/codefreak/2006/05/18/ssh-port-forwarding-basics/
https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
http://blog.moonforest.org/2011/02/use-sshtunnel-and-nginx-as-proxy-on-android/
http://madeye.me/2011/02/10/ssh-tunnel-on-the-android-application-puff-android-edition