端口转发提供:
1.加密 SSH Client 端至 SSH Server 端之间的通讯数据。
2.突破防火墙的限制完成一些之前无法建立的 TCP 连接。
但是只能转发tcp连接,想要转发UDP,需要另外安装软件。
场景一:
现在有A,B两台机器,可以互相ssh访问,但是B上防火墙组织所有其他端口访问,想通过ssh转发,让A的8000端口访问B上8001端口。
A的ip:192.168.66.19
B的ip:192.168.66.78
B内开启防火墙 systemctl start firewalld。
从A访问B的8001端口会返回:
OSError: [Errno 113] No route to host
在A上配置本地转发:
ssh -L 8000:localhost:8001 -fN test@192.168.66.78 #ssh -L <
local
port>:<
remote
host>:<
remote
port> <
SSH
hostname> 这里
<
remote
host>和
<
SSH
hostname>都是B机器,
<
SSH
hostname>表示接受ssh连接的机器,而
<
remote
host>表示最终被转发的机器,两者可以是两个机器,实现穿透防火墙。
加上不加fN会显示的登陆test@192.168.66.78建立连接,加上之后在后台建立。
修改测试脚本访问本地8000端口:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('localhost', 8000)) client.send("hello world".encode('utf-8'))
B机器上的server代码如下:
import socket import sys server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('192.168.66.78', 8001)) while True: print("listening on 8001") server.listen(5) conn,addr = server.accept() print("accept ", addr) data = conn.recv(1024) print(data) conn.close()
结果显示
channel 2: open failed: connect failed: Connection refused
后来发现,B上的server代码需要监听的是本地的8001端口,因为配置转发的时候是“8000:localhost:8001”,表示在B机器上会转发到localhost:8001。代码改为:
server.bind(('127.0.0.1', 8001))
再测试显示连接成功。
参考:https://blog.csdn.net/nimasike/article/details/73289777
https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
https://blog.csdn.net/weixin_41919236/article/details/85015781
远程转发和本地转发原理一样,区别只是在于在哪台主机上进行配置。
有一个缺点是,ssh转发普通用户就可以设定,如果想要取消转发功能,可以修改/etc/ssh/sshd_config,配置“AllowTcpForwarding no”禁止转发,默认是开启转发。