Как установить и настроить Squid – Proxy Server

rsz_pop
Привет всем, сегодня речь пойдет о том, как установить и настроить некэшерующий, не ведущий логи, анонимный прокси сервер. Зачем это надо? Для разных целей, например, что-бы анонимно серфить по сети, или заходить на американские сервисы, закрытые для жителей не США, или что-бы скрыть наличие нескольких совершенно разных компьютеров, которые идут в сети с IP-проксика, при этому сами компы могут быть по разным концам планеты. Официальный сайт Squid стоит посетить для более глубокого изучения вопроса. Прочесть подробно, что такое прокси-сервер и каких они бывают типов вы можете в Википедии. Ну и сама установка и настройка подробно под катом.

Что такое Squid?

Squid (англ. squid — «кальмар») — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. (wikipedia) Говоря проще это прокси сервер. Что умеет прокси сервер и для чего он нужен?? Ну тут бл*** тысячи причин :) Я не буду их описывать, есть Википедия.

В рамках этой статьи я хочу настроить анонимный, не кеширующий и не ведущий логов прокси сервер на сервере в USA. Это значит, что прокси сервер будет скрывать мой истинный IP-адрес, будет резать пакеты и выпиливать от туда User-Agent дабы не передовалась информация об моем браузере, моей системе и т.д.

Прокси сервер не будет создавать кеш (хотя это безусловно крутая опция и отлично реализована в squid) и не будет вести логов внутри системы Linux. Нам нужно аномность и безопасность :)

Начинаем дискотеку

Система Red Hat Enterprise Linux Server 6.4
Ставим squid:

yum install -y squid
yum install -y squid

Запускаем:

/etc/init.d/squid start
/etc/init.d/squid start

Что-бы стартовал при старте системы:

/sbin/chkconfig --levels 345 squid on
/sbin/chkconfig --levels 345 squid on

Проверяем что все ок:

ps -ef | grep squid
root      8883     1  0 Jul27 ?        00:00:00 squid -f /etc/squid/squid.conf
ps -ef | grep squid
root      8883     1  0 Jul27 ?        00:00:00 squid -f /etc/squid/squid.conf
chkconfig --list | grep squid
squid           0:off   1:off   2:off   3:on    4:on    5:on    6:off
chkconfig --list | grep squid
squid           0:off   1:off   2:off   3:on    4:on    5:on    6:off

Помним, что в RHEL & CentOS iptbales всегда включен. Нам надо будет его настроить, к слову у меня мой личный статик IP так что аутентификации по логину\паролю я делать не буду, тупо бесполезно, так как доступ к проксику можно будет получить только с моего адреса.

И не верьте басням быдло-умников которые нихера не понимают, зато много пизд**. Получить доступ к такому серваку не сможет даже АНБ на прямую.

Итак, настройки файрволла как всегда на месте:

vim /etc/sysconfig/iptables
vim /etc/sysconfig/iptables

Открываю доступ только со своего адреса так:

...
-A INPUT -m tcp -p tcp --source 67.116.24.124/32 --dport 3128 -j ACCEPT
...
...
-A INPUT -m tcp -p tcp --source 67.116.24.124/32 --dport 3128 -j ACCEPT
...

Никогда не забываем:

/etc/init.d/iptables restart
/etc/init.d/iptables restart

Зачетно!
Пойдем посмотрим что там в браузере:
squid

Кстати по умолчанию проксик висит на порту 3128, я его там и оставил.

Конифигурируем Squid

В нашем случае нет списков доступа, нет HTTPS и прочей ерунды, так что вся настройка сводится к правка одного единственного конфига:

vim /etc/squid/squid.conf
vim /etc/squid/squid.conf

Давайте посмотрим на сам файл:

acl my_network src 17.196.71.124/32 ::1 < <--- тут my_network это название условно для моей сети
acl allon_network src 81.39.116.151/32 ::1 <<--- еще одна доверенная сетка
 
#rulles to be anonymouse
via off                  <<-- Это для пущей анонимности
forwarded_for off        <<-- Это тоже
follow_x_forwarded_for deny all
 
#another
visible_hostname pidaras.com
httpd_suppress_version_string on
 
request_header_access Allow allow all    <<---Все эти правила важны 
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access All deny all
 
 
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
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
 
access_log none all  <<=== Никаких логов
cache_store_log none  <<=== Никаких логов
 
cache deny all <<=== Никакого кеша 
maximum_object_size 0 KB <<=== Никакого кеша 
minimum_object_size 0 KB <<=== Никакого кеша 
 
http_access allow my_network <<=== прокси доступен только для доверенных сеток  
http_access allow allon_network  <<=== прокси доступен только для доверенных сеток  
 
#http_access deny manager
http_port 3128 <<=== это порт
hierarchy_stoplist cgi-bin ?
#cache_dir ufs /var/spool/squid 100 16 256  <<=== Никакого кеша 
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 .               0       20%     4320
acl my_network src 17.196.71.124/32 ::1 < <--- тут my_network это название условно для моей сети
acl allon_network src 81.39.116.151/32 ::1 <<--- еще одна доверенная сетка

#rulles to be anonymouse
via off                  <<-- Это для пущей анонимности
forwarded_for off        <<-- Это тоже
follow_x_forwarded_for deny all

#another
visible_hostname pidaras.com
httpd_suppress_version_string on

request_header_access Allow allow all    <<---Все эти правила важны 
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access All deny all


acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
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

access_log none all  <<=== Никаких логов
cache_store_log none  <<=== Никаких логов

cache deny all <<=== Никакого кеша 
maximum_object_size 0 KB <<=== Никакого кеша 
minimum_object_size 0 KB <<=== Никакого кеша 

http_access allow my_network <<=== прокси доступен только для доверенных сеток  
http_access allow allon_network  <<=== прокси доступен только для доверенных сеток  

#http_access deny manager
http_port 3128 <<=== это порт
hierarchy_stoplist cgi-bin ?
#cache_dir ufs /var/spool/squid 100 16 256  <<=== Никакого кеша 
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 .               0       20%     4320

Можете точно так настроить конфиг вашего проксика и примите изменения:

squid -k reconfigure
squid -k reconfigure

Теперь, нужно научить браузер ходить в Интернет только через прокси машину:
Firefox -> Options -> Advanced -> Network -> Settings
squidddd

Готово, пойдемте посмотрим результат в браузере вот тут к примеру:
squid3

Вот тут можно посмотреть какие хедеры передает проксик.

Убедится в том, что логов нету можно так:

cd /var/log/squid/
-rw-r-----   1 squid squid    0 Jul 27 14:21 access.log
-rw-r-----   1 squid squid    0 Aug  7 09:27 cache.log
-rw-r--r--   1 root  root     0 Jul 27 14:33 squid.out
cd /var/log/squid/
-rw-r-----   1 squid squid    0 Jul 27 14:21 access.log
-rw-r-----   1 squid squid    0 Aug  7 09:27 cache.log
-rw-r--r--   1 root  root     0 Jul 27 14:33 squid.out

Логи должны быть пустыми.

ВНИМАНИЕ!
Так как я не использую и не показываю в премере настройки HTTPS связи между вами и прокси сервером, такой поток траффика в теории является не надежным, так как вы можете подвергнуться атаке MITM (man-in-the-middle) т.е. какой-нить бро тупо сможет отснифить траффик который будет ходить между вами и проксиком.

ДОПОЛНЕНИЕ!
Небольшой и очень простой скрипт для очистки логов раз в н-минут.
Открываем крон:

crontab -e
0 */5 * * * bash /root/del_logs/dellogs.sh
crontab -e
0 */5 * * * bash /root/del_logs/dellogs.sh

Тело скрипта:

#!/bin/bash
 
cat /dev/null > /var/log/boot.log
cat /dev/null > /var/log/dmesg
cat /dev/null > /var/log/lastlog
cat /dev/null > /var/log/mail
cat /dev/null > /var/log/messages
cat /dev/null > /var/log/mysqld.log
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/yum.log
cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/audit/audit.log
cat /dev/null > /var/log/squid/access.log
cat /dev/null > /var/log/squid/cache.log
cat /dev/null > /var/log/httpd/error_log
cat /dev/null > /var/log/httpd/access_log
cat /dev/null > /var/log/mcelog
#!/bin/bash

cat /dev/null > /var/log/boot.log
cat /dev/null > /var/log/dmesg
cat /dev/null > /var/log/lastlog
cat /dev/null > /var/log/mail
cat /dev/null > /var/log/messages
cat /dev/null > /var/log/mysqld.log
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/yum.log
cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/audit/audit.log
cat /dev/null > /var/log/squid/access.log
cat /dev/null > /var/log/squid/cache.log
cat /dev/null > /var/log/httpd/error_log
cat /dev/null > /var/log/httpd/access_log
cat /dev/null > /var/log/mcelog