#!/bin/bash
# Чтобы наш шлюз начал раздавать нтернет, надо разрешить пересылку
# серевых пакетов, сделать это надо в нескольких местах
echo 1 > /proc/sys/net/ipv4/ip_forward
# Дополнительные правила для сетевой безопасности
# Сразу прописываем правила SYSCTL
sysctl net.ipv4.conf.default.forwarding=1
sysctl net.ipv4.conf.all.forwarding=1
sysctl net.ipv4.icmp_echo_ignore_all=1
sysctl -w net.ipv4.tcp_max_syn_backlog=1024
sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_syncookies=1
############## Подгружаем модули
modprobe ip_gre
modprobe ip_nat_pptp
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Настройка роутинга
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 192.168.11.1/24 -j ACCEPT
iptables -P FORWARD DROP
# Далее, разрешаем локальному интерфейсу (lo) принимать и отправлять пакеты
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Разрешаем внутреннему (eth1) интерфейсу принимать и отпралять пакеты
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
# Далее, правила разрешаюшие определенным протоколам подключение к # внешнему интерфейсу (eth0)
#iptables -A INPUT -i eth0 -s 192.168.11.100 -p tcp --dport ssh -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport ssh -j ACCEPT
# некорретные/ненужные пакеты запрещены
#iptables -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
#iptables -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 11 -j ACCEPT
#iptables -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 15/second -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p TCP --sport 32768:60999 -j ACCEPT
iptables -A OUTPUT -p UDP --sport 32768:60999 -j ACCEPT
iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT
# Разрешаем определенные порты
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# И запрещаем все остальные входящие соединения
iptables -P INPUT DROP
# Для того, чтобы при перезагрузке, у нас правила не обнулялись, надо их # сохранить, а затем сделать авто восстановление этих правил
# iptables-save > /etc/ipfirewall.rules
# В файле /etc/rc.local перед строчкой "exit 0", добавить
# iptables-restore < /etc/ipfirewall.rules
###############################################################################
############################# ###########################
############################# ПРОБРОС ПОРТОВ ###########################
############################# ###########################
###############################################################################
# RDP - TS
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3391 -j DNAT --to-destination 192.168.11.77:3389
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.77 -p tcp -m tcp --dport 3389 -j ACCEPT
# Почтовые пробросы
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 143 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 143 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 993 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 993 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 110 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 110 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 995 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 995 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 465 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 465 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 587 -j DNAT --to-destination 192.168.11.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.55 -p tcp -m tcp --dport 587 -j ACCEPT
# WEB протоколы
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.50
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.50 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.11.50
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.50 -p tcp -m tcp --dport 443 -j ACCEPT
# FTP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT --to-destination 192.168.11.100
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.100 -p tcp -m tcp --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20 -j DNAT --to-destination 192.168.11.100
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.11.100 -p tcp -m tcp --dport 20 -j ACCEPT
# ---------- VPN ---------- #
# OpenVPN
iptables -t nat -A POSTROUTING -s 192.168.104.0/24 -o eth0 -j MASQUERADE
# eth1 - внутренний интерфейс 192.168.11.0/24
# tun - сетка 192.168.104.0/24 для openvpn-клиентов
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i lo -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i eth1 -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT -m conntrack --ctstate ESTABLISHED,RELATED
iptables -A FORWARD -s 192.168.104.0/24 -d 192.168.11.0/24 -i tun+ -o eth1 -p icmp -j ACCEPT
iptables -A FORWARD -s 192.168.11.0/24 -d 192.168.104.0/24 -i eth1 -o tun+ -p icmp -j ACCEPT
iptables -A FORWARD -s 192.168.104.0/24 -d 192.168.11.0/24 -i tun+ -o eth1 -p tcp -m tcp -m multiport --dports 22,3389 -j ACCEPT
iptables -A FORWARD -s 192.168.11.0/24 -d 192.168.104.0/24 -i eth1 -o tun+ -p tcp -m tcp -m multiport --sports 22,3389 -j ACCEPT -m conntrack --ctstate ESTABLISHED,RELATED
# PPTP
iptables -t nat -A POSTROUTING -s 192.168.103.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate NEW -i ppp0 -s 192.168.103.1/24 -j ACCEPT
iptables -A INPUT -i eth0 -p gre -j ACCEPT
iptables -A FORWARD -p gre -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
# Заворачиваем трафик на SQUID
iptables -t nat -A PREROUTING -i eth1 ! -d 192.168.11.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 192.168.11.1:3128
################################################################################
######################### ############################
######################### СЕТЕВАЯ БЕЗОПАСНОСТЬ ############################
######################### ############################
################################################################################
# Заперщаем все неправильные и некорректные пакеты
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
# fail2ban
iptables -N REJECT_FLOOD28
iptables -A REJECT_FLOOD28 -j LOG --log-prefix 'IPTABLES-FLOOD LENGTH 28: ' --log-level info
iptables -A REJECT_FLOOD28 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 27015 -m length --length 28 -j REJECT_FLOOD28
iptables -N REJECT_FLOOD46
iptables -A REJECT_FLOOD46 -j LOG --log-prefix 'IPTABLES-FLOOD LENGTH 46: ' --log-level info
iptables -A REJECT_FLOOD46 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 27015 -m length --length 46 -j REJECT_FLOOD46
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP -m connlimit --connlimit-above 1
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
# Рекомендации по безопасности взяты с сайта
#
http://proft.me/2013/06/15/iptables-setevaya-bezopasnost-i-filtraciya-paketov/# ---------- Запрет доступа в интернет ------------ #
#iptables -A FORWARD -s 192.168.11.160 -j DROP