Организация шлюза iptables
Для начинающих поможет разобраться, как раздать интернет в локальной сети
Самая типичная ситуация, когда на компьютере (сервере) есть 2 сетевых интерфейса - один имеет выход в интернет, а второй в локальную сеть.
И необходимо организовать доступ через него в сеть интернет.
Самый базовый набор правил представлен в виде скрипта, необходимо лишь изменить параметры:
- IF_OUT
- IF_LAN
- MASK_LAN
Установленные правила разрешают все исходящие соединения из локальной сети. Все соединения исходящие с самого сервера. Все входящие соединения из локальной сети к серверу. Из интернета к серверу разрешено подключаться по ssh и пигновать сервер.
Листинг
#!/bin/bash IPTABLES="/sbin/iptables" ####################################################################################################### # Настройки ####################################################################################################### # !!! НЕОБХОДИМО ИЗМЕНИТЬ НА СОБСТВЕННЫЕ !!! IF_OUT="eth0" # Имя интерфейса подключенного к интернет IF_LAN="eth1" # Имя интерфейса подключенного к локальной сети MASK_LAN="192.168.0.0/24" # Указание локальной сети (адрес сети и маска) ####################################################################################################### IF_LO="lo" ADDR_LO="127.0.0.1" LOOPBACK="127.0.0.0/8" sysctl -w net.ipv4.ip_forward=1 # Настройка ядра, для разрешения на продвижение пакетов sysctl -w net.ipv4.ip_dynaddr=1 # Позволяет выполнять корректно MASQUERADE при динамическом изменении ip адреса modprobe ip_nat_ftp # Для правильной работы активного режима FTP ####################################################################################################### # Сброс и установка правил по умолчанию ####################################################################################################### $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X $IPTABLES -P INPUT DROP # По умолчанию блокирует входящий трафик $IPTABLES -P FORWARD DROP # По умолчанию блокирует проходящий трафик $IPTABLES -P OUTPUT ACCEPT # По умолчанию разрешает исходящий трафик ####################################################################################################### # Создание цепочек правил ####################################################################################################### # Базовая проверка пакетов - невалидные пакты (common-check) $IPTABLES -N common-check $IPTABLES -F common-check $IPTABLES -A common-check -m state --state INVALID -j DROP $IPTABLES -A common-check -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset $IPTABLES -A common-check -p tcp ! --syn -m state --state NEW -j DROP $IPTABLES -A common-check -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPTABLES -A common-check -p tcp --tcp-flags ALL ALL -j DROP $IPTABLES -A common-check -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPTABLES -A common-check -p tcp --tcp-flags ALL NONE -j DROP $IPTABLES -A common-check -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPTABLES -A common-check -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Обработка входящих icmp запросов (icmp-in) $IPTABLES -N icmp-in $IPTABLES -F icmp-in $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT # Разрешает уже установленные соединения (statefull) $IPTABLES -N statefull $IPTABLES -F statefull $IPTABLES -A statefull -m state --state ESTABLISHED,RELATED -j ACCEPT ################################################################################################# # Задание правил для входящего трафика ################################################################################################# ## Проверяем пакеты (!первое правило в цепочке) $IPTABLES -A INPUT -j common-check ## Разрешаем icmp запросы к серверу (ping) $IPTABLES -A INPUT -j icmp-in ## Разрешаем SSH (!из интернета) $IPTABLES -A INPUT -p tcp --dport 22 -i $IF_OUT -j ACCEPT ## Разрешаем входящий трафик с локальной сети $IPTABLES -A INPUT -i $IF_LAN -j ACCEPT ## Разрешаем локальный интрефейс $IPTABLES -A INPUT -i $IF_LO -d $LOOPBACK -j ACCEPT ## Разрешаем установленные соединения (!последнее правило в цепочке) $IPTABLES -A INPUT -j statefull ################################################################################################# # Задание правил для исходящего трафика ################################################################################################# # По умолчанию исходящий трафик разрешен ## Проверяем пакеты (!первое правило в цепочке) $IPTABLES -A OUTPUT -j common-check ################################################################################################# # Задание правил для продвижения пакетов ################################################################################################# ## Проверяем пакеты (!первое правило в цепочке) $IPTABLES -A FORWARD -j common-check ## Организация NAT $IPTABLES -t nat -A POSTROUTING -s $MASK_LAN -o $IF_OUT -j MASQUERADE ## Разрешаем !весь! проходящий трафик с локальной сети (контроль маска и интерфейс!) $IPTABLES -A FORWARD -i $IF_LAN -s $MASK_LAN -j ACCEPT ## Разрешаем установленные соединения (!последнее правило в цепочке) $IPTABLES -A FORWARD -j statefull ################################################################################################## echo done!
После перезагрузки компа правила нужно восстановить. Один из способов как это можно сделать - прописать скрипт в автозагрузку.
В Ubuntu - сохранить скрипт в папке
/etc/network/if-pre-up.d/
и не забыть поставить права на выполнение
sudo chmod +x [файл]
Обсуждение