[PYTHON] UDP-Portweiterleitung

Einführung

Ich sehe oft eine TCP-Portweiterleitung, aber ich sehe keine UDP-Portweiterleitung, da sie möglicherweise nur eine begrenzte Verwendung hat. Dieses Mal möchte ich die UDP-Portweiterleitung durchführen, während ich UDP und Sockets studiere.

Umgebung

OS X El Capitan Python 2.7.11 snmpwalk 5.6.2.1

In Python implementieren

udp_portforwarder.py


import socket
UDP_IP_LISTEN = "192.168.1.12"
UDP_PORT_LISTEN = 161
UDP_IP_TO = "192.168.1.119"
UDP_PORT_TO = 161

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP_LISTEN, UDP_PORT_LISTEN))

src_port = 0

while True:
  data, (host, port) = sock.recvfrom(4096)

  # receive from remote server
  if src_port != 0 and host != UDP_IP_LISTEN:
    sock.sendto(data, (UDP_IP_LISTEN, src_port))
  # send to remote server
  else:
    src_port = port
    sock.sendto(data, (UDP_IP_TO, UDP_PORT_TO))
   
  print 'forwarded', host, port

Kommentar 1 Da wir UDP als Ziel festlegen möchten, geben Sie SOCK_DGRAM für den Socket an.

Kommentar 2 Da die Antwort von der Anforderungsquelle und die Antwort vom Ziel sowie zwei Arten von Paketen durch recvfrom am gebundenen Port ankommen, wird eine bedingte Verzweigung an der Quelladresse durchgeführt.

Kommentar 3 Da es erforderlich ist, es an den anfordernden Port zurückzugeben, wird die anfordernde Portnummer in src_port gespeichert, wenn das Paket von der anfordernden Quelle ankommt.

Funktionsprüfung

  1. Führen Sie tshark udp aus (um die Details des Pakets zu überprüfen).
  2. Führen Sie sudo python udp_capture_portforwarder_remote.py aus
  3. Führen Sie snmpwalk -c public -v 1 192.168.1.12 aus

Betriebsergebnis

snmpwalk


snmpwalk -c public -v 1 192.168.1.12
butada-mac:python_udp_capture_test butada$ snmpwalk -c public -v 1 192.168.1.12
SNMPv2-MIB::sysDescr.0 = STRING: Darwin macbook.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.16
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (454525) 1:15:45.25
SNMPv2-MIB::sysContact.0 = STRING: SysAdmin
SNMPv2-MIB::sysName.0 = STRING: SystemName
SNMPv2-MIB::sysLocation.0 = STRING: data centre A
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (4) 0:00:00.04
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBC
<Ausgelassen>

udp_capture_portforwarder_remote.py


$ sudo python udp_capture_portforwarder_remote.py 
sent to remote snmp
forwarded 192.168.1.12 57598
received from remote snmp
forwarded 192.168.1.119 161
sent to remote snmp
forwarded 192.168.1.12 57598
received from remote snmp
forwarded 192.168.1.119 161
sent to remote snmp
forwarded 192.168.1.12 57598
received from remote snmp
forwarded 192.168.1.119 161
sent to remote snmp
forwarded 192.168.1.12 57598
received from remote snmp
forwarded 192.168.1.119 161
sent to remote snmp
forwarded 192.168.1.12 57598
received from remote snmp
forwarded 192.168.1.119 161
<Ausgelassen>

tshark


$ tshark udp
1897 2373.448956 192.168.1.12 -> 192.168.1.119 SNMP 82 get-next-request 1.3.6.1.2.1
1898 2373.450958 192.168.1.119 -> 192.168.1.12 SNMP 215 get-response 1.3.6.1.2.1.1.1.0
1899 2373.451207 192.168.1.12 -> 192.168.1.119 SNMP 85 get-next-request 1.3.6.1.2.1.1.1.0
1900 2373.453134 192.168.1.119 -> 192.168.1.12 SNMP 95 get-response 1.3.6.1.2.1.1.2.0
1901 2373.453259 192.168.1.12 -> 192.168.1.119 SNMP 85 get-next-request 1.3.6.1.2.1.1.2.0
1902 2373.454931 192.168.1.119 -> 192.168.1.12 SNMP 88 get-response 1.3.6.1.2.1.1.3.0
1903 2373.455061 192.168.1.12 -> 192.168.1.119 SNMP 85 get-next-request 1.3.6.1.2.1.1.3.0
1904 2373.456796 192.168.1.119 -> 192.168.1.12 SNMP 93 get-response 1.3.6.1.2.1.1.4.0
<Ausgelassen>

Ergebnis

Ich habe bestätigt, dass die UDP-Portweiterleitung mit snmpget erfolgen kann. Ich konnte die konkreten Ergebnisse hier nicht einfügen, aber ich konnte bestätigen, dass IPMI mit ipmiutil auf die gleiche Weise portweitergeleitet werden kann.

Anwendung

SNMP-Paketerfassung und -wiedergabe

Ich habe diese Technik angewendet, um Pakete zu erfassen und einfache Stubs zu erstellen. Mit anderen Worten, die Erfassung wird beim Weiterleiten aufgezeichnet, und der Stub basiert auf dem erfassten Inhalt und gibt die aufgezeichnete Antwort ohne Weiterleitung zurück. http://qiita.com/butada/items/77af324c2a1bb880f101

Referenz

http://memo.saitodev.com/home/python_network_programing/ http://stackoverflow.com/questions/11350145/are-there-simple-descriptions-on-port-forwarding-using-python http://stackoverflow.com/questions/2694212/socket-set-source-port-number

Recommended Posts

UDP-Portweiterleitung
Über WOL Port Forward
Versuchen Sie, iptablse zu lernen, portieren Sie vorwärts
Einstellungen für die Weiterleitung von Linux-SSH-Ports (Tunnel)
Portweiterleitung eines Webservers mithilfe von iptables
Beinhaltet Docker-Nginx-Port Forward unter AWS Linux 2
Die Weiterleitung des Bindungsports an den Unix-Domain-Socket funktioniert besser