Как установить и настроить прокси-сервер Squid в Ubuntu - Академия Selectel

Как установить и настроить прокси-сервер Squid в Ubuntu

Рассказываем о том, как установить и настроить шлюзы сети. А также подробно разбираем установку и настройку прокси-сервера Squid.

Введение

В этому мануале рассмотрим установку и настройку прокси-сервера Squid. Инсталляцию установим на операционную систему Ubuntu 20.04 семейства Linux и коротко рассмотрим, как установить на Windows. Также в этой инструкции мы расскажем, как использовать сервер в качестве шлюза для сети.

О Squid

Это кэширующий прокси-сервер для интернета, поддерживающий HTTP, HTTPS, FTP и не только. Он снижает пропускную способность и улучшает время отклика за счет кэширования и повторного использования часто запрашиваемых веб-страниц.

У Squid широкие возможности контроля доступа и он является отличным ускорителем сервера. Он работает на большинстве доступных операционных систем, включая Windows, и лицензируется по лицензии GNU GPL.

По-простому 一 это прокси-сервер, посредник между клиентом (компьютером пользователя) и ресурсом (сайтом, сервером). Клиент отправляет запрос к ресурсу через прокси-сервер, который, в свою очередь, либо делает запрос от своего имени и возвращает ответ клиенту, либо берет его из кэша.

Пример
Отец отправляет ребенка в конкретный магазин за хлебом. Ребенок знает, где расположен магазин, идет и покупает хлеб от своего имени и несет хлеб домой. Это пример работы прокси-сервера с использованием кэша. Если немного изменить ситуацию и ребенок не знает, где магазин, он его находит и возвращается домой с хлебом. Это пример работы прокси-сервера без использования кэша. При правильной настройке ребенок запомнит местоположение магазина, а мы получим кэширующий прокси-сервер.

Теперь следует немного разобраться с настройками сети в Ubuntu 20.04. В случае простой настройки прокси-сервера для анонимизации нам потребуется сервер с одним сетевым интерфейсом. В нашем случае сервер будет настроен как простой шлюз, через который будут проходить запросы клиентов, поэтому сетевых интерфейсов потребуется 2.

Настройка сети

Предварительная настройка сети

Предварительно настроим сетевые интерфейсы. В используемой для создания мануала системе два физических сетевых интерфейса: eth0 и eth1. Они будут настроены следующим образом: eth0 будем использовать для работы в сети интернет, а eth1 настроим на взаимодействие с локальной сетью. Настройку производим с использованием утилиты Netplan. Этот инструмент является предпочтительным начиная с релиза Ubuntu 17.10. Настройка происходит методом создания файла конфигурации формата yaml. Создадим файл конфигурации:


    sudo nano /etc/netplan/02-networkd.yaml

И установим следующие настройки:


    network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
    eth1:
      dhcp4: false
      addresses : [192.168.0.1/24]
      nameservers:
          addresses: [8.8.8.8]

Yaml требует строгого соблюдения пробелов, отступов и табуляции. Очень важно это учитывать при составлении файла конфигурации. Для интерфейса eth0 установлено получение адреса по dhcp, интерфейсу eth1 назначен статический IP-адрес. Проверим конфигурацию на валидность командой:


    sudo netplan --debug generate

При наличии ошибок, необходимо исправить. Если все верно, применяем конфигурацию командой:


    sudo netplan --debug apply

Применить конфигурацию без вывода ошибок можно так:


    sudo netplan apply

DHCP

Для получения адресов в сети за шлюзом динамически используется DHCP-сервер. В данном случае будут выдаваться адреса клиентам, которые подключены через интерфейс eth1. Инсталляция DHCP-сервера происходит с использованием команды:


    sudo apt install isc-dhcp-server -y

Опция -y используется для положительных ответов во время установки. Вывод:


    Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libirs-export161 libisccfg-export163
Suggested packages:
  isc-dhcp-server-ldap policycoreutils
Recommended packages:
  isc-dhcp-common
The following NEW packages will be installed:
  isc-dhcp-server libirs-export161 libisccfg-export163
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 519 kB of archives.
After this operation, 1865 kB of additional disk space will be used.
Do you want to continue? [Y/n] ^C
vlan48@apachi:~$ sudo apt install isc-dhcp-server -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libirs-export161 libisccfg-export163
Suggested packages:
  isc-dhcp-server-ldap policycoreutils
Recommended packages:
  isc-dhcp-common
The following NEW packages will be installed:
  isc-dhcp-server libirs-export161 libisccfg-export163
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 519 kB of archives.
After this operation, 1865 kB of additional disk space will be used.
Get:1 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 libisccfg-export163 amd64 1:9.11.16+dfsg-3~ubuntu1 [45.9 kB]
Get:2 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 libirs-export161 amd64 1:9.11.16+dfsg-3~ubuntu1 [18.6 kB]
Get:3 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 isc-dhcp-server amd64 4.4.1-2.1ubuntu5.20.04.2 [455 kB]
Fetched 519 kB in 0s (5765 kB/s)
Preconfiguring packages ...
Selecting previously unselected package libisccfg-export163.
(Reading database ... 54507 files and directories currently installed.)
Preparing to unpack .../libisccfg-export163_1%3a9.11.16+dfsg-3~ubuntu1_amd64.deb ...
Unpacking libisccfg-export163 (1:9.11.16+dfsg-3~ubuntu1) ...
Selecting previously unselected package libirs-export161.
Preparing to unpack .../libirs-export161_1%3a9.11.16+dfsg-3~ubuntu1_amd64.deb ...
Unpacking libirs-export161 (1:9.11.16+dfsg-3~ubuntu1) ...
Selecting previously unselected package isc-dhcp-server.
Preparing to unpack .../isc-dhcp-server_4.4.1-2.1ubuntu5.20.04.2_amd64.deb ...
Unpacking isc-dhcp-server (4.4.1-2.1ubuntu5.20.04.2) ...
Setting up libisccfg-export163 (1:9.11.16+dfsg-3~ubuntu1) ...
Setting up libirs-export161 (1:9.11.16+dfsg-3~ubuntu1) ...
Setting up isc-dhcp-server (4.4.1-2.1ubuntu5.20.04.2) ...
Generating /etc/default/isc-dhcp-server...
Created symlink /etc/systemd/system/multi-user.target.wants/isc-dhcp-server.service → /lib/systemd/system/isc-dhcp-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/isc-dhcp-server6.service → /lib/systemd/system/isc-dhcp-server6.service.
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
Processing triggers for systemd (245.4-4ubuntu3.13) …

После установки отредактируем файл конфигурации DHCP-сервера, который находится: /etc/dhcp/dhcpd.conf.

Отправляем команду:


    sudo nano /etc/dhcp/dhcpd.conf

Файл конфигурации по умолчанию выглядит так:


    # dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# Attention: If /etc/ltsp/dhcpd.conf exists, that will be used as
# configuration file instead of this file.
#

# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

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

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
#log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

#subnet 10.152.187.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.

#subnet 10.254.239.0 netmask 255.255.255.224 {
#  range 10.254.239.10 10.254.239.20;
#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
#}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.
#subnet 10.254.239.32 netmask 255.255.255.224 {
#  range dynamic-bootp 10.254.239.40 10.254.239.60;
#  option broadcast-address 10.254.239.31;
#  option routers rtr-239-32-1.example.org;
#}

# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option subnet-mask 255.255.255.224;
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.example.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.example.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.
#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}

Добавим в конфигурацию вот такой блок директив:

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.50 192.168.0.250; 
  option domain-name-servers 8.8.8.8;
  option domain-name "selectel.loc"; 
  option routers 192.168.0.1; 
  default-lease-time 7200; 
  max-lease-time 7200; 
}
  • subnet 192.168.0.0 netmask 255.255.255.0 — подсеть, в которой будет работать DHCP;
  • range 192.168.0.50 192.168.0.250; диапазон выдаваемыех ip-адресов;
  • option domain-name-servers 8.8.8.8; dns-сервер;
  • option domain-name «selectel.loc»; — домен;
  • option routers 192.168.0.1; — шлюз;
  • default-lease-time 7200; — время аренды IP-адреса;
  • max-lease-time 7200; — максимальное время аренды IP-адреса.

В настраиваемой системе два сетевых интерфейса, поэтому в файле /etc/default/isc-dhcp-server необходимо указать интерфейс через который будет происходить выдача адресов DHPC-сервером.


    sudo nano /etc/default/isc-dhcp-server

Файл в дефолтном виде выглядит вот так:

# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#       Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4=""
INTERFACESv6=""

Исправим строку INTERFACESv4=»», добавив сюда сетевой интерфейс. INTERFACESv4=»eth1″.

Команды, которые пригодятся при работе с DHCP-сервером.

Для запуска сервера:


    sudo /etc/init.d/isc-dhcp-server start

Для остановки сервера:


    sudo /etc/init.d/isc-dhcp-server stop 

Для перезапуска сервера:


    sudo /etc/init.d/isc-dhcp-server restart

Запустим DHCP-сервер командой, указанной выше.

Вывод:


    Starting isc-dhcp-server (via systemctl): isc-dhcp-server.service.

Теперь в локальной сети клиенты будут получать IP-адреса из пула 192.168.0.50-192.168.0.250. Специально оставляем адреса 192.168.0.2-192.168.0.49 для использования их в будущем в качестве статических на ресурсах локальной сети, на которых статика необходима. 

NAT

NAT позволяет осуществлять выход в интернет с использованием одного публичного IP-адреса, множеством клиентов локальной сети. Первое, что требуется сделать, включить прохождение трафика между сетевыми интерфейсами сервера. По умолчанию IP forwarding выключен. Оценить состояние можно, проверив его файл с настройками, он расположен по следующему пути:


    /proc/sys/net/ipv4/ip_forward

Для проверки используется утилита cat. При ее использовании в консоли отображается наполнение файла, который она просматривает.


    cat /proc/sys/net/ipv4/ip_forward

Вывод по умолчанию: 


    0

Это подтверждает, что forwarding выключен. Включить его можно, изменив в файле конфигурации 0 на 1. Самый простой способ, который не сохраняет изменения после перезагрузки:


    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward 

Проверяем:


    cat /proc/sys/net/ipv4/ip_forward

Вывод:


    1

Чтобы установить значение которое не вернется к 0 после перезагрузки необходимо отредактировать файл ip_forward.


    sudo nano /proc/sys/net/ipv4/ip_forward

Установим значение 1 и сохраним.

Теперь настраиваем брандмауэр. Перед добавлением правил установим плагин iptables, чтобы не возникло необходимости добавлять правила в автозагрузку.


    sudo apt install iptables-persistent -y

Вывод:


    Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  iptables-persistent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 6496 B of archives.
After this operation, 48.1 kB of additional disk space will be used.
Get:1 http://mirror.selectel.ru/ubuntu focal/universe amd64 iptables-persistent all 1.0.14 [6496 B]
Fetched 6496 B in 0s (442 kB/s)
Preconfiguring packages ...
Selecting previously unselected package iptables-persistent.
(Reading database ... 54557 files and directories currently installed.)
Preparing to unpack .../iptables-persistent_1.0.14_all.deb ...
Unpacking iptables-persistent (1.0.14) ...
Setting up iptables-persistent (1.0.14) ...
update-alternatives: using /lib/systemd/system/netfilter-persistent.service to provide /lib/systemd/system/iptables.service (iptables.service) in auto mode

Добавим правила для работы NAT.


    sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/24 -j MASQUERADE

    sudo iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

И сохраним их:


    sudo netfilter-persistent save

Вывод:


    run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

Настройка Squid

Команды управления процессом

Прежде чем установить прокси-сервер Squid, необходимо ознакомиться с командами управления процессом, а также с директориями важных файлов.

Запуск демона Squid:


    sudo systemctl start squid

Статус:


    sudo systemctl status squid 

Добавить демона Squid в автозагрузку:


    sudo systemctl enable squid

Перезапустить:


    sudo systemctl restart squid

Остановить процесс Squid:


    sudo systemctl stop squid

Убрать из автозагрузки:


    sudo systemctl disable squid

Важные файлы и директории рассмотрены далее в инструкции, основные моменты настройки и проверки будут произведены с их использованием:

  • /etc/squid/squid.conf 一 основной файл конфигурации Squid;
  • /var/log/squid/access.log 一 файл доступа;
  • /var/log/squid/cache.log 一 лог кэша.

Установка Squid

Теперь перейдем непосредственно к установке. Отправим в терминал команду:


    sudo apt -y install squid -y

Вывод процесса установки:


    Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libdbi-perl libecap3 squid-common squid-langpack
Suggested packages:
  libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl squidclient squid-cgi squid-purge
  smbclient ufw winbind
The following NEW packages will be installed:
  libdbi-perl libecap3 squid squid-common squid-langpack
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 3670 kB of archives.
After this operation, 15.7 MB of additional disk space will be used.
Get:1 http://mirror.selectel.ru/ubuntu focal/main amd64 libecap3 amd64 1.0.1-3.2ubuntu1 [17.4 kB]
Get:2 http://mirror.selectel.ru/ubuntu focal/main amd64 squid-langpack all 20191103-1 [167 kB]
Get:3 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 squid-common all 4.10-1ubuntu1.5 [194 kB]
Get:4 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 libdbi-perl amd64 1.643-1ubuntu0.1 [730 kB]
Get:5 http://mirror.selectel.ru/ubuntu focal-updates/main amd64 squid amd64 4.10-1ubuntu1.5 [2562 kB]
Fetched 3670 kB in 0s (21.2 MB/s)
Selecting previously unselected package libecap3:amd64.
(Reading database ... 54563 files and directories currently installed.)
Preparing to unpack .../libecap3_1.0.1-3.2ubuntu1_amd64.deb ...
Unpacking libecap3:amd64 (1.0.1-3.2ubuntu1) ...
Selecting previously unselected package squid-langpack.
Preparing to unpack .../squid-langpack_20191103-1_all.deb ...
Unpacking squid-langpack (20191103-1) ...
Selecting previously unselected package squid-common.
Preparing to unpack .../squid-common_4.10-1ubuntu1.5_all.deb ...
Unpacking squid-common (4.10-1ubuntu1.5) ...
Selecting previously unselected package libdbi-perl:amd64.
Preparing to unpack .../libdbi-perl_1.643-1ubuntu0.1_amd64.deb ...
Unpacking libdbi-perl:amd64 (1.643-1ubuntu0.1) ...
Selecting previously unselected package squid.
Preparing to unpack .../squid_4.10-1ubuntu1.5_amd64.deb ...
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
Unpacking squid (4.10-1ubuntu1.5) ...
Setting up squid-langpack (20191103-1) ...
Setting up libdbi-perl:amd64 (1.643-1ubuntu0.1) ...
Setting up libecap3:amd64 (1.0.1-3.2ubuntu1) ...
Setting up squid-common (4.10-1ubuntu1.5) ...
Setting up squid (4.10-1ubuntu1.5) ...
Setcap worked! /usr/lib/squid/pinger is not suid!
Skipping profile in /etc/apparmor.d/disable: usr.sbin.squid
Created symlink /etc/systemd/system/multi-user.target.wants/squid.service → /lib/systemd/system/squid.service.
Processing triggers for systemd (245.4-4ubuntu3.13) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...

Для начала нас интересует основной файл конфигурации. Он большой, чтобы полностью его читать, но если хочется подсчитать количество строк, можно использовать вот такую команду:


    wc -l /etc/squid/squid.conf

Вывод:


    8586 /etc/squid/squid.conf

Копируем файл, чтобы сохранить стандартную конфигурацию на случай непредвиденных обстоятельств.


    sudo cp /etc/squid/squid.conf /etc/squid/squid_back.conf

Вывести из файла все не закомментированные строки можно с использованием команды:


    grep -v '^ *#\|^ *$' /etc/squid/squid.conf

Вывод:


    acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/conf.d/*
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern .               0       20%     4320

Перезаписать файл только строками без комментариев можно вот так:


    sudo  grep -v '^ *#\|^ *$' /etc/squid/squid.conf > ~/squid.conf
sudo cp ~/squid.conf /etc/squid/squid.conf  

Теперь можно добавить Squid в автозагрузку командой:


    sudo systemctl enable squid

Проверить состояние возможно отправкой следующей команды:


    sudo systemctl status squid

Вывод:


    ● squid.service - Squid Web Proxy Server
     Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-11-17 12:24:31 UTC; 49min ago
       Docs: man:squid(8)
   Main PID: 3313 (squid)
      Tasks: 4 (limit: 1105)
     Memory: 15.9M
     CGroup: /system.slice/squid.service
             ├─3313 /usr/sbin/squid -sYC
             ├─3315 (squid-1) --kid squid-1 -sYC
             ├─3343 (logfile-daemon) /var/log/squid/access.log
             └─3347 (pinger)

Nov 17 12:24:31 apachi squid[3315]: Finished loading MIME types and icons.
Nov 17 12:24:31 apachi squid[3315]: HTCP Disabled.
Nov 17 12:24:31 apachi squid[3315]: Pinger socket opened on FD 14
Nov 17 12:24:31 apachi squid[3315]: Squid plugin modules loaded: 0
Nov 17 12:24:31 apachi squid[3315]: Adaptation support is off.
Nov 17 12:24:31 apachi squid[3315]: Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 12 flags=9
Nov 17 12:24:32 apachi squid[3315]: storeLateRelease: released 0 objects
Nov 17 13:09:57 apachi squid[3315]: Logfile: opening log stdio:/var/spool/squid/netdb.state
Nov 17 13:09:57 apachi squid[3315]: Logfile: closing log stdio:/var/spool/squid/netdb.state
Nov 17 13:09:57 apachi squid[3315]: NETDB state saved; 0 entries, 0 msec

Основные настройки Squid

Прежде чем начнется изменение файла конфигурации, соберем немного важной информации, которая касается логики обработки файла конфигурации при выполнении программы. 

  • Конфигурация обрабатывается построчно как при работе правил файрвола. Если поставить запрещающую строку выше разрешающей, то работа будет неправильной. 
  • В файле конфигурации есть строка http_port 3128,  в этой строке указывается порт, на котором работает сервис, а также в этой директиве можно указать IP-адрес, который станет слушать подключения. Если интерфейс прослушивания не указать, то Squid слушает все существующие интерфейсы. 

В рамках этой инструкции изменение порта и интерфейса нас не интересуют, перейдем к дальнейшей настройке. Для работы Squid используются списки контроля доступа (ACL). Синтаксис списка доступа следующий: acl имя_списка параметр содержимое.

Таким образом строка: acl localnet src 172.16.0.0/12 добавляет список с именем localnet, в котором объявляется пул IP-адресов (172.16.0.0-172.31.255.255) для входящих соединений (параметр src). Список адресов можно создать также с помощью отдельного файла, в рамках этой инструкции в этом нет необходимости, но знать об этом стоит. 

Для обработки списков контроля доступа используется директива http_access. Синтаксис выглядит следующим образом:


    http_access инструкция acl

Разберем пример на списке доступа с именем localnet:


    http_access allow localnet

Разрешает доступ к прокси-серверу, списку с именем localnet.

Настройка прозрачного прокси-сервера

На данном этапе настроим прокси-сервер для работы в прозрачном режиме. Само понятие прозрачный прокси-сервер подразумевает собой настройку сервера таким образом, чтобы клиенту не пришлось вносить никаких правок в свой интернет-обозреватель. Правила прокси-сервера будут работать для этой рабочей станции без участия пользователя в этом процессе. Продолжим редактировать основной файл конфигурации. Для настройки Squid в прозрачном режиме вернемся в директиве http_port и изменим ее следующим образом:


    http_port 192.168.0.1:3128 intercept

Применив указанную директиву, прокси-сервер станет слушать порт 3128 на сетевом интерфейсе с IP-адресом 192.168.0.1. Параметр intercept  включает работу прокси в прозрачном режиме.

Параметры acl-листа

Продолжим настройку и разберемся более детально со списками и указаниями. В acl-листе возможно выставить множество указаний, в том числе с использованием регулярных выражений для более тонкой настройки прокси-сервера. Разберем некоторые из них.

Src 

Один из первых параметров, который разберем 一 src. Он указывает адрес источника, с которого пришел запрос. Адресов может быть несколько, например:


    acl Client1 src 172.16.0.100 

В данном случае в acl-лист Client1 будет добавлен адрес 172.16.0.100 для обработки при входящем соединении. Это пример для одного IP-адреса.

Следующий пример для нескольких:


    acl PoolUs src 172.16.0.1-172.16.0.255

или


    acl PoolUs src 172.16.0.0/24

Пул IP-адресов возможно указать в разных форматах, как показано на примере.

Dst

По похожему принципу работает параметр dst.  Только обрабатывает он ресурсы, к которым клиент пытается получить доступ. Вот так выглядит синтаксис:


    acl drovSrv dst 172.16.0.11 

Где drovSrv 一 имя создаваемого списка, dst 一 обрабатываемое направление, 172.16.0.11 一 IP-адрес, к которому обращается клиент. 

Пример приведен для обработки одного адреса. Для пула адресов синтаксис выглядит так:


    acl drovSrv dst 172.16.0.1-172.16.0.255

    acl drovSrv dst 172.16.0.0/24 

Следующий параметр dstdomain указывает домен, к которому пытается обратиться клиент. 

Синтаксис:


    acl accessRes dstdomain .temp.ru 

Можно указать один или несколько доменов в списке.

Srcdomain

При появлении задачи с указанием домена источника требуется использовать srcdomain. Синтаксис выглядит следующим образом:


    acl dropRes srcdomain .temp.ru 

В некоторых случаях удобнее использовать параметры dstdom_regex или srcdom_regex. Они удобны тем, что позволяют использовать регулярные выражения.


    acl org srcdom_regex \.org$ 

Например, весь домен .org.

Url_regex 

Параметр url_regex позволяет обработать шаблон регулярного выражения в ссылке.


    acl videosAvi url_regex \.avi$


Директива, указанная в примере, позволяет добавить в acl-список для обработки видеофайлы формата avi. Очень удобно использовать url_regex с ключом -i , так как он позволяет игнорировать регистр символов при использовании регулярных выражений.

Proto и port

Теперь рассмотрим параметр для протоколов proto и портов port. Его синтаксис: 


    acl exa proto http 

В примере выше обрабатываются обращения по протоколу http.

Следующая директива port позволяет обработать один или несколько портов.

Для одного:


    acl eth port 80

Для нескольких:


    acl eth port 475-556

Time

Еще одна важная директива, которую следует рассмотреть: time.

Синтаксис:


    acl timeCom time days hh:mm-hh:mm

Проще всего понять принцип работы этой директиве на примере:


    acl timeCom time MTWHF 12:00-13:00 

В приведенном выше списке добавлена неделя с понедельника по пятницу, со временем с 12:00 до 13:00.

Параметры для тонкой настройки

На данном этапе разобраны основные типы элементов acl. Есть еще некое количество элементов, которые понимает Squid, но в этой инструкции они не описываются, т.к используются для более профессиональной настройки. 

Ниже приведем краткий список, чтобы было понимание, что можно найти и использовать помимо основных.

  • myip 一 локальный IP-адрес клиентского соединения;
  • urlpath_regex 一 шаблон регулярного выражения для части URL, исключая протокол и имя хоста;
  • myport 一 номер локального порта, куда подключается клиент;
  • browser 一 шаблон регулярного выражения, совпадающего с заголовком user-agent из запроса;
  • ident 一 строка совпадения с именем пользователя;
  • req_mime_type 一 шаблон регулярного выражения для заголовка content-type запроса;
  • arp 一 Ethernet MAC-адрес;
  • ident_regex 一 шаблон регулярного выражения имени пользователя;
  • src_as 一 номер автономной системы источника (клиент);
  • dst_as 一 номер автономной системы назначения (сервер);
  • proxy_auth 一 аутентификация пользователя через внешний процесс;
  • proxy_auth_regex 一 регулярное выражение аутентификации пользователя через внешний процесс;
  • snmp_community 一 строка SNMP-сообщества;
  • maxconn 一 ограничение максимального количества соединений с одного клиентского IP-адреса,
  • arp 一 Ethernet (MAC)-адрес.

Правила доступа

Теперь разберем типы правил доступа. Для начала немного о самой логике и принципах работы правил доступа. 

  • Правило состоит из указания deny или allow с указанием имени списка контроля доступа. 
  • В правиле возможно использование одного или нескольких списков контроля доступа. 
  • При использовании нескольких acl в правиле использовано логическое «И». Следует это учитывать при добавлении элементов, т.к правило не сработает если верно только одно значение.
  • Проверка происходит построчно.
  • Отличным вариантом является запретить все, кроме того что разрешено. 

Синтаксис правил доступа следующий:


    http_access  allow acl 
  • где http_access  тип правила доступа; 
  • allow указание;
  • acl имя списка контроля доступа.

Тем самым правило http_access  allow Client1 разрешает доступ acl с именем Client1. При комбинировании acl/правило всегда следует помнить, что список контроля доступа использует логическое «ИЛИ», а в правиле используется логическое «И». Тем самым, вот такое правило синтаксически создать можно, но работать оно не будет.


    acl sr_pc1 172.16.0.11
acl sr_srv 172.16.0.222
http_access allow sr_pc1 sr_srv

Есть несколько путей решения. Первый 一 добавить IP-адреса в один acl.


    acl sr_pc1_a_srv 172.16.0.11 172.16.0.222
http_access allow sr_pc1_a_srv

Второй 一 создать 2 отдельных правила.


    acl sr_pc1 172.16.0.11
acl sr_srv 172.16.0.222
http_access allow sr_pc1
http_access allow sr_srv

В большинстве случаев используется именно тип правила http_access.

Далее будут перечислены некоторые типы списков доступа, которые не будут раскрыты в этой инструкции, но знание об их существовании в дальнейшем может потребоваться.

  • no_cache 一 объявляет ответы, которые не будет попадать в кэш;
  • redirector_access 一 проверяет, какие запросы должны пройти через процесс редиректор;
  • miss_access 一 разрешает неким клиентам передавать cache misses через ваш кэш;
  • always_direct 一 контролирует, какие запросы всегда должны посылаться напрямую к серверу назначения;
  • never_direct проверяет запросы, которые никогда не должны посылаться напрямую к серверу назначения;
  • snmp_access 一 контролирует доступ клиентов к кэшу по SNMP;
  • broken_posts 一 определяет запросы, для которых squid добавляет дополнительный CRLF после сообщений POST как требуют некоторые неправильно функционирующие сервера.
  • cache_peer_access 一 контролирует, какие запросы должны быть переданы соседскому кэшу (peer).

Ограничение скорости

В Squid ограничение скорости настраивается с использованием параметра delay_pools. Логика работы следующая: каждый запрашиваемый объект попадает сначала в пул, потом передается на клиента. У каждого пула 2 параметра: скорость заполнения и размер буфера. 

Скорость заполнения пула определяется классом, директива delay_class. 

Возможно несколько вариантов:

  • общее ограничение скорости загрузки всем;
  • общее ограничение скорости загрузки и скорость каждого клиента;
  • общее ограничение скорости загрузки, скорости группы (сети), а также каждого клиента;
  • все ограничения предыдущего класса и ограничение отдельных пользователей 一 для этого потребуется аутентификация пользователей;
  • запросы объединяются по тегам определяемым директивой external_acl.

Директива delay_parameters  назначает параметры пула.

Тип записей delay_parameters с выбранным классом:

  • delay_parameters “номер пула” “общие ограничения для всех”
  • delay_parameters “номер пула” “общие ограничения для всех” “ограничения для хоста”
  • delay_parameters “номер пула” “общие ограничения для всех” “ограничения для подсети” “ограничения для хоста”
  • delay_parameters “номер пула” “общие ограничения для всех” “ограничения для подсети” “ограничения для хоста” “ограничения для пользователя”
  • delay_parameters “номер пула” “тегированные ограничения”

Для отдельных клиентов сети используется директива delay_access. Логика работы следующая:


    delay_access номер_пула указание имя_acl

Указание осуществляет 2 операции deny и allow 一 запретить и разрешить. Указание действует на тот пул, которому разрешен, и не действует на запрещенные.

Таким образом, delay_access 1 allow gr_1 оказывает воздействия пула №1 для acl gr_1, 

а строка delay_access 1 deny gr_2 не обрабатывает gr_2.

Пример работы

Укажем количество пулов:


    delay_pools 2

Присвоим класс первому пулу:


    delay_class 1 1

Присвоим класс второму пулу:


    delay_class 2 1

Разрешить доступ к пулу №1 пользователям,состоящим в списке us_groupe_1:


    delay_access 1 allow us_groupe_1

Запрещаем всем остальным доступ к этому пулу:


    delay_access 1 deny all

Разрешить доступ к пулу №2 пользователям, состоящим в списке us_groupe_2:


    delay_access 2 allow us_groupe_2

Запрещаем всем остальным доступ в этот пул:


    delay_access 2 deny all

Настраиваем параметры пулов. Первому пулу оставляем настройку без ограничения размера буфера и скорости:


    delay_parameters 1 -1/-1

Второму пулу ограничиваем размер буфера и скорость до 64 кБ/с:


    delay_parameters 2 8000/8000

О настройке Squid на Windows

Произвести установку возможно как на десктопную операционную систему, так и на серверную.

Скачать установщик для windows возможно здесь. Процесс установки крайне прост.

Установщик squid.

Нажимаем кнопка Next:

Принимаем лицензионное соглашение.

Дальше читаем и принимаем соглашение. Нажимаем Next. Выбираем директорию для установки Squid:

Выбираем директорию установки.

Даем разрешение на установку от имени администратора. Нажимаем кнопку Install:

Разрешение администратора.

Заканчиваем процесс установки, нажимая на Finish:

Завершаем установку.

Учитывая установку на диск D в данном примере, файл конфигурации расположен по пути:

D:\Squid\etc\squid\squid.conf

При установке по умолчанию, путь файла конфигурации следующий:

C:\Squid\etc\squid\squid.conf

Все настройки файла конфигурации идентичны с настройкой файла конфигурации в Ubuntu.

Заключение

В этой инструкции мы разобрали основы установки и настройки шлюза сети. А также подробно разобрали установку и настройку прокси-сервера Squid.