#!/bin/bash # # firewall # # chkconfig: - 97 20 # ### BEGIN INIT INFO # Provides: firewall # Required-Start: $network # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: firewall builder ### END INIT INFO lock_path=/var/lock/firewall.lock # Список IPSETів ipset_list=( disabled ) VC=`which vconfig` IFC=`which ifconfig` ETT=`which ethtool` IPT=`which iptables` IPS=`which ipset` DIG=`which dig` CTL=`which sysctl` DNS_lookup="1.1.1.1" # OUT інтерфейс (інтернет) out_interface1="eth1" # IP SRC-NAT для користувачів out_ext_ip1="public_ip_for_nat" # IP для редиректу на сторінку заглушки REDIRECT_IP="10.100.1.2" # назва IPSETа для дозволених IP allowed_ipset="allowed" # Список дозволених сайтів та IP allowed_list=( ubilling.isp 8.8.8.8 8.8.4.4 www.liqpay.com liqpay.com static.liqpay.com ecommerce.liqpay.com api.privatbank.ua login.privatbank.ua privat24.privatbank.ua www.privat24.ua privat24.ua liqpay.com www.liqpay.com static.liqpay.com ecommerce.liqpay.com fonts.googleapis.com ajax.googleapis.com my-payments-p24.privatbank.ua themes.googleusercontent.com www.google-analytics.com google-analytics.com ssl.google-analytics.com widget.siteheart.com static.siteheart.com www.googleadservices.com stats.g.doubleclick.net googleads.g.doubleclick.net qrapi.privatbank.ua js.honeybadger.io socauth.privatbank.ua www.googletagmanager.com st.privatbank.ua services.privatbank.ua mypayments.privatbank.ua client.siteheart.com fonts.gstatic.com esapi.siteheart.com crm.privatbank.ua ) postrouting() { # Очищаем NAT $IPT -t nat -F POSTROUTING # NAT для користувачів $IPT -t nat -A POSTROUTING -s 100.64.0.0/22 -o $out_interface1 -j SNAT --to-source $out_ext_ip1 --persisten echo "POSTROUTING done" } input() { $IPT -F INPUT # Якщо використовуєте Fail2ban SSH $IPT -N fail2ban-ssh $IPT -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh $IPT -A INPUT -i eth1 -s "mgmt_net" -j ACCEPT $IPT -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p TCP -m multiport --dports 6881:6889 -m state --state NEW -j DROP $IPT -A INPUT -p UDP -m multiport --dports 6881:6889 -j DROP $IPT -A INPUT -p TCP -m multiport --dports 49001 -m state --state NEW -j DROP $IPT -A INPUT -p UDP -m multiport --dports 49001 -j DROP $IPT -A INPUT -p TCP -m multiport --dports 135,137,138,139,445 -j DROP echo "INPUT done" } raw_rules() { # очищуємо RAW таблиці $IPT -t raw -F PREROUTING $IPT -t raw -F OUTPUT echo "RAW rules done" } forward() { # Очищаем FORWARD $IPT -F FORWARD # Пропускаємо трафік до дозволених IP $IPT -A FORWARD -m set --match-set $allowed_ipset dst -j ACCEPT # Блокуємо трафік користувачів у IPSETах for ipset_name in ${ipset_list[*]} do $IPT -A FORWARD -m set --match-set $ipset_name src -j REJECT --reject-with icmp-proto-unreach done echo "FORWARD done" } prerouting() { # Очищаємо PREROUTING $IPT -t nat -F PREROUTING # Пропускаємо трафік до дозволених IP $IPT -t nat -A PREROUTING -m set --match-set $allowed_ipset dst -j ACCEPT # Перенаправляємо користувачів з IPSETів на сторінки заглушки $IPT -t nat -A PREROUTING -m set --match-set disabled src -p tcp --dport 80 -j DNAT --to-destination $REDIRECT_IP:80 echo "PREROUTING done" } allow() { # Очищаємо IPSET дозволених IP $IPS -F $allowed_ipset for row in ${allowed_list[*]} do # перевіряємо запис зі списку дозволених, чи є він IP адресою if [[ $row =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then # додаємо цей IP до списку дозволених $IPS add $allowed_ipset $row > /dev/null 2>&1 else # запис виявився доменом, резолвимо його IP через dig for ip in `$DIG $row +short @$DNS_lookup` do # додаємо отримані через dns IP-адреси до списку дозволених $IPS add $allowed_ipset $ip > /dev/null 2>&1 done fi done echo "ALLOWED done" } start() { if [ -f $lock_path ]; then echo "Firewall is running" exit 0 else touch $lock_path fi echo "Start building firewall" for ipset_name in ${ipset_list[*]} do $IPS -N $ipset_name iphash > /dev/null 2>&1 done $IPS -N active iphash > /dev/null 2>&1 $IPS -N $allowed_ipset iphash > /dev/null 2>&1 allow input forward prerouting postrouting raw_rules $CTL -p > /dev/null 2>&1 echo "Firewall rules created" } stop() { if [ ! -f $lock_path ]; then echo "Firewall is stoped" exit 0 else rm -f $lock_path fi $IPT -F INPUT $IPT -F FORWARD $IPT -t nat -F $IPT -t mangle -F $IPT -t raw -F PREROUTING $IPT -t raw -F OUTPUT $IPT -P FORWARD ACCEPT echo "FORWARD/NAT/RAW flushed" $CTL -p > /dev/null 2>&1 } show() { $IPT -L INPUT -v -n --line-numbers $IPT -L FORWARD -v -n --line-numbers $IPT -t nat -L PREROUTING -v -n --line-numbers $IPT -t nat -L POSTROUTING -v -n --line-numbers $IPT -t raw -L -v -n --line-numbers $IPS list $allowed_ipset } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; allow) allow ;; input) input ;; forward) forward ;; pre) prerouting ;; post) postrouting ;; raw) raw_rules ;; show) show ;; *) echo "Usage: $0 {start|stop|restart|allow|input|forward|pre|post|raw|show}" esac