пятница, 30 марта 2018 г.

AWS. EC2 Squid как NAT с фильтрацией исходящих соединений по списку доменов с разрешением имен

Делаем EC2 в нужной VPC. ВЫКЛЮЧАЕМ Source/dest. check! Иначе раотать не будет да и не сможем даже указать этот инстанс как NAT в таблицах маршрутизации

Я собирал SQUID + LibreSSL, потому что с OpenSSL не работали некоторые запросы, которые использовали рсширения SSL (в частности 13-е).




yum groupinstall "Development Tools"
yum install libxml2-devel libcap-devel libtool-ltdl-devel libecap libecap-devel


wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.7.1.tar.gz

сборка и установка на место openssl

./configure --prefix=/usr
make
make install
ldconfig
openssl version

вывод должен показать: LibreSSL 2.7.1

wget ftp://dfw.squid-cache.org/pub/squid/squid-3.5.27.tar.gz

Сборка SQUID:

./configure \
--build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-amazon-linux-gnu \
--program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 \
--libexecdir=/usr/libexec --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --disable-strict-error-checking --exec_prefix=/usr --libexecdir=/usr/lib64/squid \
--localstatedir=/var --datadir=/usr/share/squid --sysconfdir=/etc/squid \
--disable-dependency-tracking --enable-eui --enable-follow-x-forwarded-for \
--enable-external-acl-helpers=file_userip --enable-cache-digests --enable-cachemgr-hostname=localhost \
--enable-epoll --enable-ident-lookups --enable-linux-netfilter --enable-removal-policies=heap,lru \
--enable-ssl-crtd --enable-wccpv2 --enable-esi --enable-ecap --with-aio --with-default-user=squid --with-dl --with-openssl --with-pthreads \

--disable-arch-native


В качестве UserData:

INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
PRIV_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)
AVZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone);
REGION=${AVZONE::-1}

VPC_ID=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --region $REGION --query "Reservations[0].Instances[0].VpcId")

SUBNETS=$(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC_ID" "Name=tag:Name,Values=*-EU1-Private-*" --region $REGION --query "Subnets[].CidrBlock" --output text)

iptables -F
iptables -t nat -F

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130

for i in $SUBNETS
do
 echo $i
 iptables -t nat -A POSTROUTING -o eth0 -s $i -j MASQUERADE
done

iptables -L -t nat
service iptables save

------------------------------------
Тут создаем iptables правила для редиректа http/https на Transparent Squid.
создайте юзера и группу squid.

/etc/squid/squid.conf:

cache_effective_user squid
cache_effective_group squid
dns_nameservers 8.8.8.8 8.8.8.4
visible_hostname squidPublic
cache deny all
http_port 123
http_port 3128 intercept
http_port 3129
acl Jenkins_Prod src 10.0.3.XX
acl NTP_PROD src 10.0.3.XXX
acl allowed_http_sites dstdomain .amazonaws.com
acl allowed_http_sites dstdomain .amazon.pool.ntp.org
acl allowed_http_sites dstdomain "/etc/squid/domains.lst"
acl allowed_http_sites dstdomain 169.254.169.254
acl allowed_http_sites dstdomain packages.us-west-1.amazonaws.com
http_access allow localhost manager
http_access deny manager
http_access allow Jenkins_Prod
http_access allow NTP_PROD
http_access allow allowed_http_sites

https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept
acl SSL_port port 443
http_access allow SSL_port
acl allowed_https_sites ssl::server_name .amazonaws.com
acl allowed_https_sites ssl::server_name "/etc/squid/domains.lst"
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump peek step1 all
ssl_bump peek step2 allowed_https_sites
ssl_bump splice step3 allowed_https_sites
ssl_bump terminate step2 all

http_access deny all
logfile_rotate 10
#debug_options rotate=10
access_log none
#access_log daemon:/var/log/squid/access.log
cache_log /var/log/squid/cache.log
---------------------------------
я выключил логи - мне не надо.

файлик squid.conf заточен на использование списка доменов в /etc/squid/domains.lst
это простой текстовик с доменами для резолва, например:
.oracle.com
.jenkins.io
.bitbucket.org
.packagist.org
.osuosl.org
.jenkins-ci.org
repo.zabbix.com
.amazonaws.com
.cloudfront.net
.github.com

----------------
В файлик старт-стоп я добавил копирование списка доменов с S3.
aws s3 cp s3://domainlist-squid/domains.lst /etc/squid

---------------
еще /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576 64768 98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush=1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 1000
net.core.rmem_default=65536
net.core.wmem_default=65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

----------------------
Ну и старндартно в таблицы маршрутов для приватных сетей на маршрут 0.0.0.0/0 вместо NAT выбираем из списка наш инстанс.


Комментариев нет: