Обращаюсь к вам с парой вопросов, просветите плз
Дано
шлюз на Ubuntu Server
DNS(bind9, кэширующий и форфардинг на dns провайдера и opendns)
DHCP(dhcp3,раздает динамические адреса и назначает шлюз и dns по умолчанию)
VPN(pptp, нужно для работы начальства из дома)
на текущий момент 2 сетевых интерфейса - один смотрит в и-нет, один в локалку(логично, не правда ли)
iptables следующего вида
Код: Выделить всё
# !/bin/sh
###Задаем переменные, используемые в скрипте
OurNet=192.168.0.0/24 # Адреса нашей локальной сети
LanInt=eth2 # Внутренний интерфейс сервера
LanIP=192.168.0.1 # Адрес внутреннего интерфейса сервера
WanInt=eth0 # Внешний интерфейс сервера
WanIP=xxx.xxx.xxx.xxx #Адрес внешнего интерфейса сервера
GW=xxx.xxx.xxx.xxx # Адрес шлюза провайдера
UNPRIPORTS="1024:65535" # Номера непривилегированных портов
# Если системная сетевая конфигурации не была установлена или была
# установлена не правильно
# установлен можно внести следующие строки:
ifconfig $LanInt $LanIP
ifconfig $WanInt $WanIP
route del default
route add default gw $GW
# Очистка таблиц и цепочек
iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain
# Назначение глобальных политик фаервола
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
# Загружаем модули, для корректной работы VPN, Active ftp, DCC которые будут идти через нат.
modprobe ip_nat_ftp
modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
## Изменение параметров SYSCTL
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включение форвардинга для VPN
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
#echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
#echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединение закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries
# Закрываем порты NETBIOS :
iptables -A INPUT -p tcp --destination-port 445 -j DROP
iptables -A INPUT -p tcp --destination-port 135 -j DROP
iptables -A INPUT -p udp -m multiport --ports 135,136,137,138,139 -j DROP
iptables -A INPUT -p tcp -m multiport --ports 135,136,137,138,139 -j DROP
iptables -A FORWARD -p udp -m multiport --ports 135,136,137,138,139,445 -j DROP
iptables -A FORWARD -p tcp -m multiport --ports 135,136,137,138,139,445 -j DROP
# Блокируем входящие пакеты с локальными IP адресами приходящие на внешний интерфейс
iptables -A INPUT -p tcp -i $WanInt -s $OurNet -j DROP
# Блокируем входящие пакеты c нелокальными IP на внутреннем интерфейсе
iptables -A INPUT -p tcp -i $LanInt -s ! $OurNet -j DROP
# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
# Разрешаем все ранее запрошенные/установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! $WanInt -j ACCEPT
iptables -A FORWARD -i $WanInt -o $LanInt -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем прохождение пакетов по интерфейсу обратной петли
iptables -A INPUT -i lo -j ACCEPT
# Statistics and auths for customers, ping tests
for net_ips in $OurNet; do
iptables -A INPUT -p icmp -i $LanInt --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp -i $WanInt --icmp-type echo-request -j ACCEPT
done
############ Открываем нужные нам порты.
# DNS сервер имен разрешаем.
iptables -A OUTPUT -p udp -m udp -o $WanInt --dport 53 --sport $UNPRIPORTS -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -o $WanInt --dport 53 --sport $UNPRIPORTS -j ACCEPT
iptables -A INPUT -p udp -m udp -i $WanInt --dport $UNPRIPORTS --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i $WanInt --dport $UNPRIPORTS --sport 53 -j ACCEPT
# FTP
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
# PASSIVE FTP
iptables -t filter -A INPUT -p tcp -m tcp --dport 50000:50500 -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport 50000:50500 -m state --state NEW -j ACCEPT
# закрываем APACHE снаружи(нефиг читать нашу статистику, она на вебморде)
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP
#Разрешаем VPN для определенных адресов и запрещаем остальным
iptables -A INPUT -s xxx.xxx.xxx.xxx -i $WanInt -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -s xxx.xxx.xxx.xxx -i $WanInt -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i $WanInt -p tcp --dport 1723 -j DROP
#Разрешаем доступ к pptp-серверу для всех
#iptables -A INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT
#Разрешаем доступ по ssh на внешний интерфейс только с определенных адресов, с остальных закрываем
iptables -A INPUT -s xxx.xxx.xxx.xxx -i $WanInt -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -i $WanInt -p tcp --dport 22 -j ACCEPT
#Разрешаем работу почтовых клиентов(и в последствии почтового сервера)
iptables -A INPUT -i $WanInt -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i $WanInt -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i $LanInt -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i $LanInt -p tcp --dport 25 -j ACCEPT
#NAT(маскарадинг)
iptables -t nat -A POSTROUTING -o $WanInt -j MASQUERADE
#Для Yota,если используется usb-модем для частного пользования в целях роутинга и раздачи интернета
iptables -t mangle -A PREROUTING -i $WanInt -j TTL --ttl-set 64
# Закрываем известные троянские порты:
iptables -A FORWARD -p udp --sport 16355 -j DROP
iptables -A FORWARD -p udp --sport 21111 -j DROP
#Запрещаем все на внешнем интерфейсе, что не разрешено выше
iptables -A INPUT -i $WanInt -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options
iptables -A INPUT -i $WanInt -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
#iptables -A FORWARD -o $WanInt -p tcp -j DROPНа данный момент работает, но нужно несколько исправлений
И собственно вопросы
1) можно ли избавиться от
Код: Выделить всё
route del default
route add default gw $GWв начале и организовать работу шлюза без указания маршрута в таком виде. Т.е. надо чтобы нигде в скрипте не было привязки к конкретному IP, а только к интерфейсам
2) сейчас используется доступ к и-нету через обычного провайдера, но недавно начальство захотело Yota ибо дешевле и быстрее(ну не факт что быстрее чем сейчас у нас, но однозначно дешевле ибо трафик безлимитный на Yota, а у нас сейчас лимитированный и дорогой).
Так вот, драйвера были установлены(спасибо автору madwimax-драйверов), при подключении модема Yota доступ в и-нет с сервера есть(если переписать немного скрипт iptables то есть он и у клиентов локальной сети).
Однако есть две проблемы
- при текущем скрипте iptables, надо следить за IP, который получает модем от Yota(ибо он динамический) и менять его в скрипте чтоб и-нет не пропал у клиентов из локалки(именно из-за этого возник вопрос №1)
- самое для меня на текущий момент сложное. Надо чтобы были активны оба внешних интерфейса(от старого провайдера и от Yota) и между ними балансировалась нагрузка, ну или хотя бы http/почтовый трафик шел через Yota, а банк-клиенты работали через старого прова(в Yota они не работают ибо там MTU меньше и банк-клиенты отказываються коннектиться)
Просьба помочь либо готовыми изменениями в текущей конфигурации или ссылками на что нибудь близкое к теме ибо времени на долгое гугление увы нет(ну или хотябы намекните куда копать поточнее).
ЗЫ буду благодарен если у кого то найдется желание и возможность в общем оценить скрипт iptables и сказать что там можно было бы подкорректировать для улучшение защиты шлюза извне.
Заранее всем спасибо!