{"id":1270,"date":"2008-06-30T03:00:00","date_gmt":"2008-06-30T10:00:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=1270"},"modified":"2008-06-30T03:00:00","modified_gmt":"2008-06-30T10:00:00","slug":"trucos-unix-depurando-protocolos-a-mano-%c2%bfque-usar","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2008\/06\/30\/trucos-unix-depurando-protocolos-a-mano-%c2%bfque-usar\/","title":{"rendered":"Trucos UNIX: Depurando protocolos a mano: \u00bfQu\u00e9 usar?"},"content":{"rendered":"<p>Hace ya un mes comenc\u00e9 a trabajar en un proyecto nuevo para la compa\u00f1\u00eda en la cual trabajo, el cual consiste en crear una aplicaci\u00f3n en donde los analistas de mercado reciben transacciones de los corredores de bolsa. Dado que el n\u00famero de nombres que la compa\u00f1\u00eda maneja en esta categor\u00eda ha crecido de manera substancial,  hay que automatizar el proceso.<\/p>\n<p>La bolsa de valores con la cual hacemos las transacciones tiene una especificaci\u00f3n del protocolo, escrita originalmente en C, usando &#8220;Structs&#8221; y sockets con UDP\/TCP. La aplicaci\u00f3n requiere (por razones demasiados numerosas para explicar aqu\u00ed) que el c\u00f3digo sea escrito en Java.<\/p>\n<p>\u00bfTodo bien verdad? Bueno, lo m\u00e1s dif\u00edcil fu\u00e9 implementar todo el protocolo (pese a que nosotros requer\u00edamos solamente una peque\u00f1a parte). Adem\u00e1s como ustedes se imaginan, los bancos de inversiones est\u00e1n fortificados detr\u00e1s de varios niveles de protecci\u00f3n como &#8220;Firewalls&#8221;, &#8220;IDS&#8221; y dem\u00e1s y la conectividad entre nuestro entorno de desarrollo y en nuestro caso la bolsa de valores no fu\u00e9 bien configurada.<\/p>\n<p>Para rematar, no tenia manera de usar <a href=\"http:\/\/tcpdump.org\/\">tcpdump<\/a> en la m\u00e1quina en donde corria el servidor (convertirse en root usando SUDO es un proceso <span style=\"font-style: italic;\">laaargo y burocr\u00e1tico<\/span>) as\u00ed que mis opciones eran esperar ayuda del grupo de redes, o mientras tanto depurar yo mi protocolo.<\/p>\n<p>Las especificaciones del protocolo requieren que inicialmente nos conectemos usando UDP, para luego usar TCP, lo cual hace inefectivo el truco de conectarse al puerto de la m\u00e1quina usando telnet (s\u00f3lo trabaja con TCP el cual es orientado a conexi\u00f3n) . Otro detalle es que el saludo inicial es una conexi\u00f3n pasiva (la bolsa de valores enviaba un <span style=\"font-style: italic;\">broadcast<\/span> cada 30 segundos).<\/p>\n<p>\u00bfQu\u00e9 hacer?<\/p>\n<p>Bueno, Linux de nuevo salva el d\u00eda con su ejercito de herramientas gratuitas. En eso caso utilic\u00e9 <a href=\"http:\/\/netcat.sourceforge.net\/\">NetCat (nc)<\/a> y dado que el protocolo era ASCII pude ver con claridad que al menos ellos estaban enviando sus paquetes y que nosotros estabamos filtrando informaci\u00f3n. En mi caso escrib\u00ed algo como esto:<\/p>\n<blockquote><p>auyan:~ josevnz$ nc -n -v -v -v -u -p 12345 -s 127.0.0.1 -l<br \/>listening on [127.0.0.1] 12345 &#8230;<\/p><\/blockquote>\n<p>\u00a1Super f\u00e1cil!. Con esta informaci\u00f3n me ahorr\u00e9 tiempo y resolvimos el problema en cuesti\u00f3n de minutos en vez de horas&#8230;<\/p>\n<p>As\u00ed que ya sabe, la pr\u00f3xima vez que necesite enviar o recibir paquetes arbitrarios en TCP o UDP dele un vistazo a NetCat \ud83d\ude42<\/p>\n<p>Buscar en otros sitios:<\/p>\n<p>Blogalaxia:<a href=\"http:\/\/www.blogalaxia.com\/tags\/netcat\" rel=\"tag\">netcat<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/udp\" rel=\"tag\">udp<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/tcp%2Fip\" rel=\"tag\">tcp\/ip<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/protocol\" rel=\"tag\">protocol<\/a><br \/>Technorati:<a href=\"http:\/\/technorati.com\/tag\/netcat\" rel=\"tag\">netcat<\/a>, <a href=\"http:\/\/technorati.com\/tag\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/technorati.com\/tag\/udp\" rel=\"tag\">udp<\/a>, <a href=\"http:\/\/technorati.com\/tag\/tcp%2Fip\" rel=\"tag\">tcp\/ip<\/a>, <a href=\"http:\/\/technorati.com\/tag\/protocol\" rel=\"tag\">protocol<\/a><br \/>To2blogs:<a href=\"http:\/\/www.to2blogs.com\/tag\/netcat\" rel=\"tag\">netcat<\/a>, <a href=\"http:\/\/www.to2blogs.com\/tag\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/www.to2blogs.com\/tag\/udp\" rel=\"tag\">udp<\/a>, <a href=\"http:\/\/www.to2blogs.com\/tag\/tcp%2Fip\" rel=\"tag\">tcp\/ip<\/a>, <a href=\"http:\/\/www.to2blogs.com\/tag\/protocol\" rel=\"tag\">protocol<\/a><br \/>Del.icio.us:<a href=\"http:\/\/del.icio.us\/tag\/netcat\" rel=\"tag\">netcat<\/a>, <a href=\"http:\/\/del.icio.us\/tag\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/del.icio.us\/tag\/udp\" rel=\"tag\">udp<\/a>, <a href=\"http:\/\/del.icio.us\/tag\/tcp%2Fip\" rel=\"tag\">tcp\/ip<\/a>, <a href=\"http:\/\/del.icio.us\/tag\/protocol\" rel=\"tag\">protocol<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace ya un mes comenc\u00e9 a trabajar en un proyecto nuevo para la compa\u00f1\u00eda en la cual trabajo, el cual consiste en crear una aplicaci\u00f3n en donde los analistas de mercado reciben transacciones de los corredores de bolsa. Dado que el n\u00famero de nombres que la compa\u00f1\u00eda maneja en esta categor\u00eda ha crecido de manera <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2008\/06\/30\/trucos-unix-depurando-protocolos-a-mano-%c2%bfque-usar\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[758,377,376,361,360],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1270"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=1270"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1270\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=1270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=1270"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=1270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}