Instalamos squid :
root@proxy:~# apt update && apt upgrade && apt install squid
Modificamos la configuración del proxy, en la que establecemos las redes y puertos que queremos permitir, así como el puerto de funcionamiento:
root@proxy:~# nano /etc/squid/squid.conf
acl localnet src 10.0.0.0/24
acl localnet src 192.168.200.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 21
acl CONNECT method CONNECT
http_access deny ! Safe_ports
http_access deny CONNECT ! SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
root@proxy:~# systemctl restart squid
Accedemos a la configuración de proxy del navegador y lo configuramos de manera que haga uso de la máquina servidora, para así poder controlar el tráfico desde la misma:
Tratamos de acceder a cualquier página para verificar que el proxy está funcionando y es accesible desde la máquina anfitriona:
Comprobamos los logs en la máquina squid para así verificar que dicha conexión ha dejado “rastro”:
root@proxy:~# cat /var/log/squid/access.log
1614336540.269 57635 192.168.200.1 TCP_TUNNEL/200 102191 CONNECT translate.googleapis.com:443 - HIER_DIRECT/216.58.215.138 -
1614336540.269 58196 192.168.200.1 TCP_TUNNEL/200 4433 CONNECT cdn.jsdelivr.net:443 - HIER_DIRECT/104.16.86.20 -
1614336540.269 58189 192.168.200.1 TCP_TUNNEL/200 7537 CONNECT translate.google.com:443 - HIER_DIRECT/216.58.209.78 -
1614336540.269 58023 192.168.200.1 TCP_TUNNEL/200 5801 CONNECT www.countryflags.io:443 - HIER_DIRECT/172.67.135.78 -
1614336540.271 58201 192.168.200.1 TCP_TUNNEL/200 3407 CONNECT cdnjs.cloudflare.com:443 - HIER_DIRECT/104.16.19.94 -
1614336540.271 60721 192.168.200.1 TCP_TUNNEL/200 705030 CONNECT www.alvarovf.com:443 - HIER_DIRECT/151.101.133.0 -
1614336540.922 128 192.168.200.1 TCP_MISS/200 818 POST http://ocsp.pki.goog/gts1o1core - HIER_DIRECT/216.58.211.227 application/ocsp-response
1614336540.929 130 192.168.200.1 TCP_MISS/200 818 POST http://ocsp.pki.goog/gts1o1core - HIER_DIRECT/216.58.211.227 application/ocsp-response
1614336540.946 194 192.168.200.1 TCP_TUNNEL/200 4692 CONNECT www.gstatic.com:443 - HIER_DIRECT/142.250.185.3 -
1614336540.957 134 192.168.200.1 TCP_MISS/200 818 POST http://ocsp.pki.goog/gts1o1core - HIER_DIRECT/216.58.211.227 application/ocsp-response
1614336540.975 200 192.168.200.1 TCP_TUNNEL/200 5630 CONNECT www.gstatic.com:443 - HIER_DIRECT/142.250.185.3 -
Tras ello, revertimos los cambios en el navegador para que vuelva a hacer uso del proxy según la configuración del sistema, para ahora proceder a configurar dicho proxy de forma general en el sistema, quedando de la siguiente forma:
Volvemos a acceder a otra página para verificar que la configuración del proxy en el sistema funciona:
Comprobamos los logs en la máquina squid para así verificar que dicha conexión ha dejado “rastro”:
root@proxy:~# cat /var/log/squid/access.log
1614336680.067 134 192.168.200.1 TCP_MISS/301 643 GET http://fp.josedomingo.org/ - HIER_DIRECT/37.187.119.60 text/html
1614336680.228 42 192.168.200.1 TCP_MISS/200 981 POST http://r3.o.lencr.org/ - HIER_DIRECT/212.230.153.18 application/ocsp-response
1614336685.463 0 192.168.200.1 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -
1614336686.465 6104 192.168.200.1 TCP_TUNNEL/200 1787 CONNECT fp.josedomingo.org:443 - HIER_DIRECT/37.187.119.60 -
1614336686.465 6104 192.168.200.1 TCP_TUNNEL/200 41333 CONNECT fp.josedomingo.org:443 - HIER_DIRECT/37.187.119.60 -
1614336686.465 6105 192.168.200.1 TCP_TUNNEL/200 9339 CONNECT fp.josedomingo.org:443 - HIER_DIRECT/37.187.119.60 -
1614336686.465 6106 192.168.200.1 TCP_TUNNEL/200 43692 CONNECT fp.josedomingo.org:443 - HIER_DIRECT/37.187.119.60 -
1614336686.466 6392 192.168.200.1 TCP_TUNNEL/200 26863 CONNECT fp.josedomingo.org:443 - HIER_DIRECT/37.187.119.60 -
Desde una máquina conectada a una red interna (sin salida al exterior mediante NAT), vamos a realizar determinadas pruebas, no sin antes establecer la correspondiente variable de entorno para que la máquina utilice el servidor proxy en cuestión:
root@buster:~# export http_proxy = 'http://10.0.0.10:3128'
Verificamos que tenemos salida al exterior a través de dicho proxy descargando el index.html de google:
root@buster:~# wget www.google.es
--2021-02-26 11:08:45-- http://www.google.es/
Connecting to 10.0.0.10:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [ text/html]
Saving to: ‘index.html’
index.html [ <=> ] 14.33K -- .-KB/s in 0s
2021-02-26 11:08:45 ( 63.8 MB/s) - ‘index.html’ saved [ 14675]
Pero sin embargo, no podemos hacerle ping:
root@buster:~# ping www.google.es
PING www.google.es ( 216.58.211.227) 56( 84) bytes of data.
^C
--- www.google.es ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 253ms
Vamos a añadir una lista negra a squid para evitar el tráfico hacia dichas páginas, para ello modificamos la configuración del servicio, quedando de la siguiente forma:
root@proxy:~# nano /etc/squid/squid.conf
acl localnet src 10.0.0.0/24
acl localnet src 192.168.200.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 21
acl CONNECT method CONNECT
acl domain_blacklist dstdomain "/etc/squid/domain_blacklist.txt"
http_access deny ! Safe_ports
http_access deny CONNECT ! SSL_ports
http_access allow localhost manager
http_access deny manager
http_access deny domain_blacklist
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
Dentro de dicha blacklist ponemos un sitio de ejemplo, como twitter.com y todos sus subdominios:
root@proxy:~# nano /etc/squid/domain_blacklist.txt
.twitter.com
root@proxy:~# systemctl restart squid
Si tratamos de acceder ahora a twitter.com ocurrirá lo siguiente:
En los logs, podremos apreciar lo siguiente:
root@proxy:~# cat /var/log/squid/access.log
1614338187.184 0 192.168.200.1 TCP_DENIED/403 3953 CONNECT twitter.com:443 - HIER_NONE/- text/html
Ahora, en lugar de configurar una blacklist, vamos a configurar una whitelist (solo se permiten las páginas indicadas explícitamente), quedando el fichero de configuración de la siguiente forma:
root@proxy:~# nano /etc/squid/squid.conf
acl localnet src 10.0.0.0/24
acl localnet src 192.168.200.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 21
acl CONNECT method CONNECT
acl domain_whitelist dstdomain "/etc/squid/domain_whitelist.txt"
http_access deny ! Safe_ports
http_access deny CONNECT ! SSL_ports
http_access allow localhost manager
http_access deny manager
http_access deny ! domain_whitelist
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
Dentro de dicha whitelist ponemos un sitio de ejemplo, como alvarovf.com y todos sus subdominios:
root@proxy:~# nano /etc/squid/domain_whitelist.txt
.alvarovf.com
root@proxy:~# systemctl restart squid
Si tratamos de acceder ahora a google.com ocurrirá lo siguiente:
Sin embargo, en alvarovf.com:
En los logs, podremos apreciar lo siguiente:
root@proxy:~# cat /var/log/squid/access.log
1614338729.105 0 192.168.200.1 TCP_DENIED/403 3962 CONNECT www.google.com:443 - HIER_NONE/- text/html
1614338754.926 56656 192.168.200.1 TCP_TUNNEL/200 702338 CONNECT www.alvarovf.com:443 - HIER_DIRECT/151.101.133.0 -
1614338755.060 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT cdnjs.cloudflare.com:443 - HIER_NONE/- text/html
1614338755.061 0 192.168.200.1 TCP_DENIED/403 3968 CONNECT cdn.jsdelivr.net:443 - HIER_NONE/- text/html
1614338755.061 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT cdnjs.cloudflare.com:443 - HIER_NONE/- text/html
1614338755.061 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT cdnjs.cloudflare.com:443 - HIER_NONE/- text/html
1614338755.061 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT cdnjs.cloudflare.com:443 - HIER_NONE/- text/html
1614338755.062 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.063 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.064 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.064 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.065 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.066 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT translate.google.com:443 - HIER_NONE/- text/html
1614338755.069 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.069 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.086 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.087 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.088 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.089 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.090 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.090 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.090 0 192.168.200.1 TCP_DENIED/403 3977 CONNECT www.countryflags.io:443 - HIER_NONE/- text/html
1614338755.091 0 192.168.200.1 TCP_DENIED/403 3980 CONNECT translate.google.com:443 - HIER_NONE/- text/html