[PYTHON] Redirection de port UDP

introduction

Je vois souvent le transfert de port TCP, mais je ne vois pas le transfert de port UDP car il peut avoir des utilisations limitées. Cette fois, je voudrais faire la redirection de port UDP tout en étudiant UDP et les sockets.

environnement

OS X El Capitan Python 2.7.11 snmpwalk 5.6.2.1

Implémenter en Python

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

Commentaire 1 Puisque nous voulons cibler UDP, spécifiez SOCK_DGRAM pour socket.

Commentaire 2 Puisque la réponse de la source de demande et la réponse de la destination et deux types de paquets arrivent au port lié par recvfrom, un branchement conditionnel est effectué à l'adresse source.

Commentaire 3 Puisqu'il est nécessaire de le renvoyer au port demandeur, le numéro de port demandeur est stocké dans src_port lorsque le paquet de la source demandeuse arrive.

Contrôle de fonctionnement

  1. Exécutez tshark udp (pour vérifier les détails du paquet)
  2. Exécutez sudo python udp_capture_portforwarder_remote.py
  3. Exécutez snmpwalk -c public -v 1 192.168.1.12

Résultat de l'opération

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
<Omis>

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
<Omis>

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
<Omis>

résultat

J'ai confirmé que la redirection de port UDP peut être effectuée à l'aide de snmpget. Je n'ai pas pu mettre les résultats concrets ici, mais j'ai pu confirmer que IPMI peut être transféré de la même manière en utilisant ipmiutil.

application

Capture et relecture de paquets SNMP

J'ai appliqué cette technique pour capturer des paquets et créer des stubs simples. En d'autres termes, la capture est enregistrée lors du transfert, et le stub est basé sur le contenu capturé et renvoie la réponse enregistrée sans transfert. http://qiita.com/butada/items/77af324c2a1bb880f101

référence

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

Redirection de port UDP
À propos de WOL Port Forward
Essayez et apprenez iptablse, port forward
Paramètres de redirection de port ssh Linux (tunnel)
Redirection de port d'un serveur Web à l'aide d'iptables
Inclut le transfert de port docker-nginx sur AWS Linux 2
La liaison du transfert de port au socket de domaine Unix fonctionne mieux