如何用ssh实现端口的映射?
为了解决什么问题,应该就是ssh服务器程序在22号端口监听,难道这就是用软件实现了
实现隧道的方法真是有好几种,包括使用ssh,包括使用tap,或者使用ssh都是可以的,今天试验下如何使用ssh实现隧道功能。
测试程序在
codebox/net/sock/inet/server.cpp
codebox/net/sock/inet/client.cpp
codebox/net/sock/inet/Makefile
在目录里make一下就可以
测试的方法就是在虚机中跑上server,然后在宿主机上连上ssh,
ssh -L 7001:192.168.0.110:10943 192.168.0.110
此时client端需要把包发到:127.0.0.1:7001端口,ssh会在这个端口上监听
这个时候需要程序的就需要在配置文件中增加本地proxy的选项了。
192.168.0.110 这个地方应该填啥东西呢?
ssh 456 root 5u IPv4 3146860 0t0 TCP localhost:afs3-callback (LISTEN)
此时就是ssh在监听这个地址,所有发往这个结果的地址都会被发送到本地:7001这个地址,然后通过ssh这条线发送。
就是我ssh的线程在监听呀
但是使用这个段需要保证ip_forward一定要打开吗?好像是不需要的!
试一下,果然是不需要的,比tap的方法好;
那么能不能实现一个真正的管道程序呢?有这样三台机器:
client -----> stationA (192.168.0.110) -------> Terminate(192.168.1.110)
使用如下的指令,192.168.1.110 ,然后使用ssh登录stationA,然后在这个stationA,然后在client上执行client,此时就就可以把所有的流量都导流到了stationsA,stationsA上sshd,就会收到这个这份数据,然后转发Terminate机器上啦。
ssh -L 7001:192.168.1.110:10943 192.168.0.110
这篇文章可以与之前写的ppp协议作对比
之前想过,其实用户态程序本来可以完成数据转发的功能,可以不依赖于内核的ppp功能,两篇文章对比下
-====== 我是分割线呀========
今天研究这个问题是考虑到了nat中的output的链,output链会在路由之前把目的ip/port给改掉,现在这个转换我们是在代码里写死的,那么同样这个功能是否可以通过iptables来完成呢?
我把目的地址192.168.1.110这个地址给屏蔽掉,发现连收包都收不到了,按理说有了中转机做代理,和目的地址就无关了呀,这个问题可能是和ip的配置相关,如果目的地址不可达,那么不接受这个数据包!!!!
默认情况下,如果目的地址不可达是不可以收数据包的!
sudo iptables -t nat -A OUTPUT -p tcp --dport 7002 -j REDIRECT --to-ports 7001
使用iptables同样能达到相同的效果,注意-p --dport同时使用,并且-p在前 --dport在后
1 sudo iptables -t nat -A OUTPUT -d 192.168.1.111 -p tcp --dport 20943 -j DNAT --to 127.0.0.1:7001