Instalación de squid como proxy para YUM

En entornos con multitud de servidores GNU/Linux la gestión de las actualizaciones debe ser un proceso a tener en cuenta. Si queremos actualizar una gran cantidad de servidores, la conexión a Internet puede no ser suficiente o incluso podemos afectar a servicios productivos saturando el ancho de banda. Para solventar este punto está la opción de utilizar repositorios locales. En algunos casos, como las distribuciones derivadas de Debian, se puede poner un proxy cache de los paquetes(aptProxy), el cual se descargará únicamente los paquetes que no se haya descargado con anterioridad.

A diferencia de los sistemas Debian y sus derivados, con Red Hat, no tenemos la opción de tener un proxy cache de paquetes . Siempre podemos tener una copia del repositorio de la distribución que usemos pero es una opción que requiere de un servidor con gran cantidad de espacio en disco y con paquetes que muy probablemente no vayamos a necesitar.
Para tener una solución parecida a la del aptProxy, se puede utilizar Squid como proxy al cual lo configuraremos en el fichero yum.conf de nuestros servidores. 
La instalación es muy sencilla desde yum:
[root@yumrepo ~]# yum install squid 
A continuación lo configuraremos editando el fichero /etc/squid/squid.conf. Básicamente lo que haremos será crear una ACL (localnet) para controlar quien puede utilizar el proxy y donde especificaremos los segmentos donde tenemos servidores instalados. También crearemos una ACL (GoodSites) para controlar a donde se puede conectar el proxy para descargar paquetes.Esta ACL leerá de un fichero los dominios permitidos:
[root@yumrepo ~]# vi /etc/squid/squid.conf
#
# Recommended minimum configuration:
#
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 192.168.1.0/24 # RFC1918 possible internal network
acl localnet src 192.168.2.0/24 # RFC1918 possible internal network
acl localnet src 192.168.3.0/24 # RFC1918 possible internal network
acl localnet src 192.168.4.0/24 # RFC1918 possible internal network
acl localnet src 192.168.5.0/24 # RFC1918 possible internal network
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
#http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on “localhost” is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
acl GoodSites dstdomain “/etc/squid/allowed-sites.squid”
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet GoodSites
http_access allow localhost GoodSites

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# set visible_hostname
visible_hostname yumrepo.enterprise.com

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 25000 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid
# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

El fichero de la ACL GoodSites será el siguiente:
[root@yumrepo ~]# vi /etc/squid/allowed-sites.squid
.centos.com
.oracle.com
.vmware.com

De esta forma, solo podrá bajar paquetes RPM de esos dominios.

A continuación configuraremos el servicio para que arranque tras un reinicio del servidor:

[root@yumrepo ~]# chkconfig squid –list
squid 0:off 1:off 2: off 3: off 4: off 5: off 6:off
[root@yumrepo ~]# chkconfig squid on
[root@yumrepo ~]# chkconfig squid –list
squid 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Un tema importante es la cache. El directorio donde estará ubicada se especifica en el archivo de configuración, así como el tamaño máximo que puede tener y el periodo de validez de la misma. En nuestro caso, al tratarse de un servicio que se usará para descargar software, se presupone que el volumen necesario será alto, por tanto optamos por asignar un disco y especificar el directorio de la cache como punto de montaje. Crearemos un volumen lógico para poder ser ampliado en un futuro con facilidad y editaremos el /etc/fstab para que se monte tras un reinicio:

[root@yumrepo ~]# fdisk /dev/sdb
[root@yumrepo ~]# partprobe -s

[root@yumrepo ~]# pvcreate /dev/sdb1
[root@yumrepo ~]# vgcreate repo-vg /dev/sdb1
[root@yumrepo ~]# vgdisplay
— Volume group —
VG Name repo-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 30,00 GiB
PE Size 4,00 MiB
Total PE 7679
Alloc PE / Size 7679 / 30,00 GiB
Free PE / Size 0 / 0
VG UUID qapuNn-QQv4-psKa-lSTh-JsJZ-hS3j-Js6bjf
[root@yumrepo ~]# lvcreate -l 100%FREE repo-vg
[root@yumrepo ~]# lvrename /dev/repo-vg/lvol0 /dev/repo-vg/repo-lv01
[root@yumrepo ~]# lvdisplay
— Logical volume —
LV Path /dev/repo-vg/repo-lv01
LV Name repo-lv01
VG Name repo-vg
LV UUID nG55k1-k62o-UGZf-B6Pi-WTb6-vlI5-FRqzWL
LV Write Access read/write
LV Creation host, time ol6Template, 2014-04-14 14:43:56 +0200
LV Status available
# open 1
LV Size 30,00 GiB
Current LE 7679
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 252:2
[root@yumrepo ~]# mkfs.ext4 /dev/repo-vg/repo-lv01
[root@yumrepo ~]# mount /dev/repo-vg/repo-lv01 /var/spool/squid
[root@yumrepo ~]# vi /etc/fstab
/dev/repo-vg/repo-lv01 /var/spool/squid ext4 defaults 1 1Arranque del servicio

Una vez montado el directorio de la cache se crean los directorios que utilizará squid:
[root@yumrepo ~]# squid -z
[root@yumrepo ~]# ls -l /var/spool/squid
total 68
drwxr-x—. 258 squid squid 4096 abr 14 15:05 00
drwxr-x—. 258 squid squid 4096 abr 14 15:05 01
drwxr-x—. 258 squid squid 4096 abr 14 15:05 02
drwxr-x—. 258 squid squid 4096 abr 14 15:05 03
drwxr-x—. 258 squid squid 4096 abr 14 15:05 04
drwxr-x—. 258 squid squid 4096 abr 14 15:05 05
drwxr-x—. 258 squid squid 4096 abr 14 15:05 06
drwxr-x—. 258 squid squid 4096 abr 14 15:05 07
drwxr-x—. 258 squid squid 4096 abr 14 15:05 08
drwxr-x—. 258 squid squid 4096 abr 14 15:05 09
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0A
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0B
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0C
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0D
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0E
drwxr-x—. 258 squid squid 4096 abr 14 15:05 0F
-rw-r—–. 1 squid squid 2880 abr 28 18:20 swap.state
El último paso será arrancar el servicio y verificar que está escuchando en el puerto por defecto.

[root@yumrepo ~]# service squid start
Starting squid: . [ OK ]
[root@yumrepo ~]# netstat -ant | grep 3128
tcp 0 0 :::3128 :::* LISTEN

En los clientes bastará con añadir la siguiente línea en el fichero /etc/yum.conf:
proxy=http://X.X.X.X:3128 

Si lanzamos dos actualizaciones en clientes diferentes veremos que la segunda va mucho mas rápido que la primera y que los directorios de la cache empiezan a tener uso.