Настройка межсетевого экрана и маршрутизации(iptables)

Итак, у нас есть настроенное ppp-подключение и 3 поднятых ethernet-сетевые карты, смотрящие в разные подсети

Теперь стоит относительно сложная и интересная задача настройки маршрутизации между этими сетями и обеспечения доступа из них в internet через ppp-соединение на шлюзе.

Все это будет сделано несколькими скриптами с правилами iptables, которые для удобства будут расположены в отдельном каталоге/root/iptables

clear.sh

Очистка таблиц и цепочек от старых правил

#!/bin/sh

iptables -v -F
iptables -v -X

rules_logs.sh

Цепочки, для записи в лог и окончательного принятия или отбрасывания пакетов. Логи будут писаться в /var/log/debug

#!/bin/sh

################################################################################################
# Ведение логов
###############################################################################################
iptables -v -N LOG_ACCEPT
iptables -v -A LOG_ACCEPT -p all -j LOG --log-level DEBUG --log-prefix " ACCEPT "
iptables -v -A LOG_ACCEPT -p all -j ACCEPT

iptables -v -N LOG_DROP
iptables -v -A LOG_DROP -p all -j LOG --log-level DEBUG --log-prefix " DROP "
iptables -v -A LOG_DROP -p all -j DROP

rules_logs.sh

Цепочки, принимающие или отбрасывающие пакеты с определённых портов

#!/bin/sh

iptables -v -N ALLOW_FTP
iptables -v -A ALLOW_FTP -p tcp -m multiport --source-ports 21 -j LOG_ACCEPT
iptables -v -A ALLOW_FTP -p tcp -m multiport --destination-ports 21 -j LOG_ACCEPT
iptables -v -A ALLOW_FTP -p all -j RETURN

iptables -v -N ALLOW_SSH
iptables -v -A ALLOW_SSH -p tcp -m multiport --source-ports 22 -j LOG_ACCEPT
iptables -v -A ALLOW_SSH -p tcp -m multiport --destination-ports 22 -j LOG_ACCEPT
iptables -v -A ALLOW_SSH -p all -j RETURN

iptables -v -N ALLOW_SMTP
iptables -v -A ALLOW_SMTP -p tcp -m multiport --source-ports 25 -j LOG_ACCEPT
iptables -v -A ALLOW_SMTP -p tcp -m multiport --destination-ports 25 -j LOG_ACCEPT
iptables -v -A ALLOW_SMTP -p all -j RETURN

iptables -v -N ALLOW_DNS
iptables -v -A ALLOW_DNS -p udp -m multiport --source-ports 53 -j LOG_ACCEPT
iptables -v -A ALLOW_DNS -p udp -m multiport --destination-ports 53 -j LOG_ACCEPT
iptables -v -A ALLOW_DNS -p all -j RETURN

iptables -v -N ALLOW_DHCP
iptables -v -A ALLOW_DHCP -p udp -m multiport --source-ports 67,68 -j LOG_ACCEPT
iptables -v -A ALLOW_DHCP -p udp -m multiport --destination-ports 67,68 -j LOG_ACCEPT
iptables -v -A ALLOW_DHCP -p all -j RETURN

iptables -v -N ALLOW_HTTP
iptables -v -A ALLOW_HTTP -p tcp -m multiport --source-ports 80 -j LOG_ACCEPT
iptables -v -A ALLOW_HTTP -p tcp -m multiport --destination-ports 80 -j LOG_ACCEPT
iptables -v -A ALLOW_HTTP -p all -j RETURN

iptables -v -N ALLOW_HTTPC
iptables -v -A ALLOW_HTTPC -p tcp -m multiport --source-ports 81 -j LOG_ACCEPT
iptables -v -A ALLOW_HTTPC -p tcp -m multiport --destination-ports 81 -j LOG_ACCEPT
iptables -v -A ALLOW_HTTPC -p all -j RETURN

iptables -v -N ALLOW_POP
iptables -v -A ALLOW_POP -p tcp -m multiport --source-ports 110 -j LOG_ACCEPT
iptables -v -A ALLOW_POP -p tcp -m multiport --destination-ports 110 -j LOG_ACCEPT
iptables -v -A ALLOW_POP -p all -j RETURN

iptables -v -N ALLOW_SMB
iptables -v -A ALLOW_SMB -p tcp -m multiport --source-ports 139,445 -j LOG_ACCEPT
iptables -v -A ALLOW_SMB -p tcp -m multiport --destination-ports 139,445 -j LOG_ACCEPT
iptables -v -A ALLOW_SMB -p all -j RETURN

iptables -v -N ALLOW_HTTPS
iptables -v -A ALLOW_HTTPS -p tcp -m multiport --source-ports 443 -j LOG_ACCEPT
iptables -v -A ALLOW_HTTPS -p tcp -m multiport --destination-ports 443 -j LOG_ACCEPT
iptables -v -A ALLOW_FTP -p all -j RETURN

iptables -v -N ALLOW_SMTPS
iptables -v -A ALLOW_SMTPS -p tcp -m multiport --source-ports 465 -j LOG_ACCEPT
iptables -v -A ALLOW_SMTPS -p tcp -m multiport --destination-ports 465 -j LOG_ACCEPT
iptables -v -A ALLOW_SMTPS -p all -j RETURN

iptables -v -N ALLOW_POPS
iptables -v -A ALLOW_POPS -p tcp -m multiport --source-ports 995 -j LOG_ACCEPT
iptables -v -A ALLOW_POPS -p tcp -m multiport --destination-ports 995 -j LOG_ACCEPT
iptables -v -A ALLOW_POPS -p all -j RETURN

iptables -v -N ALLOW_SQUID
iptables -v -A ALLOW_SQUID -p tcp -m multiport --source-ports 3128 -j LOG_ACCEPT
iptables -v -A ALLOW_SQUID -p tcp -m multiport --destination-ports 3128 -j LOG_ACCEPT
iptables -v -A ALLOW_SQUID -p all -j RETURN

iptables -v -N ALLOW_ICQ
iptables -v -A ALLOW_ICQ -p tcp -m multiport --source-ports 5190 -j LOG_ACCEPT
iptables -v -A ALLOW_ICQ -p tcp -m multiport --destination-ports 5190 -j LOG_ACCEPT
iptables -v -A ALLOW_ICQ -p all -j RETURN

iptables -v -N ALLOW_XMPP
iptables -v -A ALLOW_XMPP -p tcp -m multiport --source-ports 5222 -j LOG_ACCEPT
iptables -v -A ALLOW_XMPP -p tcp -m multiport --destination-ports 5222 -j LOG_ACCEPT
iptables -v -A ALLOW_XMPP -p all -j RETURN

iptables -v -N ALLOW_WESNOTH
iptables -v -A ALLOW_WESNOTH -p tcp -m multiport --source-ports 14998,14999,15000,15001 -j LOG_ACCEPT
iptables -v -A ALLOW_WESNOTH -p tcp -m multiport --destination-ports 14998,14999,15000,15001 -j LOG_ACCEPT
iptables -v -A ALLOW_WESNOTH -p all -j RETURN

iptables -v -N ALLOW_ICMP
iptables -v -A ALLOW_ICMP -p icmp --icmp-type 8 -j LOG_ACCEPT
iptables -v -A ALLOW_ICMP -p all -j RETURN

iptables -v -N DENY_FTP
iptables -v -A DENY_FTP -p tcp -m multiport --source-ports 21 -j LOG_DROP
iptables -v -A DENY_FTP -p tcp -m multiport --destination-ports 21 -j LOG_DROP
iptables -v -A DENY_FTP -p all -j RETURN

iptables -v -N DENY_SSH
iptables -v -A DENY_SSH -p tcp -m multiport --source-ports 22 -j LOG_DROP
iptables -v -A DENY_SSH -p tcp -m multiport --destination-ports 22 -j LOG_DROP
iptables -v -A DENY_SSH -p all -j RETURN

iptables -v -N DENY_SMTP
iptables -v -A DENY_SMTP -p tcp -m multiport --source-ports 25 -j LOG_DROP
iptables -v -A DENY_SMTP -p tcp -m multiport --destination-ports 25 -j LOG_DROP
iptables -v -A DENY_SMTP -p all -j RETURN

iptables -v -N DENY_DNS
iptables -v -A DENY_DNS -p udp -m multiport --source-ports 53 -j LOG_DROP
iptables -v -A DENY_DNS -p udp -m multiport --destination-ports 53 -j LOG_DROP
iptables -v -A DENY_DNS -p all -j RETURN

iptables -v -N DENY_DHCP
iptables -v -A DENY_DHCP -p udp -m multiport --source-ports 67,68 -j LOG_DROP
iptables -v -A DENY_DHCP -p udp -m multiport --destination-ports 67,68 -j LOG_DROP
iptables -v -A DENY_DHCP -p all -j RETURN

iptables -v -N DENY_HTTP
iptables -v -A DENY_HTTP -p tcp -m multiport --source-ports 80 -j LOG_DROP
iptables -v -A DENY_HTTP -p tcp -m multiport --destination-ports 80 -j LOG_DROP
iptables -v -A DENY_HTTP -p all -j RETURN

iptables -v -N DENY_HTTPC
iptables -v -A DENY_HTTPC -p tcp -m multiport --source-ports 81 -j LOG_DROP
iptables -v -A DENY_HTTPC -p tcp -m multiport --destination-ports 81 -j LOG_DROP
iptables -v -A DENY_HTTPC -p all -j RETURN

iptables -v -N DENY_POP
iptables -v -A DENY_POP -p tcp -m multiport --source-ports 110 -j LOG_DROP
iptables -v -A DENY_POP -p tcp -m multiport --destination-ports 110 -j LOG_DROP
iptables -v -A DENY_POP -p all -j RETURN

iptables -v -N DENY_SMB
iptables -v -A DENY_SMB -p tcp -m multiport --source-ports 139,445 -j LOG_DROP
iptables -v -A DENY_SMB -p tcp -m multiport --destination-ports 139,445 -j LOG_DROP
iptables -v -A DENY_SMB -p all -j RETURN

iptables -v -N DENY_HTTPS
iptables -v -A DENY_HTTPS -p tcp -m multiport --source-ports 443 -j LOG_DROP
iptables -v -A DENY_HTTPS -p tcp -m multiport --destination-ports 443 -j LOG_DROP
iptables -v -A DENY_FTP -p all -j RETURN

iptables -v -N DENY_SMTPS
iptables -v -A DENY_SMTPS -p tcp -m multiport --source-ports 465 -j LOG_DROP
iptables -v -A DENY_SMTPS -p tcp -m multiport --destination-ports 465 -j LOG_DROP
iptables -v -A DENY_SMTPS -p all -j RETURN

iptables -v -N DENY_POPS
iptables -v -A DENY_POPS -p tcp -m multiport --source-ports 995 -j LOG_DROP
iptables -v -A DENY_POPS -p tcp -m multiport --destination-ports 995 -j LOG_DROP
iptables -v -A DENY_POPS -p all -j RETURN

iptables -v -N DENY_SQUID
iptables -v -A DENY_SQUID -p tcp -m multiport --source-ports 3128 -j LOG_DROP
iptables -v -A DENY_SQUID -p tcp -m multiport --destination-ports 3128 -j LOG_DROP
iptables -v -A DENY_SQUID -p all -j RETURN

iptables -v -N DENY_ICQ
iptables -v -A DENY_ICQ -p tcp -m multiport --source-ports 5190 -j LOG_DROP
iptables -v -A DENY_ICQ -p tcp -m multiport --destination-ports 5190 -j LOG_DROP
iptables -v -A DENY_ICQ -p all -j RETURN

iptables -v -N DENY_XMPP
iptables -v -A DENY_XMPP -p tcp -m multiport --source-ports 5222 -j LOG_DROP
iptables -v -A DENY_XMPP -p tcp -m multiport --destination-ports 5222 -j LOG_DROP
iptables -v -A DENY_XMPP -p all -j RETURN

iptables -v -N DENY_WESNOTH
iptables -v -A DENY_WESNOTH -p tcp -m multiport --source-ports 14998,14999,15000,15001 -j LOG_DROP
iptables -v -A DENY_WESNOTH -p tcp -m multiport --destination-ports 14998,14999,15000,15001 -j LOG_DROP
iptables -v -A DENY_WESNOTH -p all -j RETURN

iptables -v -N DENY_ICMP
iptables -v -A DENY_ICMP -p icmp --icmp-type 8 -j LOG_DROP
iptables -v -A DENY_ICMP -p all -j RETURN

rules_users.sh

#!/bin/sh

###################################################################################
# Правила для FORWARD привелегированных пользователей
##################################################################################
iptables -v -N FORWARDS_ROOT
iptables -v -A FORWARDS_ROOT -p all -j LOG_ACCEPT
iptables -v -A FORWARDS_ROOT -p all -j RETURN
###################################################################################
# Правила для FORWARD обычных пользователей
##################################################################################
iptables -v -N FORWARDS_USER
iptables -v -A FORWARDS_USER -p all -j RETURN

###################################################################################
# Правила для INNER привелегированных пользователей
##################################################################################
iptables -v -N INNERS_ROOT
iptables -v -A INNERS_ROOT -p all -j LOG_ACCEPT
iptables -v -A INNERS_ROOT -p all -j RETURN
###################################################################################
# Правила для INNER обычных пользователей
##################################################################################
iptables -v -N INNERS_USER
iptables -v -A INNERS_USER -j ALLOW_DNS
iptables -v -A INNERS_USER -j ALLOW_SQUID
iptables -v -A INNERS_USER -j ALLOW_SMB
iptables -v -A INNERS_USER -j RETURN
###################################################################################
# Правила для INNER админов
##################################################################################
iptables -v -N INNERS_ADMIN
iptables -v -A INNERS_ADMIN -j ALLOW_DNS
iptables -v -A INNERS_ADMIN -j ALLOW_SQUID
iptables -v -A INNERS_ADMIN -j ALLOW_SMB
iptables -v -A INNERS_ADMIN -j ALLOW_SSH
iptables -v -A INNERS_ADMIN -j ALLOW_HTTPC
iptables -v -A INNERS_ADMIN -j RETURN

Цепочки, определяющие какому типу пользователей какие порты разрешены или запрещены. По умолчанию для пакеты, предназначенных шлюзу, отбрасываются(INNER-правила), и необходимо разрешить соединение по нужным портам. Для пакетов, проходящих мимо шлюза(маршрутизируемых) по умолчанию нет запретов, и прописываются запрещённые порты. Умолчальные правила прописаны в файле rules_politics.sh.

rules_groups.sh

Цепочки, определяющие к какому типу пользователей относитятся пакеты, приходящие с определённых IP локальной сети

#!/bin/sh

##################################################################################
# Группы пользователей для доступа к интернетам
##################################################################################
iptables -v -N FORWARDS_USERGROUPS
# Привелегированные пользователи. В интернет - без ограничений
#iptables -v -A FORWARDS_USERGROUPS --source 192.168.1.64 -j FORWARDS_ROOT
#iptables -v -A FORWARDS_USERGROUPS --destination 192.168.1.64 -m conntrack --ctstate ESTABLISHED,RELATED -j FORWARDS_ROOT
# Обычные пользователи.
iptables -v -A FORWARDS_USERGROUPS --source 192.168.1.64 -j FORWARDS_USER
iptables -v -A FORWARDS_USERGROUPS --destination 192.168.1.64 -m conntrack --ctstate ESTABLISHED,RELATED -j FORWARDS_USER
iptables -v -A FORWARDS_USERGROUPS --source 192.168.0.1 -j FORWARDS_USER
iptables -v -A FORWARDS_USERGROUPS --destination 192.168.0.1 -j FORWARDS_USER
# Неизвестные пользователи - в топку
iptables -v -A FORWARDS_USERGROUPS -j RETURN

##################################################################################
# Группы пользователей для доступа к шлюзу
##################################################################################
iptables -v -N INNERS_USERGROUPS

# Привелегированные пользователи. К серверу - без ограничений
iptables -v -A INNERS_USERGROUPS --source 192.168.1.1 -j INNERS_ROOT
iptables -v -A INNERS_USERGROUPS --destination 192.168.1.1 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_ROOT

iptables -v -A INNERS_USERGROUPS --source 192.168.2.1 -j INNERS_ROOT
iptables -v -A INNERS_USERGROUPS --destination 192.168.2.1 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_ROOT

iptables -v -A INNERS_USERGROUPS --source 192.168.0.128 -j INNERS_ROOT
iptables -v -A INNERS_USERGROUPS --destination 192.168.0.128 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_ROOT

# Обычные пользователи.

iptables -v -A INNERS_USERGROUPS --source 192.168.0.1 -j INNERS_USER
iptables -v -A INNERS_USERGROUPS --destination 192.168.0.1 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_USER

# Админы.

iptables -v -A INNERS_USERGROUPS --source 192.168.1.64 -j INNERS_ADMIN
iptables -v -A INNERS_USERGROUPS --destination 192.168.1.64 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_ADMIN

iptables -v -A INNERS_USERGROUPS --source 192.168.0.1 -j INNERS_ADMIN
iptables -v -A INNERS_USERGROUPS --destination 192.168.0.1 -m conntrack --ctstate ESTABLISHED,RELATED -j INNERS_ADMIN
# Неизвестные пользователи - в топку
iptables -v -A INNERS_USERGROUPS -j RETURN

rules_redirect.sh

Тут расположены цепочки, отправляющие пришедших на 80-й порт на 3128-порт(прокси сервер), то есть все хождения по http — принудительно через прокси. Так же тут прописываются правила на получение DHCP-пакетов любым хостом.

#!/bin/sh

iptables -v -A INPUT -p UDP -m multiport --source-ports 67 -j LOG_ACCEPT
iptables -v -A INPUT -p UDP -m multiport --destination-ports 68 -j LOG_ACCEPT
iptables -v -A OUTPUT -p UDP -m multiport --source-ports 67 -j LOG_ACCEPT
iptables -v -A OUTPUT -p UDP -m multiport --destination-ports 68 -j LOG_ACCEPT

iptables -v -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -v -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -v -t nat -A PREROUTING -i eth2 -p tcp --dport 80 -j REDIRECT --to-port 3128
b

rules_politics.sh

Правила по умолчанию, если ни одно из вышеперечисленных не сработало

#!/bin/sh

################################################################################# Обработка входящих и исходящих пакетов
##################################################################################
# Все остальные входящие пакеты - на проверку
iptables -v -A INPUT -p all -j INNERS_USERGROUPS
# Все исходящие пакеты - на проверку
iptables -v -A OUTPUT -p all -j INNERS_USERGROUPS

################################################################################# Политики по умолчанию
################################################################################
# Все входящие по умолчанию глушим
iptables -v -A INPUT -p all -j LOG_DROP
# Все исходящие по умолчанию глушим
iptables -v -A OUTPUT -p all -j LOG_DROP
# Все пролетающие по умолчанию пропускаем
iptables -v -A FORWARD -p all -j LOG_ACCEPT

rules_ppp0.sh

Тут подключаются все вышеописанные правила, даётся доступ шлюза к ppp-соединению, пробрасываются маршруты между подсетями и устраивается маскарадинг для ppp0.

#!/bin/sh

echo "=============================== clear old rules ============================================";
/root/iptables/clear.sh
echo "==================================== set log rules =======================================";
/root/iptables/rules_logs.sh
echo "==================================== set services rules =======================================";
/root/iptables/rules_services.sh
echo "=================================== set users rules  ========================================";
/root/iptables/rules_users.sh
echo "===================================  set groups rules ========================================";
/root/iptables/rules_groups.sh
echo "===================================== set prerouting ======================================";
/root/iptables/rules_redirect.sh
echo "====================================  set post routing =======================================";
iptables -v -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
iptables -v -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
iptables -v -t nat -A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
echo "=================================== set routing ========================================";
################################################################################
# Пробрасываем маршруты
################################################################################
iptables -v -A INPUT -p all -i ppp0 -m conntrack --ctstate ESTABLISHED,RELATED -j LOG_ACCEPT
iptables -v -A OUTPUT -p all -o ppp0 -j LOG_ACCEPT

iptables -v -A FORWARD -i ppp0 -o eth0 --source 0.0.0.0/0 --destination 192.168.0.0/24 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i ppp0 -o eth1 --source 0.0.0.0/0 --destination 192.168.1.0/24 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i ppp0 -o eth2 --source 0.0.0.0/0 --destination 192.168.2.0/24 -j FORWARDS_USERGROUPS

iptables -v -A FORWARD -i eth0 -o ppp0 --source 191.168.0.0/24 --destination 0.0.0.0/0 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth0 -o eth1 --source 191.168.0.0/24 --destination 192.168.1.0/24 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth0 -o eth2 --source 191.168.0.0/24 --destination 192.168.2.0/24 -j FORWARDS_USERGROUPS

iptables -v -A FORWARD -i eth1 -o ppp0 --source 191.168.1.0/24 --destination 0.0.0.0/0 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth1 -o eth0 --source 191.168.1.0/24 --destination 192.168.0.0/24 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth1 -o eth2 --source 191.168.1.0/24 --destination 192.168.2.0/24 -j FORWARDS_USERGROUPS

iptables -v -A FORWARD -i eth2 -o ppp0 --source 191.168.2.0/24 --destination 0.0.0.0/0 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth2 -o eth0 --source 191.168.2.0/24 --destination 192.168.0.0/24 -j FORWARDS_USERGROUPS
iptables -v -A FORWARD -i eth2 -o eth1 --source 191.168.2.0/24 --destination 192.168.1.0/24 -j FORWARDS_USERGROUPS

echo "====================================== set politics =====================================";
/root/iptables/rules_politics.sh

Запуск

Чтобы правила применялись при загрузке машины, сделаем символическую ссылку

ln -s /root/iptables/rules_eth0.sh /etc/rc.firewall

И пропишем в rc.local

/etc/rc.firewall

One Response to Настройка межсетевого экрана и маршрутизации(iptables)

  1. Pingback: Простой шлюз на iptables для раздачи интернета с модемного соединения (ppp0) в Linux(Debian и Ubuntu). | Perpetuum mobile

Добавить комментарий