场景:

现在有三台主机:A、B、C, A和B通,B和C通,但是A和C之间不通,比如有防火墙,或者是网段不同等等。但是如果我非要通过A能访问C这个主机呢?这个时候就需要流量转发,通过将A->C的流量,交给B,由B作为跳板机转发到C。

方式一:通过SSH隧道转发

ssh隧道转发:分反向代理,正向代理,以及动态代理,我这里采用了正向代理
在跳板机B上执行以下命令:

ssh -C -f -N -g -L 40022:192.168.168.144:22 root@192.168.168.144

其中192.168.168.144就是主机C的地址,22就是主机C需要访问的端口号,40022是我在跳板机B上开放的端口,用于让主机A来ssh,
开放端口命令:

firewall-cmd --zone=public --add-port=40022/tcp --permanent
firewall-cmd --reload

这样配置后,我在A主机上:直接ssh B主机地址+开放的端口号:40022,就直接登录到主机C上了。
如果登录不上,需要修改主机B上sshd配置文件,开启隧道转发(百度有更详细的)
ps: ssh 后面加上-v -T就可以开启ssh调试,查找一下不通的原因

建立成功后,可以通过 ps -ef | grep ssh 查看到进程,关闭这个ssh转发隧道,直接kill -9 杀进程即可

注意:ssh这种连接是不稳定的,需要再安装一个autossh,保证ssh 隧道不会断,autossh用法自行百度。

yum install autossh

PS: ssh 隧道命令参数简介:
-f 后台执行ssh 命令
-C 允许压缩数据
-N 不执行远程指令,建立静默连接
-R 开启反向代理,将远程主机的某个端口转发到本地机器的指点端口
-L 开启正向代理,将本地主机某个端口转发到远程主机某个端口
-D 动态转发,即socket代理
-p 指定远程主机端口
-g 允许远程主机连接本地用于转发的端口

方式二:通过Firewalld做流量转发(推荐)

ssh这种我感觉不是很靠谱,至于是ssh隧道转发安全还是Firewalld安全,这里不作计较。有些虚机镜像里面做了加固处理,ssh隧道是打通不了的,反正Firewalld是可以的。

以下操作都是在跳板机B上执行:
1、先使能firewallD的转发功能:

firewall-cmd --add-masquerade --permanent

2、添加端口映射:

firewall-cmd --permanent --add-forward-port=port=40022:proto=tcp:toport=22:toaddr=192.168.168.144
firewall-cmd --reload

40022是跳板机B上的端口,映射到目的机器C的22端口,且192.168.168.144是目的主机C的地址
这样就可以通过在主机A上,ssh 主机B的地址+port 40022 直接访问主机C

firewall 相关命令

删除映射
firewall-cmd --permanent --remove-forward-port=port=40022:proto=tcp:toport=22:toaddr=192.168.168.144
查看已生效的映射:
firewall-cmd --list-forward-ports

最后推荐一个端口映射的小工具:rinetd ,这个比iptables 的nat映射配置简单,有需要的话,可以研究一下,挺好用的。


SanPiBrother
24 声望3 粉丝

菜鸡的救赎之路