測試ssh轉發

端口轉發提供:html

1.加密 SSH Client 端至 SSH Server 端之間的通信數據。linux

2.突破防火牆的限制完成一些以前沒法創建的 TCP 鏈接。ssh

可是隻能轉發tcp鏈接,想要轉發UDP,須要另外安裝軟件。socket

 

場景一:tcp

如今有A,B兩臺機器,能夠互相ssh訪問,可是B上防火牆組織全部其餘端口訪問,想經過ssh轉發,讓A的8000端口訪問B上8001端口。測試

A的ip:192.168.66.19加密

B的ip:192.168.66.78spa

B內開啓防火牆 systemctl start firewalld。.net

從A訪問B的8001端口會返回:code

OSError: [Errno 113] No route to host

在A上配置本地轉發:

ssh -L 8000:localhost:8001 -fN test@192.168.66.78  #         ssh -L <localport>:<remotehost>:<remoteport> <SSHhostname> 這裏<remotehost>和<SSHhostname>都是B機器,
<SSHhostname>表示接受ssh鏈接的機器,而<remotehost>表示最終被轉發的機器,二者能夠是兩個機器,實現穿透防火牆。

加上不加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」禁止轉發,默認是開啓轉發。

相關文章
相關標籤/搜索