<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[r.qo-op.cl]]></title><description><![CDATA[r.qo-op.cl]]></description><link>https://r.qo-op.cl/</link><image><url>https://r.qo-op.cl/favicon.png</url><title>r.qo-op.cl</title><link>https://r.qo-op.cl/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Sun, 19 Apr 2026 15:41:02 GMT</lastBuildDate><atom:link href="https://r.qo-op.cl/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[OBS Studio en Linux]]></title><description><![CDATA[<p>El siguiente post me tom&#xF3; un buen tiempo de configuraci&#xF3;n, m&#xE1;s por desconocimiento que por lo complejo, as&#xED; que decid&#xED; documentar cada paso con la idea del d&#xED;a de ma&#xF1;ana esto sea &#xFA;til para alguien.</p><p>Lo primero fue</p>]]></description><link>https://r.qo-op.cl/obs-studio-en-linux/</link><guid isPermaLink="false">66776d816a0c570001956dff</guid><category><![CDATA[debian]]></category><category><![CDATA[obs studio]]></category><category><![CDATA[virtual cam]]></category><category><![CDATA[flatpak]]></category><dc:creator><![CDATA[Roy Alvear]]></dc:creator><pubDate>Sun, 23 Jun 2024 00:56:28 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1663346532648-6a564bc6b273?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG9icyUyMHN0dXxlbnwwfHx8fDE3MTkxMDQ4OTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1663346532648-6a564bc6b273?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG9icyUyMHN0dXxlbnwwfHx8fDE3MTkxMDQ4OTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="OBS Studio en Linux"><p>El siguiente post me tom&#xF3; un buen tiempo de configuraci&#xF3;n, m&#xE1;s por desconocimiento que por lo complejo, as&#xED; que decid&#xED; documentar cada paso con la idea del d&#xED;a de ma&#xF1;ana esto sea &#xFA;til para alguien.</p><p>Lo primero fue encontrar que la versi&#xF3;n que est&#xE1; en los repositorios de debian 12 es una versi&#xF3;n de OBS Studio bastante vieja. As&#xED; que prob&#xE9; crear el paquete y otras yerbas que solamente me condujeron a dolores de cabeza, tras lo cual, opt&#xE9; por probar flatpak, el cual me dej&#xF3; gratamente sorprendido.</p><p>Instalando flatpak y el repositorio de flatpak:</p>
<pre><code class="language-shell">sudo apt install flatpak plasma-discover-backend-flatpak -y
flatpak remote-add --if-not-exists flathub \
  https://dl.flathub.org/repo/flathub.flatpakrepo
</code></pre>
<p>Una vez instalado eso se procede a instalar OBS Studio</p>
<pre><code class="language-bash">flatpak install com.obsproject.Studio \
                com.obsproject.Studio.Plugin.NDI \
                com.obsproject.Studio.Plugin.DroidCam \
                com.obsproject.Studio.Plugin.MoveTransition
</code></pre>
<p>Habilitando virtual cam o c&#xE1;mara virtual:</p>
<pre><code class="language-bash">sudo apt install -y v4l2loopback-dkms
sudo modprobe v4l2loopback video_nr=9 card_label=&quot;cam_obs&quot;
sudo cat &gt; /etc/modules-load.d/v4l2loopback.conf &lt;&lt; EOFload
v4l2loopback
EOFload
sudo cat &gt; /etc/modprobe/v4l2loopback.conf &lt;&lt; EOFprobe
options v4l2loopback video_nr=9 card_label=&quot;cam_obs&quot;
EOFprobe
</code></pre>
<p>Para probar la configuraci&#xF3;n anterior, se puede abrir OBS Studio, activar la &quot;camara virtual&quot; e ir a VLC a probar que se est&#xE9; transmitiendo.</p>]]></content:encoded></item><item><title><![CDATA[Administrando las IP de casa]]></title><description><![CDATA[<p>Hay muchos procesos dentro de la inform&#xE1;tica que parecen magia, por ejemplo, conectarse a Internet. &quot;M&#xE1;gicamente&quot; al seleccionar una red y poner su clave, puedes navegar, ver un video o escuchar m&#xFA;sica desde alg&#xFA;n &quot;rinc&#xF3;n&quot; de</p>]]></description><link>https://r.qo-op.cl/administrando-ip/</link><guid isPermaLink="false">65fb58c3f96916000137fb93</guid><category><![CDATA[dhcpd]]></category><category><![CDATA[isc dhcp server]]></category><category><![CDATA[linux]]></category><category><![CDATA[debian]]></category><category><![CDATA["servidor en casa"]]></category><dc:creator><![CDATA[Roy Alvear]]></dc:creator><pubDate>Thu, 21 Mar 2024 00:58:26 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1663789669038-ba180c8c155a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGh1ZWxsYXxlbnwwfHx8fDE3MTA5ODI3ODd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1663789669038-ba180c8c155a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGh1ZWxsYXxlbnwwfHx8fDE3MTA5ODI3ODd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Administrando las IP de casa"><p>Hay muchos procesos dentro de la inform&#xE1;tica que parecen magia, por ejemplo, conectarse a Internet. &quot;M&#xE1;gicamente&quot; al seleccionar una red y poner su clave, puedes navegar, ver un video o escuchar m&#xFA;sica desde alg&#xFA;n &quot;rinc&#xF3;n&quot; de Internet.</p><p>Para que estos procesos sean as&#xED; de simples, hubo gente que se quebr&#xF3; la cabeza pensando y creando servicios y configuraciones para que el &quot;usuario final&quot; solamente vea que el mundo se abre frente a sus ojos.</p><p>Uno de estos servicios es el DHCP, que es capaz de asignar IP a una maquina que se conecta a la red. Con una configuraci&#xF3;n muy simple de DHCP podemos asignar IP a todos quienes lleguen a conectarse, pero, que pasa si quiero tener siempre las mismas IP dentro de casa, por ejemplo, para controlar el acceso de los notebook/computador de los ni&#xF1;os a Internet en algunos horarios. Con DHCP puedo configurar personalizadamente la IP, los servidores de dominio y algunos otros detalles de cada equipo si lo deseo, de esta forma agregar filtros de contenido, entre otras cosas.</p><h3 id="instalando-el-servicio-dhcp">Instalando el servicio DHCP</h3><p>Lo primero es como de costumbre en debian, actualizar la fuente de datos de los programas que se pueden instalar.</p>
<pre><code class="language-bash">sudo apt update
</code></pre>
<p>Sugiero que si existen actualizaciones las apliquen <code>sudo apt dist-upgrade -y</code>, no es algo obligatorio, pero si sugerido fuertemente para asegurarse de estar con los &#xFA;ltimos parches de seguridad.</p>
<p>Instalar el servidor de DHCP:</p>
<pre><code class="language-bash">sudo apt install isc-dhcp-server -y
</code></pre>
<p>Instalar es solo la primer parte, de ah&#xED; hay que configurar el servicio para hacer lo que se desea, recomiendo no activar el servicio hasta tener hecha al menos la primer parte de la configuraci&#xF3;n.</p><h3 id="configurando-lo-b%C3%A1sico">Configurando lo b&#xE1;sico</h3><p>Lo primero es ir a revisar el archivo que nos crea de forma predeterminada la instalaci&#xF3;n. Este se encuentra en <strong>/etc/dhcp/dhcpd.conf</strong>. Se puede apreciar que trae muchas lineas comentadas, pero otras no, cuales son esas lineas:</p><pre><code>option domain-name &quot;example.org&quot;;
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;
</code></pre>
<p>La primera es el &quot;nombre de domino&quot; de mi red local, en este caso es &quot;example.org&quot;&quot;. La segunda, los servidores de nombre (es decir, quien me dice a cual IP corresponde  un nombre como &quot;google.com&quot;). La tercer linea indica el tiempo predeterminado que dura esta configuraci&#xF3;n entregada al equipo cliente(10 minutos), la siguiente el tiempo m&#xE1;ximo de la concesi&#xF3;n de la configuraci&#xF3;n (2 horas). La &#xFA;ltima linea nos indica el estilo en que se actualizar&#xE1; el servidor DNS Din&#xE1;mico de nuestro cliente, en esta configuraci&#xF3;n, no lo utiliza.</p><p>Toquemos la configuraci&#xF3;n, a mi red le quiero dar el dominio ficticio o local de &quot;alvear.home&quot;, quiero entregarle de forma predeterminada que resuelva con &quot;filtro&quot; de contenidos, por lo que usar&#xE9; los DNS &quot;Family protection servers AdGuard&quot; (94.140.14.15 y 94.140.15.16 m&#xE1;s detalles en: <a href="https://adguard-dns.io/?ref=r.qo-op.cl">https://adguard-dns.io</a>). Adem&#xE1;s deseo configurar la &quot;red&quot; en que vivir&#xE1;n mis equipos y cu&#xE1;l ser&#xE1; el rango din&#xE1;mico de las IP.</p><p>Mi red ser&#xE1; 192.168.0.0/23, es decir, tendr&#xE9; 510 IP disponibles para asignar. Mi router (de movistar) tiene la IP est&#xE1;tica 192.168.1.1, lo dejar&#xE9; tal cual, solo debo tener el cuidado de decirle que &#xE9;l ya no entregar&#xE1; las IP y cambiar la &quot;mascara de la subred&quot; a 255.255.254.0 que es la mascara que corresponde a la red 192.168.0.0/23.</p><figure class="kg-card kg-image-card"><img src="https://r.qo-op.cl/content/images/2024/03/movistarDHCPoff.jpg" class="kg-image" alt="Administrando las IP de casa" loading="lazy" width="917" height="506" srcset="https://r.qo-op.cl/content/images/size/w600/2024/03/movistarDHCPoff.jpg 600w, https://r.qo-op.cl/content/images/2024/03/movistarDHCPoff.jpg 917w" sizes="(min-width: 720px) 720px"></figure><p>El rango de asignaci&#xF3;n din&#xE1;mica de equipos de red, lo dejar&#xE9; de 125 IP usando el &#xFA;ltimo segmento de la red. No se si alg&#xFA;n d&#xED;a habr&#xE1;n tantas visitas en mi departamento de 50 m&#xB2;, pero mejor que sobre a que falte.</p><p>Como he instalado en mi peque&#xF1;o &quot;servidor&quot; la impresora, lo dejar&#xE9; como servidor predeterminado de impresi&#xF3;n. Agregar&#xE9; tambi&#xE9;n servidores de tiempo porque me agrada que mis equipos est&#xE9;n a la hora. Existen muchas opciones de configuraci&#xF3;n y quiz&#xE1;s en tu red necesites alguna otra y alguna que yo tengo no, te dejo el link por si quieres revisar (<a href="https://kb.isc.org/docs/isc-dhcp-41-manual-pages-dhcp-options?ref=r.qo-op.cl">https://kb.isc.org/docs/isc-dhcp-41-manual-pages-dhcp-options</a>)</p><pre><code># nombre de mi red interna
option domain-name &quot;alvear.home&quot;;

# servidores de Family protection servers AdGuard,
# en teor&#xED;a filtran sitios de adultos y publicidad
option domain-name-servers 94.140.14.15, 94.140.15.16;

# bajo los tiempos de entrega del servicio, eso har&#xE1; que
# busquen la configuraci&#xF3;n cada minuto, ideal si quiero cambiarla
# para que no puedan navegar en alg&#xFA;n momento.
default-lease-time 60;
max-lease-time 90;

# Usando el estandar de dns din&#xE1;mico
ddns-update-style standard;

# con el modo authoritative le indico que este servidor de DHCP es
# el que resuelve las direcciones IP, por lo que debe anunciarse como
# tal en la red enviando mensajes &quot;DHCPNAK&quot;
authoritative;

# indicando que usaremos los nombres declarativos de host
use-host-decl-names on;

# definici&#xF3;n de mi red o &quot;subred&quot; 192.168.0.0/23
subnet 192.168.0.0 netmask 255.255.254.0 {

  # IP que repartir&#xE1; entre las maquinas no conocidas
  range dynamic-bootp 192.168.1.129 192.168.1.254;
  
  # puerta de enlace o salida de la red
  option routers 192.168.1.1;
  
  # direcci&#xF3;n del broadcast o ultima IP de la red
  option broadcast-address 192.168.1.255;
  
  # Servidores de tiempo
  option ntp-servers 1.cl.pool.ntp.org, ntp.shoa.cl, debian.pool.ntp.org;
  
  # Servidor de impresi&#xF3;n
  option lpr-servers 192.168.0.1;
}
</code></pre>
<p>Finalmente, y algo no menor, hay que configurar la red del &quot;servidor&quot;, sino, tendremos un lindo caos.</p><p>Primero, editamos /etc/default/isc-dhcp-server, en donde su contenido ser&#xE1; en mi caso:</p><pre><code>INTERFACESv4=&quot;enp3s0&quot;
</code></pre>
<p>Porqu&#xE9; en mi caso, porque &quot;enp3s0&quot; es mi interfaz de red, en tu caso puede ser eth1 u otro dispositivo.</p><p>Siguiendo la misma l&#xF3;gica hay que editar el archivo /etc/network/interfaces para dejar nuestro servidor con una configuraci&#xF3;n est&#xE1;tica. En mi caso el archivo es el siguiente:</p><pre><code># This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
#iface enp3s0 inet dhcp
#

iface enp3s0 inet static
        address 192.168.0.1/23
        gateway 192.168.1.1
        dns-nameservers 8.8.4.4 8.8.8.8
        dns-search alvear.home

</code></pre>
<p>Ahora s&#xED;, estamos listos para activar el servicio.</p><pre><code class="language-bash">sudo systemctl enable isc-dhcp-server.service
sudo systemctl start isc-dhcp-server.service
sudo systemctl status isc-dhcp-server.service
</code></pre>
<p>Si todo les salio bien, la salida deber&#xED;a ser similar a este:</p>
<pre><code>&#x25CF; isc-dhcp-server.service - LSB: DHCP server
     Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
     Active: active (running) since Wed 2024-03-20 20:23:27 -03; 47min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1395233 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 9339)
     Memory: 13.1M
        CPU: 2.191s
     CGroup: /system.slice/isc-dhcp-server.service
             &#x2514;&#x2500;1395246 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf enp3s0

mar 20 21:10:52 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.0.255 from 78:2b:46:e8:9a:4f via enp3s0
mar 20 21:10:52 nuc dhcpd[1395246]: DHCPACK on 192.168.0.255 to 78:2b:46:e8:9a:4f via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.1.131 from e0:62:67:36:92:07 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPACK on 192.168.1.131 to e0:62:67:36:92:07 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.1.129 from 00:e9:3a:db:6c:a5 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPACK on 192.168.1.129 to 00:e9:3a:db:6c:a5 via enp3s0

</code></pre>
<h3 id="%C2%BFy-c%C3%B3mo-les-doy-siempre-la-misma-ip-a-mis-equipos">&#xBF;Y c&#xF3;mo les doy siempre la misma IP a mis equipos?</h3><p>Este segundo paso no es menor y puede a la verdad ser bastante tedioso si tienes muchos equipos en casa, pues hay que ir tomando la mac-address de cada uno de ellos. La mac-address es como la huella digital &#xFA;nica de cada dispositivo de red. (Se que se puede clonar y cambiar por software, pero en teor&#xED;a es &#xFA;nica).</p><p>En nuestro archivo /etc/dhcp/dhcpd.conf se  pueden agregar al final de lo que hicimos, los host para cada m&#xE1;quina de una forma similar a:</p><pre><code>host movistar { # hogar-net
  hardware ethernet e4:ab:89:ab:84:4e;
  fixed-address 192.168.1.1;
  option host-name &quot;movistar&quot;;
  option dhcp-client-identifier &quot;movistar&quot;;
}
</code></pre>
<p>y con eso van configurando equipo a equipo... pero, como les coment&#xE9; en la entrada anterior, me gustan los script y pens&#xE9;, la configuraci&#xF3;n es id&#xE9;ntica para cada equipo, con excepci&#xF3;n de los valores, podr&#xED;a hacer una planilla csv y luego crear un archivo de configuraci&#xF3;n, entonces, en vez de agregar host a host, mejor creo un archivo de host y solamente lo incluyo dentro de /etc/dhcp/dhcpd.conf, as&#xED; mi &#xFA;ltima linea es:</p><pre><code>include &quot;/etc/dhcp/host-home.conf&quot;;
</code></pre>
<p>el script &quot;net-host-config.sh&quot; que me crea el archivo de host es el siguiente:</p><pre><code class="language-bash">#!/bin/bash

rm -f host-home.conf

for i in $(cat net.csv); do
  IP=$(echo $i|awk -F&quot;;&quot; &apos;{print $1}&apos;)
  ID=$(echo $i|awk -F&quot;;&quot; &apos;{print $2}&apos;)
  HW=$(echo $i|awk -F&quot;;&quot; &apos;{print $3}&apos;)
  HN=$(echo $i|awk -F&quot;;&quot; &apos;{print $4}&apos;)
  KIND=$(echo $i|awk -F&quot;;&quot; &apos;{print $5}&apos;)
  if [ &quot;$IP&quot; = &apos;IP&apos; ]; then 
    echo &quot;writing...&quot;; 
  else
    echo -n &quot;host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \&quot;$HN\&quot;;\n  option dhcp-client-identifier \&quot;$ID\&quot;;\n}\n\n&quot; &gt;&gt; host-home.conf
  fi
done

echo &quot;restarting...&quot;
systemctl restart isc-dhcp-server.service

echo &quot;done.&quot;

</code></pre>
<p>La estructura del archivo &quot;net.csv&quot; que es la planilla de los dispositivos es esta, lo importante es el orden de las columnas y que est&#xE9; bien escrito</p><pre><code class="language-csv">IP;ID;HARDWARE;HOSTNAME;TIPO
192.168.0.120;lenovo-lan;b4:a9:fc:55:b6:73;laptop-Roy;laptop
192.168.0.121;lenovo-wifi;28:39:26:a9:59:81;laptop-Roy;laptop
192.168.0.122;hp-caro-lan;50:81:40:4a:93:53;laptop-Caro;laptop
192.168.0.123;hp-caro-wifi;00:e9:3a:db:6c:25;laptop-Caro;laptop
192.168.0.124;hp-jairo-lan;a0:d3:c1:ca:42:20;laptop-Jairo;laptop
192.168.0.125;hp-jairo-wifi;a4:db:30:aa:57:4a;laptop-Jairo;laptop
192.168.0.126;hp-vasti-lan;a0:1d:48:fc:30:d6;laptop-Vasti;laptop
192.168.0.127;hp-vasti-wifi;fc:f8:ae:5c:2d:39;laptop-Vasti;laptop
192.168.1.1;movistar;e4:ab:89:ab:84:4e;movistar;hogar-net
192.168.1.2;tenda;c8:3a:35:16:e3:71;tenda;hogar-net
192.168.1.3;MiWiFi-RC04;a4:a9:30:12:f0:f8;xiaomi-wifi;hogar-net
192.168.1.4;ESP_B6EBE3;a4:cf:12:ba:eb:e3;enchufe-1;hogar-enchufe
192.168.1.5;lumi-gateway-mgl03;54:ef:44:c8:45:d2;mi-gateway;hogar
192.168.1.6;google-home;00:f6:20:cb:2b:43;nest-home;hogar
192.168.1.7;chrome-cast;14:c1:4e:9b:cf:7a;tele;hogar
192.168.1.8;yeelink-vasti;44:23:7c:89:bf:33;luz-vasti;hogar-luz
192.168.1.9;yeelink-jairo;5c:e5:0c:82:1b:c5;luz-jairo;hogar-luz
192.168.1.10;philips-light-bulb_miio237741054;44:23:7c:b1:ea:fe;luz-puerta-1;hogar-luz
192.168.1.11;philips-light-bulb_miio237741345;44:23:7c:b1:fa:21;luz-puerta-2;hogar-luz
192.168.1.12;luz-papas1;d0:27:02:15:ad:de;luz-papas-1;hogar-luz
192.168.1.13;luz-papas2;d0:27:02:15:e7:d8;luz-papas-2;hogar-luz
192.168.1.14;lampara-caro;04:cf:8c:3c:a5:df;lampara-caro;hogar-luz
</code></pre>
<p>Obviamente ac&#xE1; deber&#xED;an ir tus dispositivos.</p><p>Finalmente, aplicamos los comandos:</p><pre><code class="language-bash">sudo su -
cd /etc/dhcp/
chmod +x net-host-config.sh
./net-host-config.sh
exit
</code></pre>
<p>Con eso, al cavo de un minuto ya deber&#xED;an estar tus dispositivos con sus nuevas IP.</p><h3 id="%C2%BFc%C3%B3mo-limito-el-trafico-en-alguna-hora-a-algunos-equipos">&#xBF;C&#xF3;mo limito el trafico en alguna hora a algunos equipos?</h3><p>Eso aun no lo he implementado, pero mi idea es simple. Dado a que le entregu&#xE9; &quot;nombre&quot; y &quot;tipo&quot; a las maquinas, modificar el archivo net-host-config.sh para que cree host &quot;fuera del estandar&quot;, asignando por ejemplo, una puerta de enlace que no sea tal, algo as&#xED; como:</p><pre><code class="language-bash">#!/bin/bash

rm -f host-home.conf

for i in $(cat net.csv); do
  IP=$(echo $i|awk -F&quot;;&quot; &apos;{print $1}&apos;)
  ID=$(echo $i|awk -F&quot;;&quot; &apos;{print $2}&apos;)
  HW=$(echo $i|awk -F&quot;;&quot; &apos;{print $3}&apos;)
  HN=$(echo $i|awk -F&quot;;&quot; &apos;{print $4}&apos;)
  KIND=$(echo $i|awk -F&quot;;&quot; &apos;{print $5}&apos;)
  if [ &quot;$IP&quot; = &apos;IP&apos; ]; then 
    echo &quot;writing...&quot;; 
  else
    TIPO=$(echo $KIND | cut -c1-6)
    if [ &quot;${TIPO}&quot; = &apos;laptop&apos; ]; then
      echo -n &quot;host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \&quot;$HN\&quot;;\n  option dhcp-client-identifier \&quot;$ID\&quot;;\n  option routers 192.168.0.2;\n  }\n\n&quot; &gt;&gt; host-home.conf
    else
      echo -n &quot;host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \&quot;$HN\&quot;;\n  option dhcp-client-identifier \&quot;$ID\&quot;;\n}\n\n&quot; &gt;&gt; host-home.conf
    fi
  fi
done

echo &quot;restarting...&quot;
systemctl restart isc-dhcp-server.service

echo &quot;done.&quot;
</code></pre>
<p>Para que todos los laptop tenga una puerta de enlace diferente. Claro est&#xE1;, es solo un bosquejo de la idea, pues aun eso no tiene un horario sino que es siempre.</p><p>Probablemente lo implemente en estos d&#xED;as, ya que comenzaron las clases, cuando lo tenga se los comparto.</p><p>Finalmente, por la configuraci&#xF3;n de firewall que hicimos en el post anterior (<a href="https://r.qo-op.cl/servidor-en-casa/">https://r.qo-op.cl/servidor-en-casa/</a>), no necesitamos modificar nada, pues dimos una confianza total en nuestra red.</p><p>&#xC9;xito!</p>]]></content:encoded></item><item><title><![CDATA[Proyecto: "servidor" en casa.]]></title><description><![CDATA[<p>S&#xED;, en este momento estas navegando y leyendo esto desde un peque&#xF1;o computador en mi casa. El costo, menos de 20 mil pesos chilenos (por el nombre de dominio), m&#xE1;s el plan de Internet de la casa. &#xBF;Quieres saber qu&#xE9; es lo que</p>]]></description><link>https://r.qo-op.cl/servidor-en-casa/</link><guid isPermaLink="false">65f869b1f96916000137fa80</guid><category><![CDATA["servidor en casa"]]></category><category><![CDATA[duckdns]]></category><category><![CDATA[casaos]]></category><category><![CDATA[nombre de dominio]]></category><category><![CDATA[dominio]]></category><dc:creator><![CDATA[Roy Alvear]]></dc:creator><pubDate>Mon, 18 Mar 2024 21:18:17 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1501618669935-18b6ecb13d6d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5NXx8YmxvZ3xlbnwwfHx8fDE3MTA3ODA0OTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1501618669935-18b6ecb13d6d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5NXx8YmxvZ3xlbnwwfHx8fDE3MTA3ODA0OTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Proyecto: &quot;servidor&quot; en casa."><p>S&#xED;, en este momento estas navegando y leyendo esto desde un peque&#xF1;o computador en mi casa. El costo, menos de 20 mil pesos chilenos (por el nombre de dominio), m&#xE1;s el plan de Internet de la casa. &#xBF;Quieres saber qu&#xE9; es lo que hice?</p><h3 id="la-historia-del-nombre-del-dominio">La historia del nombre del dominio</h3><p>Primero que todo, un nombre de dominio es el &quot;nombre base&quot; de un sitio web, por ejemplo, el de este blog es qo-op.cl, y tomando en cuenta el subdominio &quot;r&quot; es r.qo-op.cl.</p><p>El nombre de dominio nace de una forma anecd&#xF3;tica conversando con mis hijos (de 15 y 12 a&#xF1;os). </p><p>Como inform&#xE1;tico, con la idea de montar &quot;algo&quot; con mis hijos en casa, que les permita acceder desde cualquier lado donde est&#xE9;n, pens&#xE9; en poner a la &quot;casa&quot; un dominio corto de dos caracteres, algo as&#xED; como una letra y un n&#xFA;mero, en este momento encontr&#xE9; disponible&quot;y4&quot;, algo f&#xE1;cil de recordar para ellos y que no coincidiera alguna marca.</p><p>Al presentar mi &quot;brillante&quot; propuesta, mi primog&#xE9;nita respondi&#xF3;: -&#xBF;Podr&#xED;a el nombre ser una carita?-, mi reacci&#xF3;n interna fue &quot;Qu&#xE9;?!&quot;, pero dije -Solamente se pueden usar letras y n&#xFA;meros-. El resultado &quot;qo-op&quot; que es como una franja horizontal de una cara con lentes y orejas.</p><h3 id="%C2%BFqu%C3%A9-tecnolog%C3%ADa-hay-detr%C3%A1s">&#xBF;Qu&#xE9; tecnolog&#xED;a hay detr&#xE1;s?</h3>
<!--kg-card-begin: html-->
<div>El equipo es un NUC que se encuentra con <a href="https://debian.org/?ref=r.qo-op.cl" target="_blank">Debian</a> (siempre actualizado dentro de lo posible), con <a href="https://docs.docker.com/engine/install/debian/?ref=r.qo-op.cl#install-using-the-repository" target="_blank">docker</a> para subir contenedores con servicios y <a href="https://casaos.io/?ref=r.qo-op.cl" target="_blank">CasaOS</a> para administrarlo.</div>
<!--kg-card-end: html-->
<p>El dominio lo adquir&#xED; en nic.cl por un poco menos de 20 mil (que se paga cada dos a&#xF1;os), lo dem&#xE1;s es la conexi&#xF3;n a  Internet de mi casa y un NUC (Celeron&#xAE; &#xA0;N2830, con 8GB en RAM y un SDD de 2TB), equipo que le cambi&#xE9; la memoria y el disco para poder &quot;jugar&quot; con esto (inicialmente 4GB en RAM y disco Hdd de 420GB). </p><p>No explicar&#xE9; c&#xF3;mo instalar Debian, pues hay muchos lugares y videos que lo explican, yo hice una netinstall y no instal&#xE9; escritorio gr&#xE1;fico, pues la idea es que sea un servidor y no un PC de escritorio, as&#xED; que no quiero que se &quot;pierda&quot; RAM sirviendo la interfaz gr&#xE1;fica. La instalaci&#xF3;n de Docker y CasaOS es cortar y pegar (quiz&#xE1;s haga un escrito breve despu&#xE9;s), as&#xED; que me detendr&#xE9; un poco m&#xE1;s en c&#xF3;mo dej&#xE9; un dominio .cl apuntando a mi casa. Y luego en c&#xF3;mo es la instalaci&#xF3;n de los servicios en CasaOS.</p><h3 id="llegando-a-casa-con-un-nombre-de-dominio">Llegando a casa con un nombre de dominio</h3>
<!--kg-card-begin: html-->
<div>
  La &quot;magia&quot; de apuntar el dominio comprado en <a href="https://nic.cl/?ref=r.qo-op.cl" target="nic">nic</a> a mi casa, que tiene un internet casero, es decir, mi IP es variable (actualmente de movistar fibra), lo hice gracias a <a href="https://duckdns.org/?ref=r.qo-op.cl" target="duckdns">duckdns</a>, que es un DNS din&#xE1;mico que &quot;regala&quot; subdominios para poder usar en casa. Obviamente, entonces, existe un &quot;mi-subdominio-que-se-me-ocurrio.duckdns.org&quot; pero ese era un nombre largo y tedioso de recordar, por eso busqu&#xE9; un nombre &quot;personalizado&quot;.
</div>
<!--kg-card-end: html-->
<p>Este nuevo nombre, qo-oq.cl, en el servidor de nombre, le cre&#xE9; un alias en un servicio externo, sin embargo, bajo bind9 ser&#xED;a &quot;<strong>qo-op.cl IN CNAME subdominio.duckdns.org.</strong>&quot;, estoy pensando en hacer un servidor interno/externo dns en casa, pero a&#xFA;n no lo he hecho. Si lo hago, escribir&#xE9; la experiencia.</p><p>Con un cron se invoca la URL de duckdns para ir actualizando la IP, por ejemplo, creamos el archivo duck.sh en el directorio duckdns dentro del home y lo llamamos en el cron cada 5 minutos. En ese archivo habr&#xED;a que reemplazar &quot;token&quot; por el token entregado tras el registro.</p><p>vim ~/duckdns/duck.sh</p>
<pre><code class="language-bash">#!/bin/bash
TOK=&quot;token&quot;; 
echo url=&quot;https://www.duckdns.org/update?domains=subdominio&amp;token=$TOK&amp;ip=&quot; | curl -k -o ~/duckdns/duck.log -K -

</code></pre>
<p>crontab -e</p>
<pre><code>*/5 * * * * sh ~/duckdns/duck.sh &gt; /dev/null
</code></pre>
<p>Ahora, los que me conocen y saben que me gustan los archivos bash, y como en un principio no ten&#xED;a un dominio apuntando a casa, hab&#xED;a pedido los 5 subdominios que ofrece duckdns. por lo que hice un script distinto. Adem&#xE1;s, pensando en no hacer gastar de m&#xE1;s a duckdns con peticiones innecesarias, reviso localmente si mi ip ha cambiado, cosa de solicitar solo cuando cambie. Ahora, al llevar ese registro, adem&#xE1;s se qu&#xE9; tan seguido cambia mi IP.</p><p>Cree en /etc el directorio duckdns y all&#xED; el duck.sh, es decir</p>
<pre><code class="language-bash">sudo mkdir /etc/duckdns
sudo vim /etc/duckdns/duck.sh
</code></pre>
<p>El contenido del script es:</p>
<pre><code class="language-bash">#!/bin/bash

#set -e

# Los siguienets dos parametros cambian de usuario a usuario
TOKEN=&quot;mi_token_debo_ingresar_aca&quot;
SUBDOM=&quot;subdominio1 subdominio2 subdominio3 subdominio4 subdominio5&quot;

# directorio base de duckdns
DR=&quot;/etc/duckdns&quot;

FECHA=$(date +&quot;%Y-%m-%d %H:%M:%S UTC:%Z&quot;)
cd $DR

# crea un archivo si es que no existe
create_if_not_exist_file() {
        TestFile=$1
        if [ ! -f $TestFile ]; then
                touch $TestFile
        fi
}

# se asegura que existan los archivos necesarios
init() {
        create_if_not_exist_file $DR/duckdns.log
        create_if_not_exist_file $DR/mi-ip-actual.txt 
        create_if_not_exist_file $DR/mi-ip.txt
        for sub in $(echo $SUBDOM); do
                create_if_not_exist_file $DR/duck-${sub}.log
        done
}

# actualiza la ip en duckdns
actualizaDns() {
        httping -c 1 www.duckdns.org 2&gt;&amp;1 &gt; /dev/null
        if [ $? -eq 0 ]; then 
                for dom in $(echo $SUBDOM); do
                        echo url=&quot;https://www.duckdns.org/update?domains=$dom&amp;token=$TOKEN&amp;ip=&quot; | curl -s -k -o $DR/duck-${dom}.log -K -
                done
                return 0
        else
                return 1
        fi
}

# proceso principal
init
ping -q -c 1 -W 1 ip.9a.cl 2&gt;&amp;1 &gt; /dev/null
if [ $? -ne 0 ]; then
        echo &quot;$FECHA ERROR: Fall&#xF3; encontrando ip.9a.cl&quot; &gt;&gt; $DR/duckdns.log
        exit 1
else
        curl -s https://ip.9a.cl &gt; $DR/mi-ip.txt
        IP=$(cat $DR/mi-ip.txt)
        diff -N -q $DR/mi-ip-actual.txt $DR/mi-ip.txt &gt; /dev/null
        if [ $? -ne 0 ]; then
                actualizaDns
                if [ $? -eq 0 ]; then
                        echo &quot;$FECHA INFO: Actualizando IP a $IP&quot; &gt;&gt; $DR/duckdns.log
                        cp -au $DR/mi-ip.txt $DR/mi-ip-actual.txt
                else
                        echo &quot;$FECHA ERROR: Fall&#xF3; encontrando duckdns.org&quot; &gt;&gt; $DR/duckdns.log
                        exit 1
                fi
        fi
fi
exit 0
</code></pre>
<p>Para que el script anterior funcione bien debe estar instalado curl y httping es decir, hay que hacer un: <code>sudo apt install -y curl httping</code></p>
<p>La llamada por cron tambi&#xE9;n cambia por:</p>
<pre><code class="language-bash">sudo cat &gt; /var/spool/cron/crontabs/root &lt;&lt;EOF
# m h  dom mon dow   command
*/5 *  *   *   *     sh /etc/duckdns/duck.sh 2&gt;&amp;1 /dev/null
EOF
</code></pre>
<p>Con eso cuando cambia la direcci&#xF3;n IP de mi casa, actualiza mi subdominio de duckdns, y por el CNAME, indirectamente, mi dominio &quot;qo-op.cl&quot;</p><p>Finalmente el log (/etc/duckdns/duckdns.log) sera similar a:</p>
<pre><code>2024-02-20 09:55:01 UTC:-03 INFO: Actualizando IP a 201.246.63.98
2024-02-28 20:50:01 UTC:-03 ERROR: Fall&#xF3; encontrando ip.9a.cl
2024-02-29 07:20:01 UTC:-03 ERROR: Fall&#xF3; encontrando duckdns.org
2024-03-02 12:55:01 UTC:-03 INFO: Actualizando IP a 201.189.202.223
2024-03-05 15:55:01 UTC:-03 INFO: Actualizando IP a 201.189.198.124
2024-03-08 18:05:01 UTC:-03 ERROR: Fall&#xF3; encontrando ip.9a.cl
2024-03-08 18:10:01 UTC:-03 INFO: Actualizando IP a 201.189.198.110
2024-03-09 02:15:01 UTC:-03 ERROR: Fall&#xF3; encontrando ip.9a.cl
2024-03-15 00:10:01 UTC:-03 INFO: Actualizando IP a 201.189.223.154
</code></pre>
<p>Si quieres modificar el log para que quede en /var/log/duckdns, adelante, siempre hay cosas que mejorar, pero a mi me dio flojera porque vi que los cambios son lejanos, al menos en mi caso, por lo que no agregu&#xE9; un logrotate ni nada de eso.</p>
<h3 id="llego-a-casa-%C2%BFahora-qu%C3%A9">Llego a casa, &#xBF;ahora qu&#xE9;?</h3><p>Lo primero que debes tener en cuenta es la configuraci&#xF3;n de &quot;tu router&quot; o el router que instala en casa la compa&#xF1;&#xED;a proveedora de Internet, dado a que debes dirigir puertos o la navegaci&#xF3;n completa al equipo que dejar&#xE1;s de servidor. Lo segundo, dado a que vas a abrir tu servidor al mundo, debes tener protecci&#xF3;n.</p><p>[Lo importante de este p&#xE1;rrafo, mi red interna es 192.168.0.0/23] Cambi&#xE9; la configuraci&#xF3;n del DHCP de 192.168.1.0/24 a 192.168.0.0/23, &#xBF;porqu&#xE9;? porque en casa tengo muchas IP y las quer&#xED;a dejar ordenadas, no tengo tanto dispositivo como para llenar las 510 IP, pero quer&#xED;a dividir los fonos, tablet y notebook de los &quot;smart home&quot;, no dejan de ser 9 luces, un enchufe, una lavadora, 2 puntos de acceso wifi, 3 c&#xE1;maras, una central de monitoreo de dispositivos bluetooth (temperatura, humedad, humo), un google nest y un google chromecast, m&#xE1;s el router, es la suficiente cantidad como para tenerlos por aparte de los otros equipos que se conectan a Internet a &quot;navegar&quot;. Como el equipo de movistar (el router) no era capaz de manejar tanto dispositivo, termin&#xE9; instalando un DHCP propio. As&#xED; lograr asignar IP fija por sus mac address. Prometo que lo documentar&#xE9; en otro post.</p><p>&#xBF;Porqu&#xE9; tanto bla bla?, para que entiendas mejor algunas reglas de mi firewall, pues dado a que estas abriendo tu equipo al mundo, le debes colocar protecci&#xF3;n. Particularmente, us&#xE9; el firewall predeterminado de Debian 12 &quot;nftables&quot;, que se plantea como el sucesor de &quot;iptables&quot;. Debo reconocer que iptables tras tantos a&#xF1;os lo entend&#xED;a bien, el cambio no me fue f&#xE1;cil. Mi dispositivo de red es &quot;enp3s0&quot;, pero puede cambiar en el tuyo. </p><p>Qu&#xE9; puertos estoy abriendo al mundo, el 22, el 80 y el 443. De los cuales el 80 y 443 los estoy dejando abiertos desde los servicios prestados por docker. Esto es muy importante de tener en cuenta, pues cualquier cosa que instales all&#xED; queda abierta al mundo, por ejemplo, tu impresora, tu c&#xE1;mara o tus respaldos. En la tabla &quot;filter&quot; chain INPUT est&#xE1; permitido todo el tr&#xE1;fico propio, el de mi red (192.168.0.0/23) y el de la red docker (172.16.0.0/12). En el chain FORWARD, env&#xED;o el trafico al chain DOCKER-USER, en donde filtro prohibiendo todo trafico que venga desde fuera de mi red que llegue a mi tarjeta de red &quot;enp3s0&quot; (la que est&#xE1; conectada al router), aceptando previamente solo el trafico establecido y los puertos 80 y 443, que los manejo desde CasaOS.</p><p>cat /etc/nftables.conf</p>
<pre><code>#!/usr/sbin/nft -f
 
flush ruleset

table ip filter {
        chain INPUT {
                type filter hook input priority filter; policy drop;
                ct state established,related accept
                iifname &quot;lo&quot; accept
                icmp type echo-request accept
                ip saddr 192.168.0.0/23 accept
                ip saddr 172.16.0.0/12 accept
                tcp dport { 22, 80, 443 } accept
        }

        chain FORWARD {
                type filter hook forward priority filter; policy accept;
                counter packets 187799153 bytes 64671916463 jump DOCKER-USER
        }

        chain OUTPUT {
                type filter hook output priority filter; policy accept;
        }

        chain DOCKER {
        }

        chain DOCKER-ISOLATION-STAGE-1 {
        }

        chain DOCKER-ISOLATION-STAGE-2 {
        }

        chain DOCKER-USER {
                tcp dport { 80, 443 } accept
                ct state established,related accept
                iifname &quot;enp3s0&quot; ip saddr != 192.168.0.0/23 drop
        }
}

table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
        }

        chain PREROUTING {
                type nat hook prerouting priority dstnat; policy accept;
        }

        chain OUTPUT {
                type nat hook output priority -100; policy accept;
        }
}
</code></pre>
<p>Otra cosa, si bien, nft qued&#xF3; instalado junto con la instalaci&#xF3;n inicial de mi Debian, deb&#xED; dejarlo activo, esto se hace as&#xED;:</p>
<pre><code class="language-bash">sudo systemctl enabled nftables.service
</code></pre>
<p>Al revisar el archivo del servicio <code>/lib/systemd/system/nftables.service</code>, se puede observar que el lugar desde donde carga sus reglas es <strong>/etc/nftables.conf</strong> que es el archivo que creamos all&#xED; arriba.</p>
<h3 id="servicios-en-casaos">Servicios en CasaOS</h3><p>B&#xE1;sicamente en CasaOS, lo primero que hice fue sacar CasaOS del puerto 80, as&#xED; liberarlo para el proxy reverso. para eso fui a los ajustes (el que tiene el icono como un ecualizador), y cambi&#xE9; el &quot;Language&quot; a Espa&#xF1;ol, el &quot;Puerto de la WebUI&quot; a 180... puede ser realmente cualquiera menos el 80 y 443 que queremos dejar libres.</p><figure class="kg-card kg-image-card"><img src="https://r.qo-op.cl/content/images/2024/03/casaos-ajustes.png" class="kg-image" alt="Proyecto: &quot;servidor&quot; en casa." loading="lazy" width="589" height="648"></figure><p> Luego, instal&#xE9; un &quot;Nginx proxy manager&quot;. Para eso hice click en la &quot;App Store&quot; y en el buscador puse &quot;proxy&quot;.</p><figure class="kg-card kg-image-card"><img src="https://r.qo-op.cl/content/images/2024/03/casaos-buscador.png" class="kg-image" alt="Proyecto: &quot;servidor&quot; en casa." loading="lazy" width="1277" height="495" srcset="https://r.qo-op.cl/content/images/size/w600/2024/03/casaos-buscador.png 600w, https://r.qo-op.cl/content/images/size/w1000/2024/03/casaos-buscador.png 1000w, https://r.qo-op.cl/content/images/2024/03/casaos-buscador.png 1277w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://r.qo-op.cl/content/images/2024/03/nginx-proxy-manager.png" class="kg-image" alt="Proyecto: &quot;servidor&quot; en casa." loading="lazy" width="316" height="117"></figure><p>Luego puse &quot;instalar&quot; en el bot&#xF3;n de &quot;Nginx proxy manager&quot; (en el mio dice Abrir porque ya est&#xE1; instalado). Desde all&#xED;, se puede dirigir la configuraci&#xF3;n de cualquier servicio web que se instale desde el interior de nuestro &quot;servidor&quot; hacia Internet, por ejemplo, yo instal&#xE9; ghost, que es este blog, el cual desde &quot;Nginx proxy manager&quot; lo apunto as&#xED;:</p><figure class="kg-card kg-image-card"><img src="https://r.qo-op.cl/content/images/2024/03/proxy-r.qo-op.cl.png" class="kg-image" alt="Proyecto: &quot;servidor&quot; en casa." loading="lazy" width="489" height="540"></figure><p>Importante, la direcci&#xF3;n r.qo-op.cl la agregu&#xE9; tambi&#xE9;n en el servidor de nombres con un CNAME a qo-op.cl. </p><p>Una de las grandes ventajas de &quot;Nginx proxy manager&quot; es que est&#xE1; integrado con &quot;Let&apos;s Encrypt&quot; para tener Certificados SSL y as&#xED; tu p&#xE1;gina este cifrada y con acceso https.</p><p>Algo que me encant&#xF3; de CasaOS es que no est&#xE1; cerrado solamente a instalar aplicaciones desde el &quot;App Store&quot;, sino que mediante el bot&#xF3;n &quot;+&quot; puedes hacer una instalaci&#xF3;n de cualquier docker-compose, por ejemplo, para mi ghost, instal&#xE9; desde el &quot;App Store&quot; la base de datos MariaDB y mediante el docker-compose ghost.</p><pre><code class="language-yaml">name: ghost
services:
  ghost:
    cpu_shares: 90
    command: []
    container_name: ghost
    deploy:
      resources:
        limits:
          memory: 512M
    environment:
      - database__client=mysql
      - database__connection__database=ghost
      - database__connection__host=192.168.0.255
      - database__connection__password=**********
      - database__connection__user=********
      - mail__options__auth__pass=******
      - mail__options__auth__user=******
      - mail__options__host=******
      - mail__options__port=***
      - mail__options__service=*******
      - mail__transport=SMTP
      - url=https://r.qo-op.cl
      - admin__url=http://192.168.0.255:2368
    hostname: ghost
    image: ghost:latest
    ports:
      - target: 2368
        published: &quot;2368&quot;
        protocol: tcp
    restart: unless-stopped
    volumes:
      - type: bind
        source: /DATA/AppData/ghost/content
        target: /var/lib/ghost/content
    devices: []
    cap_add: []
    network_mode: bridge
    privileged: false
x-casaos:
  author: Roy
  category: Blog
  hostname: &quot;&quot;
  icon: https://portainer-io-assets.sfo2.digitaloceanspaces.com/logos/ghost.png
  index: /
  port_map: 2368
  scheme: http
  store_app_id: ghost
  title:
    custom: Ghost
</code></pre>
<p>Mi archivo es este, pero en vez de los ***** tiene los valores de configuraci&#xF3;n. Mi Host o servidor, tiene la IP 192.168.0.255, y s&#xED;, en una red /23, esa direcci&#xF3;n es v&#xE1;lida.</p><p>&#xC9;xito en su implementaci&#xF3;n.</p>]]></content:encoded></item></channel></rss>