podcast 2x02 introducció I teoria sobre SOCKS5 bytesreams (XEP-0065) no familiaritzats XMPP: Extensible Messaging and Presence Protocol abans Jabber usat per xarxa jabber, gtalk, facebook, etc. http://oriolrius.cat/blog/2009/05/01/xmpp-introduccio XMPP sobre proxies -> BOSH extensions d'XMPP són els XEP: XMPP Extension Protocol -> http://xmpp.org/extensions/ XEP-0065 (PDF):SOCKS5 Bytestreams -> Standards Track Draft -> 2007-05-21 XMPP disenyat per enviar petits fragments d'XML entre peers de la xarxa, no info binaria per tant si s'ha d'enviar info binaria millor fero fora de la xarxa XMPP, un exemple és enviar fitxer anomenem a aquest fluxe de dades binaries fora del canal principal (in-band) bytestreams s'estableixen via: * connexions TCP * associacions UDP * usant socks ** socks punt a punt (peer-to-peer) ** socks via un servei de bytestreaming obviament, sempre que es pot s'usen tècniques tradicionals de fet, quan parlem de serveis de bytestreaming parlem de servidors SOCKS5, però no són servidors S5 estàndards sinó servidors adaptats per treballar amb jabber glosari: bytestream: fluxe de dades binaries initiator: peer jabber q vol iniciar un stream amb un altre target: peer amb el que es vol iniciar un stream proxy: intermediari per la connexió entre l'initiator i el target streamhost: sovint coincideix amb el proxy, és el servidor al que es connecta el target i que re-envia el bytestream streamID: número entre 1 i 128 assignat per l'initiator i q serveix per identificar el bytestream dins del streamhost escenaris per enllaços TCP 1) connexió directe -> initator fa d'streamhost 2) connexió amb intermediari -> l'streamhost és el proxy (1) és el cas més simple per un enllaç TCP -> initiator fa d'streamhost visibilitat directe entre els ports del initiator i el target procediment: 1. initiator -> IQ-set -> target 1.1. params: streamID, full JID i IP del streamhost/initiator (són el mateix en aquest cas) 2. target: obre socket TCP a la IP rebuda via XMPP 3. target: envia request via SOCKS5 3.1. DST.ADDR i DST.PORT ???????????????????????????????????' -> defined below 4. streamhost/initiator: envia ACK a target via SOCKS5 5. target -> IQ-result -> initiator (preservant l'ID del IQ-set inicial) 6. streamhost/initiator: activa bytestream, comença a enviar fluxe binari pel canal TCP/SOCKS5 obert 7. initiator i target ja tenen un canal TCP obert per enviar-se informació (2) streamhost no és el initiator cal usar un intermediari (proxy) per fer l'enllaç per tant, initiator ha de descobrir la IP del streamhost abans d'enviar el IQ-set al target demanat la connexió del bytestream procediment: 1. opcional: initiator ha de descobrir la IP del streamhost usant el protocol XMPP 2. initiator -> IQ-set -> target 2.1. params: streamID, full JID i IP del streamhost 3. target: obre socket TCP a la IP rebuda via XMPP 4. target: envia request via SOCKS5 4.1. DST.ADDR i DST.PORT ???????????????????????????????????' -> defined below 5. streamhost: envia ACK a target via SOCKS5 6. target -> IQ-result -> initiator (preservant l'ID del IQ-set inicial) 7. initiator: obre connexió TCP contra servidor streamhost 8. initiator: estableix connexió SOCKS5 8.1. DST.ADDR i DST.PORT ???????????????????????????????????' -> defined below 9. streahost: envia ACK al initiator via SOCKS5 10. initiator -> IQ-set -> streamhost 10.1. activa bytestream: streamID 11. streamhost: activa bytestream -> és a dir, les dades flueixen entre les dues connexions SOCKS5 q té l'streamhost, la del initiator i la del target. 12. streamhost -> IQ-result -> initiator 12.1. informe bytestream: OK o FAIL 13. initiator i target ja poden començar a usar el bytestream Protocol 1) initiator necessita saber si el target suporta 'bytestreams' service-discovery: http://xmpp.org/extensions/xep-0030.html Example 1. Initiator Sends Service Discovery Request to Target Example 2. Target Replies to Service Discovery Request 2) initiator ha de preguntar-li al servidor XMPP si suporta proxies service-discovery: http://xmpp.org/extensions/xep-0030.html Example 3. Initiator Sends Service Discovery Request to Server Example 4. Server Replies to Service Discovery Request 3) initiator ha de comprovar a cada servei descober si és un bytestream proxy Example 5. Initiator Sends Service Discovery Request to Proxy Example 6. Server Replies to Service Discovery Request 4) initiator ha de descobrir la IP del 'streamhost' Example 7. Initiator Requests Network Address from Proxy Example 8. Proxy Informs Initiator of Network Address sid='vxf9n471bn46'> The els atributs: jid = JID streamhost per comunicar-nos amb ell via XMPP opció 1: host = the hostname or IP address of the StreamHost for SOCKS5 communications over TCP port = a port associated with the hostname or IP address for SOCKS5 communications over TCP opció 2: zeroconf = a zeroconf [5] identifier to which an entity may connect, for which the service identifier and protocol name SHOULD be "_jabber.bytestreams". Zeroconf is a set of protocols that enable IP networking without the need for configuration. For further information, refer to . Example 9. Proxy Returns Error to Initiator -> forbidden més info sobre la sintaxis dels errors XEP-0086: Error Condition Mappings . Example 10. Proxy Returns Error to Initiator -> not allowed 5) initiator ha de comunicar al target la informació descoberta sobre streamhosts info a comunicar: * IP de l'streamhost * streamID (sid) * mode de la connexió: TCP o UDP Example 11. Initiation of Interaction Example 12. Target Refuses Bytestream 6) target ha d'establir una connexió SOCKS5 amb l'streamhost si el initiator a informat de més d'un streamhost, el target prova de connectar al primer, si falla al segon i així successivament fins a aconseguir connectar en algún o fallar definitivament si no n'arriba a trobar cap a on connectar ha de reportar un IQ-error amb el tag: Example 13. Target Is Unable to Connect to Any StreamHost and Wishes to End Transaction si finalment ho aconseguix: ha d'obrir connexió TCP amb el servidor streamhost usant SOCKS5 (RFC1928) la part referent a l'autenticació i a com implementar SOCKS5 queda fora d'aquest de l'abast d'aquest podcast un cop autenticat amb el proxy -> envia un CONNECT request per continuar amb la negociació DST.ADDR = SHA1(SID+initiator full JID+target full JID) sortida codificada amb hexadecimal DST.PORT = ZERO els JID abans d'aplicar-los el SHA1 se'ls ha de passar pel cedaç del stringrep del XMPP Core: http://xmpp.org/extensions/xep-0065.html Appendix A en la resposta del servidor SOCKS5 al initiator si l'status és correcte '00': als camps BND.ADDR i BND.PORT hi ha la mateixa info que ha enviat l'initiator anteriorment 7) target comunica a initiator que la connexió SOCKS5 ja esta feta Example 16. Target Notifies Initiator of Connection 8) initiator ha d'establir una connexió SOCKS5 amb l'streamhost en aquest punt passa el mateix que ha passat al punt (6) 9) initiator demana al streamhost que inicii el bytestream Example 19. Initiator Requests Activation of Bytestream target@example.org/bar Example 20. Proxy Informs Initiator of Activation si el proxy no pot iniciar el bytestream, retorna un IQ-error: escenaris per associacions UDP en principi no els tocaré perquè la cosa es complica massa i la seva implementació és OPCIONAL es important però saber que cal tenir molt clar com funciona la part de SOCKS5 UDP sinó aquesta part es pot fer molt difícil de seguir i fins aquí XEP-0065 no sé si encara quedarà algú aguantant el podcast espero que ni que sigui per dir q heu tingut la pciència d'escotlar-lo digue algo als comentaris com sempre per dubtes i rpeguntes no dubteu en escriurem o poasr-vos en contacte amb mi recorda email web gtalk twitter: oriolrius skype: oriol.rius