Здравствуйте друзья, сегодня я расскажу как сделать прозрачный шлюз на основе кэширующего прокси сервера Squid3.
Суть задачи:
1) Обеспечить доступ в интернет для 150+ компьютеров организации.
2) Сделать это максимально просто для конечных пользователей.
3) Обеспечить максимально безопасный доступ в интернет. Именно поэтому весь трафик будет проверяться на вирусы.
4) Так как ранее применялась NTLM авторизация - выполнить гибридную систему NTLM+ip авторизация, чтобы в дальнейшем всех пользователей перевести на новую систему с ip авторизацией.
Итак, я написал скрипт, с помощью которого развернуть полноценную систему доступа в интернет можно будет за очень короткое время.
Данная конфигурация собиралась под Debian 8 x64.
Сервер имеет 2 сетевые карты
eth0 - подключена к интернету и имеет адрес 10.10.0.2/30
eth1 - подключена к локальной сети и имеет адрес 192.168.0.1/24
Итак, для начала нужно настроить сетевые интерфейсы таким образом, чтобы маршрут по умолчанию (шлюз) был на интерфейсе eth0:
приводим к следующему виду: cat /etc/network/interfaces
Добавляем маршруты. Предпологается, что в локальной сети несколько подсетей, а именно 192.168.10.0/24 и 192.168.20.0/24. Нужно чтобы они добавлялись каждый раз при загрузке Debian:
Если вы вручную вводите данные, и не пользуйтесь теми файлами, что я предоставил вначале, то для вас содержимое /etc/bash.bashrc должно дополнится следующей строчкой:
private.pem - сертификат
public.pem - публичный ключ
squid_user.der - сертификат для конечных пользователей, который нужно установить на все клиентские машины в "Доверенные корневые центры сертификации".
Создадим небольшую напоминалку в данной папке:
Iptables это очень мощный инструмент для работы с сетью, чтобы описать все возможности нужна отдельная статья.
В нашем случае все более тривиально, нам нужен редирект с 80 и 443 портов на 3126 и 3127 порты соответственно + некоторые базовые настройки
Полный скрипт для развертывания данной конфигурации за несколько минут можно скачать ТУТ
Суть задачи:
1) Обеспечить доступ в интернет для 150+ компьютеров организации.
2) Сделать это максимально просто для конечных пользователей.
3) Обеспечить максимально безопасный доступ в интернет. Именно поэтому весь трафик будет проверяться на вирусы.
4) Так как ранее применялась NTLM авторизация - выполнить гибридную систему NTLM+ip авторизация, чтобы в дальнейшем всех пользователей перевести на новую систему с ip авторизацией.
Итак, я написал скрипт, с помощью которого развернуть полноценную систему доступа в интернет можно будет за очень короткое время.
Данная конфигурация собиралась под Debian 8 x64.
Сервер имеет 2 сетевые карты
eth0 - подключена к интернету и имеет адрес 10.10.0.2/30
eth1 - подключена к локальной сети и имеет адрес 192.168.0.1/24
Итак, для начала нужно настроить сетевые интерфейсы таким образом, чтобы маршрут по умолчанию (шлюз) был на интерфейсе eth0:
приводим к следующему виду: cat /etc/network/interfaces
allow-hotplug eth0 allow-hotplug eth1 iface eth0 inet static address 10.10.0.2 netmask 255.255.255.252 network 10.10.0.0 broadcast 10.10.0.3 gateway 10.10.0.1 iface eth1 inet static address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.254 dns-nameservers 8.8.8.8 dns-search domain.ruДалее все команды будем выполнять из под рута. Переходим в режим суперпользователя с помощью команды su и вводим пароль рута:
$ su Password:Теперь несколько констант, которые будут упрощать дальнейший код. Здесь необходимо указать путь до вашего FPT сервера, если вы хотите чтобы скрипт автоматически скачивал все нужные в процессе файлы, можете пропустить этот пункт и создавать необходимые файлы вручную:
FTP_PATH='ftp://ftp_login:ftp_passwd@youre.ftp.server/Path_to_configs' ADMIN_LOGIN_FOR_DC_JOIN='administrator' ADMIN_DC_PSW='administrator_psw' IP_ADDRESS_OF_PROXY='ip_of_youre_proxy' IP_OF_DC='ip_of_domain_controller' DOMAIN_SM='domain.ru' NTP_SERVER='ntp_server_domain_name_or_ip' DOMAIN='DOMAIN' DOMAIN_RU='DOMAIN.RU' LOC_HOST='newproxy' LOC_HOST_FULL='newproxy.domain.ru' SAMSDB_PASS='sams_pass'Сами файлы конфигурации можно скачать ЗДЕСЬ
Добавляем маршруты. Предпологается, что в локальной сети несколько подсетей, а именно 192.168.10.0/24 и 192.168.20.0/24. Нужно чтобы они добавлялись каждый раз при загрузке Debian:
echo '#! /bin/sh route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.0.1 route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.0.1 exit 0' > /etc/network/if-up.d/routes_add echo '#! /bin/sh route del -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.0.1 route del -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.0.1 exit 0' > /etc/network/if-down.d/routes_delete chmod +x /etc/network/if-up.d/routes_add chmod +x /etc/network/if-down.d/routes_delete /etc/init.d/networking restartОбновляемся:
apt-get -q -y update apt-get -q -y upgrade apt-get -q -y dist-upgradeУстанавливаем все необходимое:
apt-get -q -y install mc ntp squid3 winbind samba krb5-user havp clamav ssl-cert libpcre3 libpcre3-dev apache2 apache2-doc apt-get -q -y install mysql-server mysql-client libmysqlclient-dev apache2 apache2-mpm-prefork apache2-doc php5 libapache2-mod-php5 apt-get -q -y install php5-cli php5-common php5-mysql php5-gd php5-ldap php-fpdf mysql-server mysql-client libmysqlclient15off apt-get -q -y install libpcre3 libpcre3-dev make php5 php5-cli php5-common php5-dev php5-mcrypt php5-imagick php5-mysql apt-get -q -y install php5-gd php5-ldap php-fpdf libapache2-mod-php5 apache2-utils apt-get -q -y install make g++ libtool build-essential autoconf automake ssl-cert apache2 apache2-doc apache2-utils apt-get -q -y install mysql-server mysql-client libmysqlclient-dev libpcre3 libpcre3-dev php5 php5-cli php5-common apt-get -q -y install php5-dev php5-mcrypt php5-imagick php5-mysql php5-gd php5-ldap php-fpdf libapache2-mod-php5 libldap2-devУстанавливаем Webmin, с помощью которого будем контролировать iptables (и не только):
echo ' deb http://download.webmin.com/download/repository sarge contrib deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib ' >> /etc/apt/sources.list mkdir ~/downloads cd ~/downloads wget http://www.webmin.com/jcameron-key.asc apt-key add jcameron-key.asc apt-get update apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python apt-get install webminПредварительные настройки hosts:
mv /etc/hosts /etc/hosts.BACK echo " 127.0.0.1 localhost $IP_ADDRESS_OF_PROXY $LOC_HOST_FULL $LOC_HOST " >> /etc/hosts mv /etc/resolv.conf /etc/resolv.conf.BACK echo " search $DOMAIN_SM nameserver $IP_OF_DC " >> /etc/resolv.confВключаем маршрутизацию пакетов, чтобы наш прокси выполнял функции маршрутизатора:
echo " net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 " >> /etc/sysctl.conf echo "1" > /proc/sys/net/ipv4/ip_forwardНастраиваем логирование всего, что делает в командной строке пользователь (в том числе root), лог будет храниться в /var/log/commands.log (полезная штука):
mkdir ~/downloads cd ~/downloads wget $FTP_PATH/bash_logging/string.txt cat string.txt >> /etc/bash.bashrc touch /etc/rsyslog.d/bash.conf touch /var/log/commands.log echo "local6.* /var/log/commands.log" >> /etc/rsyslog.d/bash.conf /etc/init.d/rsyslog restartТеперь все команды будут вписываться в лог после переподключения
Если вы вручную вводите данные, и не пользуйтесь теми файлами, что я предоставил вначале, то для вас содержимое /etc/bash.bashrc должно дополнится следующей строчкой:
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'Настраиваем временную зону (в моем случае это Екатеринбург, у вас вероятнее всего своя):
cp /usr/share/zoneinfo/Asia/Yekaterinburg /etc/localtimeНастраиваем NTP:
mv /etc/ntp.conf /etc/ntp.conf.BACK echo " driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery restrict 127.0.0.1 restrict ::1 #server server $NTP_SERVER " >> /etc/ntp.conf /etc/init.d/ntp restart /etc/init.d/rsyslog restartНастраиваем Samba:
mv /etc/samba/smb.conf /etc/samba/smb.conf.BACK echo " [global] workgroup = $DOMAIN netbios name = $LOC_HOST server string = $DOMAIN Proxy log file = /var/log/samba/log.%m max log size = 50 log level = 3 #hosts allow = 192.168.0.0/24 127.0.0.1 #map to guest = bad user realm = $DOMAIN_SM nt acl support = yes nt status support = yes security = ads auth methods = winbind password server = $IP_OF_DC encrypt passwords = yes winbind separator = + winbind uid = 10000-20000 winbind gid = 10000-20000 winbind enum groups = yes winbind enum users = yes socket options = TCP_NODELAY SO_RCVBUF=16384 SO_SNDBUF=16384 #interfaces = 192.168.0.248/24 local master = no os level = 0 domain master = no preferred master = no domain logons = no name resolve order = host lmhosts bcast dns proxy = no " >> /etc/samba/smb.confНастраиваем kerberos
mv /etc/krb5.conf /etc/krb5.conf.BACK echo " [logging] default = FILE:/var/log/kerberos/krb5libs.log kdc = FILE:/var/log/kerberos/krb5dc.log admin_server = FILE:/var/log/kerberos/ksadmind.log [libdefaults] default_realm = $DOMAIN_RU [realms] $DOMAIN_RU = { kdc=$IP_OF_DC default_domain=$DOMAIN_SM admin_server=$IP_OF_DC } [domain_realm] $DOMAIN_SM = $DOMAIN_RU .$DOMAIN_SM = $DOMAIN_RU " >> /etc/krb5.confНастраиваем nsswitch
mv /etc/nsswitch.conf /etc/nsswitch.conf.BACK echo " passwd: files winbind compat group: files winbind compat shadow: files winbind compat gshadow: files hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis " >> /etc/nsswitch.confНастройки winbindd_priv. Суть в том, что по умолчанию squid не имеет доступа к получаемым NTLM ключам связки winbind+samba.
gpasswd -a proxy winbindd_priv chown root:proxy -R /var/lib/samba/winbindd_privileged sed -i -e '/chgrp winbindd_priv $PIDDIR\/winbindd_privileged\/ || return 1/ c\chgrp proxy $PIDDIR\/winbindd_privileged\/ || return 1' /etc/init.d/winbind /etc/init.d/samba restart /etc/init.d/winbind restartПредварительная настройка Squid3. Предположительно у нас есть пользователи, доступ которых в интернет осуществляется без авторизации. Например это руководители, которых мы не хотим утруждать вводом всяческих логинов и паролей. Это действительно только для какого-то типа авторизации, в данном случае NTLM. В дальнейшем, когда будет выполнен переход на ip авторизацию - эти настройки потеряют смысл.
ln -s /usr/sbin/squid3 /usr/sbin/squid touch /etc/squid3/01-superusers touch /etc/squid3/02-allowedsites touch /etc/squid3/03-our_networkДля пользователей, доступ которым на прокси будет разрешен без авторизации:
echo " 192.168.0.10 # Boss IP 1 192.168.10.10 # Boss IP 2 192.168.20.20 # Boss IP 3 " >> /etc/squid3/01-superusersСайты, на которые будет разрешен доступ без авторизации для всех из локальной сети:
echo " #local net---------------------- $DOMAIN_SM #cloud.mail.ru---------------------- .datacloudmail.ru cloud.radar.imgsmail.ru cloud.mail.ru headline.radar.imgsmail.ru portal.mail.ru cloclo1.cloud.mail #mail.yandex.ru---------------------- mail.yandex.ru #google.com---------------------- .google.com " >> /etc/squid3/02-allowedsitesЛокальная сеть, из которой будет разрешен доступ на сайты без авторизации:
echo " 192.168.0.0/24 # LAN-1 192.168.10.0/24 # LAN-2 192.168.20.0/24 # LAN-3 " >> /etc/squid3/03-our_networkТак как изначально Squid3 не поддерживает прозрачный режим работы с динамической генерацией сертификатов, нам необходимо его "пересобрать". В Debian это делается относительно просто:
cd /usr/src mv /etc/squid3/squid.conf /etc/squid3/squid.conf.BACK apt-get source squid3 apt-get build-dep squid3 apt-get build-dep squid apt-get build-dep openssh apt-get build-dep openssl apt-get install devscripts build-essential fakeroot cd squid3-* sed -i -e 's/--enable-inline/--enable-inline --enable-ssl/' ./debian/rules ./configure debuild -us -uc -b dpkg -i -y squid3_3*amd64.deb squid3-common*all.deb squid3-dbg*amd64.debДальше нужно заменить конфиг squid-а на ранее подготовленный:
cd ~/downloads wget $FTP_PATH/configs/2_squid_TRANSPERENT+NTLM_conf.txt cat 2_squid_TRANSPERENT+NTLM_conf.txt > /etc/squid3/squid.confЕсли вы делаете это вручную, то основная задача настройки заключается в следующем. Мы объявляем 2 порта, которые будут работать в прозрачном режиме, и 1 который будет работать в режиме авторизации:
http_port 3128 http_port 3126 intercept https_port 3127 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid3/openssl/public.pem key=/etc/squ$ always_direct allow all ssl_bump allow all ##Uncommented 2 lines below, if you allow all ssl connectios, even dont verify sertificate. #sslproxy_cert_error allow all #sslproxy_flags DONT_VERIFY_PEERТак как прокси работает в прозрачном режиме, нам необходимо работать с сертификатами. В таком режиме пользователь устанавливает SSL соединение с прокси, а проси непосредственно с запрашиваемым ресурсом. Появляется возможность контролировать весь трафик внутри зашифрованного соединения. Но появляется и проблема, связанная с постоянным предупреждением пользователя о том, что сертификат не действителен. Нам в дальнейшем нужно будет добавить всем пользователям сертификат от прокси в доверенные:
mkdir /etc/squid3/openssl cd /etc/squid3/openssl openssl genrsa 4096 > private.pem openssl req -new -x509 -days 3650 -key private.pem -out public.pem openssl x509 -in public.pem -outform DER -out squid_user.derПосле чего у нас в папке появится 3 файла:
private.pem - сертификат
public.pem - публичный ключ
squid_user.der - сертификат для конечных пользователей, который нужно установить на все клиентские машины в "Доверенные корневые центры сертификации".
Создадим небольшую напоминалку в данной папке:
echo ' Так как в данном случае мы используем self-signed сертификат, любые посещения https сайтов через прокси будут показывать пользователям ошибку сертификата. Причина ошибки — Issuer нашего сертификата не находится в списке Trusted CA в браузере. Что бы ошибок не было, выполняем следующее действие. Теперь полученный файл squid_user.der надо импортировать в клиентский браузер. Для Internet Explorer: Tools->Internet Options->Content->Certificates Выбираем закладку «Trusted Root Certificate Authorities» (Доыеренные корневые центры сертификации) Жмём Import, выбираем файл squid.der и завершаем импорт. Для Firefox: Tools->Options->Advanced->Encryption->View Certificates Выбираем закладку «Authorities» Жмём Import, выбираем файл squid.der и завершаем импорт. Ну вот в общем то всё. В зависимости от ваших фантазий, теперь у вас есть возможность в https трафике запретить делать POST запросы, скачивать большие файлы, закрыть доступ к определённым файлам/папкам. Так же можно запретить доступ на сайты, сертификаты которых выданы не доверенными CA. Ну и возможность проверять на вирусы. ' > readmeУстановка Sams2
cd ~/downloads wget https://launchpad.net/ubuntu/+archive/primary/+files/libzip1_0.9.3-1_amd64.deb wget http://launchpadlibrarian.net/94808408/libmysqlclient16_5.1.58-1ubuntu5_amd64.deb dpkg -i libzip1_0.9.3-1_amd64.deb dpkg -i libmysqlclient16_5.1.58-1ubuntu5_amd64.deb wget http://nixdev.net/release/sams/devel/packages/debian/sams2_2.0.0-rc2_amd64.deb dpkg -i sams2_2.0.0-rc2_amd64.deb wget http://nixdev.net/release/sams/devel/packages/debian/sams2-doc_2.0.0-rc2_all.deb wget http://nixdev.net/release/sams/devel/packages/debian/sams2-web_2.0.0-rc2_all.deb dpkg -i sams2-doc_2.0.0-rc2_all.deb && dpkg -i sams2-web_2.0.0-rc2_all.debНастройка Sams2
cp /etc/sams2.conf /etc/sams2.conf.BACK sed -i -e 's/DB_USER=/DB_USER=sams/' /etc/sams2.conf sed -i -e 's/DB_PASSWORD=/DB_PASSWORD='$SAMSDB_PASS'/' /etc/sams2.conf sed -i -e 's/squid/squid3/' /etc/sams2.conf sed -i -e '/SHUTDOWNCOMMAND=shutdown -h now/ c\SHUTDOWNCOMMAND=shutdown -r now' /etc/sams2.conf sed -i -e 's|SQUIDCACHEDIR=/usr/local/apache2|SQUIDCACHEDIR=/var/spool/squid3|' /etc/sams2.conf sed -i -e 's/SAMS_ENABLE=false/SAMS_ENABLE=true/' /etc/init.d/sams2Создаем линки в апаче для самса
echo ' Alias /sams2 /usr/share/sams2 <Directory "/usr/share/sams2"> Options Indexes FollowSymlinks AllowOverride None Require all granted AddDefaultCharset off </Directory> <Location "/sams2"> Options Indexes Order allow,deny Allow from all </Location> ' > /etc/apache2/conf-available/sams2.conf echo ' Alias /sams2/doc /usr/share/doc/sams2-doc/ <Directory "/usr/share/doc/sams2-doc/"> Options Indexes FollowSymlinks AllowOverride None Require all granted AddDefaultCharset off </Directory> <Location "/sams2/doc"> Options Indexes Order allow,deny Allow from all </Location> ' > /etc/apache2/conf-available/doc4sams2.conf ln -s ../conf-available/sams2.conf /etc/apache2/conf-enabled/ ln -s ../conf-available/doc4sams2.conf /etc/apache2/conf-enabled/ chown -R www-data:www-data /usr/share/sams2/data/ /etc/init.d/apache2 restart /etc/init.d/squid3 restart /etc/init.d/sams2 restartНастройки HAVP, который будет проверять весь траффик на вирусы
mv /etc/havp/havp.config /etc/havp/havp.config.BACK echo ' USER havp GROUP havp DAEMON true PIDFILE /var/run/havp/havp.pid SERVERNUMBER 10 MAXSERVERS 100 ACCESSLOG /var/log/havp/access.log ERRORLOG /var/log/havp/error.log USESYSLOG false LOG_OKS false LOGLEVEL 1 SCANTEMPFILE /var/spool/havp/havp-XXXXXX TEMPDIR /var/tmp DBRELOAD 60 FORWARDED_IP true PORT 8081 BIND_ADDRESS 127.0.0.1 TEMPLATEPATH /etc/havp/templates/ru WHITELISTFIRST true WHITELIST /etc/havp/whitelist BLACKLIST /etc/havp/blacklist FAILSCANERROR false SCANNERTIMEOUT 10 RANGE true SCANIMAGES false MAXSCANSIZE 5000000 STREAMUSERAGENT Player Winamp iTunes QuickTime Audio RMA/ MAD/ Foobar2000 XMMS IGNOREVIRUS Oversized. Encrypted. Phishing ENABLECLAMLIB true CLAMDBDIR /var/lib/clamav CLAMBLOCKBROKEN false CLAMBLOCKENCRYPTED false CLAMBLOCKMAX false CLAMMAXFILES 500 CLAMMAXFILESIZE 10 CLAMMAXRECURSION 8 ENABLEFPROT false ENABLEAVG false ENABLEAVESERVER false ENABLESOPHIE false ENABLETROPHIE false ENABLENOD32 false ENABLEAVAST false ENABLEARCAVIR false ENABLEDRWEB false ' > /etc/havp/havp.config echo ' *.youtube.com* *.$DOMAIN_SM* *.apple.com* ' >> /etc/havp/whitelistВводим прокси в домен
net join -I $IP_OF_DC -U $ADMIN_LOGIN_FOR_DC_JOIN%$ADMIN_DC_PSWПроверка, должно вывести все что видит в домене
wbinfo -g wbinfo -u wbinfo -tДобавляем необходимые настройки в MYSQL
mysql -u root -p GRANT ALL ON squidctrl.* TO 'sams'@localhost IDENTIFIED BY "SAMSDB_PASS"; GRANT ALL ON squidlog.* TO 'sams'@localhost IDENTIFIED BY "SAMSDB_PASS"; GRANT ALL ON sams2db.* TO 'sams'@localhost IDENTIFIED BY "SAMSDB_PASS"; flush privileges;Ну и IPTABLES.
Iptables это очень мощный инструмент для работы с сетью, чтобы описать все возможности нужна отдельная статья.
В нашем случае все более тривиально, нам нужен редирект с 80 и 443 портов на 3126 и 3127 порты соответственно + некоторые базовые настройки
#-------------УДАЛЯЕМ ВСЕ НАСТРОЙКИ---------------- IPTABLES="/sbin/iptables" $IPTABLES -P INPUT ACCEPT $IPTABLES -P FORWARD ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X ############################################################################### #-------------Настраиваем---------------- # 1.1 Настройки сети INET_IP="10.10.0.2/30" INET_IFACE="eth0" INET_BROADCAST="255.255.255.255" # локалка LAN_IP="192.168.0.0/24" LANN="192.168.0.1" LAN_IP_RANGE="192.168.10.0/24" LAN_IP_RANGE2="192.168.20.0/24" LAN_IFACE="eth1" # локалхост LO_IFACE="lo" LO_IP="127.0.0.1" #Открытые порты (через пробел) open_tcp_ports="22 80 443 3126 3127 3128 10000" open_udp_ports="123" open_icmp_state="8 11" ########################################################################### # 2. Module loading. /sbin/depmod -a /sbin/modprobe ip_tables /sbin/modprobe ip_conntrack /sbin/modprobe iptable_filter /sbin/modprobe iptable_mangle /sbin/modprobe iptable_nat /sbin/modprobe ipt_LOG /sbin/modprobe ipt_limit /sbin/modprobe ipt_state ########################################################################### # 3.1 Включаем режим роутера echo "1" > /proc/sys/net/ipv4/ip_forward # ----------------------Правила---------------------------------- # 4.1 ТАБЛИЦА Filter #Умолчания $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP #Создаем цепочки $IPTABLES -N bad_tcp_packets $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:" $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP $IPTABLES -N allowed $IPTABLES -A allowed -p TCP --syn -j ACCEPT $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A allowed -p TCP -j DROP $IPTABLES -N tcp_packets for open_tcp in $open_tcp_ports do $IPTABLES -A tcp_packets -p TCP --dport $open_tcp -j allowed done $IPTABLES -N udp_packets for open_udp in $open_udp_ports do $IPTABLES -A udp_packets -p UDP --dport $open_udp -j allowed done $IPTABLES -N icmp_packets for open_icmp in $open_icmp_state do $IPTABLES -A icmp_packets -p ICMP --icmp-type $open_icmp -j ACCEPT done # 4.1.4 ТАБЛИЦА INPUT # Подключения к прокси # Сначала пропускаем уже ранее установленые соединения $IPTABLES -A INPUT -p tcp -j bad_tcp_packets $IPTABLES -A INPUT -i $INET_IFACE -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $LAN_IFACE -d $LAN_IP -m state --state ESTABLISHED,RELATED -j ACCEPT # пропускаем соединения к прокси от локалки и лупбак $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_IP_RANGE2 -j ACCEPT $IPTABLES -A INPUT -i $LO_IFACE -s $LO_IP -j ACCEPT $IPTABLES -A INPUT -i $LO_IFACE -s $LAN_IP -j ACCEPT $IPTABLES -A INPUT -i $LO_IFACE -s $INET_IP -j ACCEPT # фильтруем открытые порты для разных протоколов $IPTABLES -A INPUT -p TCP -i $LAN_IFACE -s $LAN_IP_RANGE -j tcp_packets $IPTABLES -A INPUT -p TCP -i $LAN_IFACE -s $LAN_IP_RANGE2 -j tcp_packets $IPTABLES -A INPUT -p UDP -i $LAN_IFACE -s $LAN_IP_RANGE -j udp_packets $IPTABLES -A INPUT -p UDP -i $LAN_IFACE -s $LAN_IP_RANGE2 -j udp_packets $IPTABLES -A INPUT -p ICMP -i $LAN_IFACE -s $LAN_IP_RANGE -j icmp_packets $IPTABLES -A INPUT -p ICMP -i $LAN_IFACE -s $LAN_IP_RANGE2 -j icmp_packets $IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level debug --log-prefix "IPT INPUT packet died: " # 4.1.5 ТАБЛИЦА FORWARD $IPTABLES -A FORWARD -p tcp -j bad_tcp_packets #$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level debug --log-prefix "IPT FORWARD packet died: " # 4.1.6 ТАБЛИЦА OUTPUT $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets $IPTABLES -A OUTPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -s $LAN_IP -j ACCEPT $IPTABLES -A OUTPUT -s $INET_IP -j ACCEPT $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level debug --log-prefix "IPT OUTPUT packet died: " # 4.2 ТАБЛИЦА nat $IPTABLES -A PREROUTING ! -d $LAN_IP -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination $LANN:3126 $IPTABLES -A PREROUTING ! -d $LAN_IP -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination $LANN:3127 #$IPTABLES -A POSTROUTING -o eth0 -j MASQUERADEВот собственно и все. Теперь можно зайти на http://proxy_ip/sams2/ и настроить самс под свои нужды, логин по умолчанию admin, пароль qwerty. Так же доступен Webmin по адресу https://proxy_ip:10000 логин и пароль по умолчанию от учетной записи root сервера.
Полный скрипт для развертывания данной конфигурации за несколько минут можно скачать ТУТ