В этой статье я расскажу как сделать офисный шлюз в интернет с возможностью публикации сервера. На сервере будет 2 сетевые карты. Одна из них смотрит в сеть, другая – в интернет.

Настройка автоматического сохранения и загрузки настроек iptables.

Создайте файл /etc/network/if-pre-up.d/iptables-load и добавьте в него строчки:


#!/bin/sh
iptables-restore exit 0

Создайте файл /etc/network/if-post-down.d/iptables-save и добавьте в него строчки:


#!/bin/sh
if [ -f /etc/iptables.downrules ]; then
iptables-restore fi
iptables-save -c > /etc/iptables.save
exit 0

Сделайте файлы запускаемыми выполнив:


chmod +x /etc/network/if-post-down.d/iptables-save
chmod +x /etc/network/if-pre-up.d/iptables-load

Готово.

Включение маршрутизации iptables.

Откройте на редактирование файл /etc/sysctl.conf и найдите в нем строку начинающуюся на net.ipv4.ip_forward и установите значение в 1. Т.е. должно получиться так:

net.ipv4.ip_forward = 1

Что бы применить настройки выполните перезагрузку или запустите:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Настройка iptables

Для настройки я рекомендую не писать все руками, а использовать скрипт. Это даст наглядность и простоту в редактировании правил.

Создайте файл (я сделал в домашнем каталоке файл iptables-apply-rules) и сделайте его запускаемым.

И добавьте в него строчки ниже. После этого будем их редактировать под определенные нужды.

#!/bin/sh
#########
# VARIBLES #
########
WAN_ADDR=xxx.xxx.xxx.xxx
WAN_DEV=eth0
LAN_DEV=eth1
LAN_GATE=10.10.10.1
LAN_SUBNET=10.10.10.0/24
###########
# RESET RULES #
##########
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# reset the default policies in the nat table.
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# reset the default policies in the mangle table.
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
# flush all the rules in the filter and nat tables.
iptables -F
iptables -t nat -F
iptables -t mangle -F
# erase all chains that's not default in filter and nat table.
iptables -X
iptables -t nat -X
iptables -t mangle -X
###########
# LOCAL RULES #
###########
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m tcp -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT
###########
# NAT OUTPUT #
###########
iptables -t nat -A POSTROUTING -o ${WAN_DEV} -j SNAT --to-source ${WAN_ADDR}
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p icmp -s ${LAN_SUBNET} -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --dport 53 -s ${LAN_SUBNET} -j ACCEPT
iptables -A FORWARD -p udp -m udp --dport 53 -s ${LAN_SUBNET} -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --dport 80 -s ${LAN_SUBNET} -j ACCEPT
##########
# SERVER PUB #
##########
#www in
iptables -t nat -A PREROUTING -d ${WAN_ADDR} -p tcp --dport 80 -j DNAT --to-destination 10.10.10.11
iptables -A FORWARD -p tcp -m tcp --dport 80 -d 10.10.10.11 -j ACCEPT
#ftp in
iptables -t nat -A PREROUTING -d ${WAN_ADDR} -p tcp --dport 21 -j DNAT --to-destination 10.10.10.11
iptables -A FORWARD -p tcp -m tcp --dport 21 -d 10.10.10.11 -j ACCEPT
#PosrgreSQL
iptables -t nat -A PREROUTING -d ${WAN_ADDR} -p tcp --dport 5432 -j DNAT --to-destination 10.10.10.11
iptables -A FORWARD -p tcp -m tcp --dport 5432 -d 10.10.10.11 -j ACCEPT
##########
# FOR OTHER #
##########
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
######
# SAVE #
######
iptables-save > /etc/iptables.rules

Пояснения к скрипту для настройки iptables:

Раздел VARIBLES содержит переменные, которые будут использлваться в скрипте.

WAN_ADDR – ip адрес, который смотрит в интернет
WAN_DEV – имя устройства, которое смотрит в интернет
LAN_DEV – имя устройства, которое смотрит в локальную сеть
LAN_GATE – ip адрес, который смотрит в локалку
LAN_SUBNET – локальная подсеть

Раздел RESET RULES сбрасывает текущие настройки iptables. Его менять не надо.

В разделе LOCAL RULES настроены правила, относящиеся к самому шлюзу, который мы настраиваем. Например

iptables -A INPUT -m tcp -s xxx.xxx.xxx.xxx -p tcp –dport 22 -j ACCEPT

Разрешает подключаться к шлюзу из интернета. Например, можно указать домашний ip адрес и настраивать шлюз из дома.

В разделе NAT OUTPUT настраиваем NAT для раздачи интернета локальной сети. В данном примере открыт 80 порт и доступ к провайдерским DNS серверам.

В разделе SERVER PUB публикуется сервер. Т.е.сам сервер из интернета не виден, а происходит перенаправление портов со шлюза на нужную машину. Например так можно опубликовать WEB сервер.

В данном примере внешние подключения на ftp, http и PostgreSQL перенаправляются на внутренний сервер с ip адресом 10.10.10.11

В разделе FOR OTHER закрываем весь остальной трафик.

В разделе SAVE, как не трудно догадаться, сохраняется конфиг, что бы после перезагрузки шлюза настройки iptables восстановились автоматически.

Активный режим FTP.

Что бы заработал активный режим FTP через NAT нужно после каждой перезагрузки выполнять следующие команды:


modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe iptable_nat
modprobe ip_nat_ftp

Что бы не приходилось самому каждый раз запускать команды вручную добавьте их в конец файла /etc/init.d/rc.local

Шлюз готов. Теперь настроить его под ваши нужды не составит проблем.