{"id":3882,"date":"2020-11-21T10:07:09","date_gmt":"2020-11-21T09:07:09","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=3882"},"modified":"2020-11-21T10:07:10","modified_gmt":"2020-11-21T09:07:10","slug":"guacamole-docker-y-shorewall","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2020\/11\/21\/guacamole-docker-y-shorewall\/","title":{"rendered":"Guacamole, docker y shorewall"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:223,&quot;href&quot;:&quot;https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/Single_sign-on&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415115309\\\/https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/Single_sign-on&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>Y es que seg\u00fan voy aprendiendo m\u00e1s cosas sobre <em>docker<\/em>, su gesti\u00f3n de redes y el cortafuegos, voy retocando servicios para eliminar capas. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Y la primera que va a caer es precisamente <em>docker-compose<\/em>. No dudo de que tenga un gran valor pero toquetea la red para propocionar aislamiento a los contenedores y me est\u00e1 poniendo de los nervios. Est\u00e1 muy bien que te asegures de que est\u00e1n en otra red, con su puente y todo, pero es que necesito que adem\u00e1s de estar aislados tengan acceso a la red interna. Porque si no, no ser\u00e1n \u00fatiles. <\/p>\n\n\n\n<p>Y luego est\u00e1 que <em>docker-compose<\/em> a\u00f1ade una capa m\u00e1s con su correspondiente aprendizaje que no voy a emplear m\u00e1s que para este servicio por ahora. Prefiero entender mejor qu\u00e9 hace <em>docker<\/em> y c\u00f3mo gestionarlo. <\/p>\n\n\n\n<p>He creado un script y un archivo de configuraci\u00f3n para gestionar la ejecuci\u00f3n de ambos contenedores. Funciona bien y no es complicado de entender.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">\n#!\/usr\/bin\/env bash\n\n#   Variables\nVERSION=0.4\nDOCKER=\/usr\/bin\/docker\nCONFIG=\/etc\/guacamole\/guacamole.conf\nGUACAMOLE_ENV=\/etc\/guacamole\/guacamole.env\nNAME=\nIMAGE=\n\n#   Funciones\n_log() {\n    echo \"$* \" &gt;&amp;2 \n}\n\n_die() {\n    echo \"$0 ($VERSION): ERROR \" \"$*\" &gt;&amp;2 \n    exit 1\n}\n\n_read_env() {\n\tARCHIVO=$1\n\tENV=\"\"\n\n\tif [ ! -r \"$ARCHIVO\" ]; then\n\t\t_die \"no puedo leer $ARCHIVO\"\n\tfi\n\n\tfor var in $(egrep -v '\/#' $ARCHIVO)\n\tdo\n\t\tENV+=\"-e=$var \"\n\tdone\n\n\techo \"$ENV\"\n}\n\n_read_config() {\n\tif [ ! -r \"$CONFIG\" ]; then\n\t    _die \"necesito el archivo de configuraci\u00f3n en $CONFIG\"\n\telse\n\t\t_log \"Cargando configuraci\u00f3n de $CONFIG ... \"\n\t\t. \"$CONFIG\"\n\n\tfi\n}\n\n_start_docker() {\n    DOCKER_START=\"-d --rm=true --name=$NAME \\\n\t    $DNS \\\n\t    --network=bridge \\\n\t    --publish=$PORTS\"\n\t\n    _log \"Arrancando contenedor de $NAME($IMAGE) ... \"\n    $DOCKER run $DOCKER_START $EXTRA $IMAGE\n}\n\n_stop_docker() {\n    case \"$IAM\" in\n    guacamole)\n        NAME=$GUACAMOLE_NAME\n        ;;\n    guacd)\n        NAME=$GUACD_NAME\n        ;;\n    esac\n\n    _log \"Parando contenedor $NAME ...\" \n    $DOCKER stop $NAME\n}\n\n#   Qui\u00e9n soy \ncase $(basename $0) in \nguacamole-ctl)\n    IAM=\"guacamole\"\n    ;;\nguacd-ctl)\n    IAM=\"guacd\"\n    ;;\n*)\n    _die \"nombre de programa $0 err\u00f3neo\"\nesac\n\n#   Par\u00e1metros\nOP=$1\n\ncase \"$OP\" in \nstart) \n\t_read_config\n    case \"$IAM\" in \n    guacamole)\n        NAME=$GUACAMOLE_NAME\n        IMAGE=$GUACAMOLE_IMAGE\n        PORTS=$GUACAMOLE_PORTS\n        EXTRA=$(_read_env $GUACAMOLE_ENV)\n        EXTRA+=\"--link $GUACD_NAME -v \/etc\/guacamole:\/etc\/guacamole\"\n    ;;\n    guacd)\n        NAME=$GUACD_NAME\n        IMAGE=$GUACD_IMAGE\n        PORTS=$GUACD_PORTS\n    esac\n    _start_docker\n    ;;\nstop)\n\t_read_config\n    _stop_docker\n    ;;\n*)\n\t_log \"uso: $0 {start|stop}\"\n\texit 0\n\t;;\t\nesac\n\n\n\n\n<\/code><\/pre>\n\n\n\n<p>Este script se instala junto a un enlace simb\u00f3lico a s\u00ed mismo con el nombre del otro contenedor &#8211;<em>guacd<\/em>&#8211; y arranca o detiene seg\u00fan sea invocado. Los detalles curiosos est\u00e1n en el archivo de configuraci\u00f3n con los par\u00e1metros para arrancar el contenedor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">\n#\n#   Par\u00e1metros de arranque y parada del servicio\n#   guacamole empleando contenedores\n#\n\n#   Compartidos\nDNS=\"--dns=192.168.100.1\"\n\n#   Guacamole\nGUACAMOLE_IMAGE=guacamole\/guacamole\nGUACAMOLE_NAME=guacamole\nGUACAMOLE_PORTS=\"127.0.0.1:8080:8080\"\n\n#   Guacd\nGUACD_IMAGE=guacamole\/guacd\nGUACD_NAME=guacd\nGUACD_PORTS=\"4822:4822\"\n\n<\/code><\/pre>\n\n\n\n<p>Se respeta la red que crea y mantiene <em>docker<\/em> pero se les indica que el servidor de nombres es el de la red interna. Adem\u00e1s, se fuerza a que <em>guacamole<\/em> publique los puertos en la direcci\u00f3n local. Esto lo mismo no es estrictamente necesario en otras configuraciones pero esta m\u00e1quina hace de enrutador y tiene puentes y varias rutas que me estaban dando problemas. Hacerlo as\u00ed e indicar al servidor web que va a hacer de <em>proxy<\/em> que se conecte v\u00eda <code>http:\/\/localhost:8080<\/code> funciona perfectamente.<\/p>\n\n\n\n<p>Luego est\u00e1 la parte del cortafuegos. Como he dicho en esa m\u00e1quina la cosa est\u00e1 un poco complicada y la soluci\u00f3n m\u00e1s efectiva que he encontrado empleando <em>shorewall<\/em> es:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Definir una zona llamada <em>dock<\/em> de tipo <em>ipv4<\/em> (archivo <code>\/etc\/shorewall\/zones<\/code>).<\/li><li>Asignar a la zona el interface <em>docker<\/em> con las opciones <em>bridge<\/em> (archivo <code>\/etc\/shorewall\/interfaces<\/code>)<\/li><li>En la normativa de conexi\u00f3n entre zonas definir lo siguiente en el archivo <code>\/etc\/shorewall\/policy<\/code>:<ul><li>Permitir tr\u00e1fico entre la zona <em>dock<\/em> y la zona del cortafuegos <em>$FW<\/em>.<\/li><li>Permitir tr\u00e1fico entre la red local <em>loc<\/em> y el cortafuegos <em>$FW<\/em>. <\/li><\/ul><\/li><\/ol>\n\n\n\n<p>Y con \u00e9sto lo \u00fanico que me queda es que <em>guacamole<\/em> emplee el directorio LDAP para validar usuarios. No es que sea esencial pero me gustar\u00eda tenerlo porque llevo tiempo detr\u00e1s de instalar un mecanismo de acceso \u00fanico (<a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_sign-on\" target=\"_blank\">SSO<\/a>) y supongo que me facilitar\u00e1 el trabajo. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Y es que seg\u00fan voy aprendiendo m\u00e1s cosas sobre docker, su gesti\u00f3n de redes y el cortafuegos, voy retocando servicios para eliminar capas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[18,898,985,723,493,719],"class_list":["post-3882","post","type-post","status-publish","format-standard","hentry","category-software","tag-administracion-de-sistemas","tag-docker","tag-docker-compose","tag-guacamole","tag-shorewall","tag-systemd"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=3882"}],"version-history":[{"count":8,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3882\/revisions"}],"predecessor-version":[{"id":3933,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3882\/revisions\/3933"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=3882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=3882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=3882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}