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