복붙노트

[PYTHON] Paramiko : NAT 라우터 주변의 포트 포워딩

PYTHON

Paramiko : NAT 라우터 주변의 포트 포워딩

Paramiko를 사용하여 항구 포워딩과 관련된 몇 가지 질문을 살펴 보았지만이 특정 상황을 처리하지는 않습니다.

Paramiko를 사용하여 위의 2 단계와 3 단계를 어떻게 실행할 수 있습니까? 본질적으로 다음과 같이 실행하고 싶습니다.

import paramiko

# Create the tunnel connection
tunnel_cli = paramiko.SSHClient()
tunnel_cli.connect(PROXY_HOSTNAME, PROXY_PORT, PROXY_USER)

# Create the forwarded connection and issue commands from LOCAL on the REMOTE box
fwd_cli = paramiko.SSHClient()
fwd_cli.connect('localhost', LOCAL_PORT, REMOTE_USER)
fwd_cli.exec_command('pwd')

해결법

  1. ==============================

    1.Paramiko가 "두포 (Under the Hood)"하고있는 것에 대한 자세한 설명은 @ bitprohet의 블로그에서 찾을 수 있습니다.

    Paramiko가 "두포 (Under the Hood)"하고있는 것에 대한 자세한 설명은 @ bitprohet의 블로그에서 찾을 수 있습니다.

    위의 구성을 가정하면 코드는 다음과 같이 보입니다.

    from paramiko import SSHClient
    
    # Set up the proxy (forwarding server) credentials
    proxy_hostname = 'your.proxy.hostname'
    proxy_username = 'proxy-username'
    proxy_port = 22
    
    # Instantiate a client and connect to the proxy server
    proxy_client = SSHClient()
    proxy_client.load_host_keys('~/.ssh/known_hosts/')
    proxy_client.connect(
        proxy_hostname,
        port=proxy_port,
        username=proxy_username,
        key_filename='/path/to/your/private/key/'
    )
    
    # Get the client's transport and open a `direct-tcpip` channel passing
    # the destination hostname:port and the local hostname:port
    transport = proxy_client.get_transport()
    dest_addr = ('0.0.0.0', 8000)
    local_addr = ('127.0.0.1', 1234)
    channel = transport.open_channel("direct-tcpip", dest_addr, local_addr)
    
    # Create a NEW client and pass this channel to it as the `sock` (along with
    # whatever credentials you need to auth into your REMOTE box
    remote_client = SSHClient()
    remote_client.load_host_keys(hosts_file)
    remote_client.connect('localhost', port=1234, username='remote_username', sock=channel)
    
    # `remote_client` should now be able to issue commands to the REMOTE box
    remote_client.exec_command('pwd')
    
  2. ==============================

    2.포인트가 유일하게 SSH 명령을 PROXY에서 튕기 는가 아니면 다른 비 SSH 포트도 전달해야합니까?

    포인트가 유일하게 SSH 명령을 PROXY에서 튕기 는가 아니면 다른 비 SSH 포트도 전달해야합니까?

    REMOTE 상자에 SSH가 필요한 경우 Paramiko는 SSH 수준의 게이트웨이 (PROXY sshd에게 REMOTE에 대한 연결을 열고 LOCAL 대신 SSH 트래픽을 전달하도록 알려줍니다) 및 ProxyCommand 지원 (로컬 명령을 통해 모든 SSH 트래픽을 전달합니다. 원격 상자에 말할 수있는 어떤 것도 될 수 있음).

    PROXY가 이미 sshd를 실행하고 있기 때문에 당신이 나에게 전자를 원한 것처럼 들립니다. 패브릭 복사본을 확인하고 '게이트웨이'를 검색하면 Fabric이 Paramiko의 게이트웨이 지원을 사용하는 방법에 대한 지침을 찾을 수 있습니다 (지금 당장 특정 장소를 파 낼 시간이 없습니다).

  3. from https://stackoverflow.com/questions/18968069/paramiko-port-forwarding-around-a-nat-router by cc-by-sa and MIT license