Настройка iptables. Офисный шлюз с публикацией и NAT на Ubuntu
В этой статье я расскажу как сделать офисный шлюз в интернет с возможностью публикации сервера. На сервере будет 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
Шлюз готов. Теперь настроить его под ваши нужды не составит проблем.
Декабрь 18th, 2009 at 17:59
сделал все как в описании
но iptables ругается на state
и drpor посылает на справку
сравнил с другими примерами в интернете показалось что перед ними должны стоять два символа — вместо -
поменял
теперь выдает ошибку SNAT requires an argument
и bad argument '–dport'
Декабрь 18th, 2009 at 18:28
Тормознул как оказалось :(
простов примере — заменены на длинное -
кода работал с рутовой консолью она его отображала как короткое -
зашел с терминала и все стало на свои места.
правда остался непонятный пока глюк
после запуска iptables-apply-rules
пишет iptables: Invalid argument. Run `dmesg' for more information.
в dmesg только одна строка:
ip_tables: udp match: only valid for protocol 17
может подскажите что исправить?
Декабрь 30th, 2009 at 13:08
Вместо #!/bin/sh напишите #!/bin/sh -x
запустите и будет видно в какой строке ошибка.
Пишите сюда, попробуем разобраться.
Февраль 19th, 2010 at 17:05
если прописать iptables -A FORWARD -p tcp -m udp –dport 80 -s ${LAN_SUBNET} -j ACCEPT то ругается sudo sh iptables-apply-rules
iptables: Invalid argument. Run `dmesg' for more information.
если изменить udp на tcp то не ругается, но все равно не работает. /etc/iptables.save – пуст. /etc/iptables.downrules – пуст
Вмесо 10.10.10.11 я везде поставил ip DNS сервера а строку «iptables -A INPUT -m tcp -s xxx.xxx.xxx.xxx -p tcp –dport 22 -j ACCEPT» я закоментировал вообще, Моя главная задача раздавать интернет локальной сети а у меня это не получается, может подскажите где я ошибся ???
Февраль 24th, 2010 at 13:12
Это была опечатка. Конечно же надо писать -p tcp -m tcp или -p udp -m udp.
Что бы проверить применилось ли правило – запустите iptables -L
iptables-save без перенаправления в файл так же выдаст все правила.
Можете скинуть сюда вывод одной из этих команд.
Февраль 24th, 2010 at 13:15
Все что находится в секции
##########
# SERVER PUB #
##########
для раздачи интернета не нужно, оно нужно только для публикации сервера
Март 3rd, 2010 at 12:02
Статья очень доходчивая, но и она мне не помогла, у меня 2 сетевые карты в машине, отдельно настроен ADSL модем который постоянно в инете с IP 192.168.1.1 который является шлюзом для моей первой сетевой карты. Вторая сетевая смотрит в локалку, у нее не указан шлюз. На этом компьютере интернет работает отменно и я вижу свою локалку без проблем, поставил squid настроил его, теперь у меня все в локалке прописав IP моей машины и порт в эксплорере имеют счастье юзать инет. Но есть одна машина с банк клиентом, которой нужен инет без прокси. Вот тут у меня и затык. Не могу научить iptables переадрисовывать запросы в интернет указав в качестве шлюза ip моей машины. Как можно посмотреть что происходит при обращение из сети в инет, где то логи есть или как их начать писать?
Март 3rd, 2010 at 12:32
Помониторить можно записав все в лог файл.
Например так (взял с википедии):
Если перед строкой
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT
мы добавим строку
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from ours: "
то для каждого нового соединения к нашему хосту из нашей подсети в системном журнале будет появляться запись примерно такого вида:
Jul 16 20:10:40 interdictor kernel: New connection from ours: IN=eth0 OUT= MAC=00:15:17:4c:89:35:00:1d:60:2e:ed:a5:08:00 SRC=10.134.0.67
DST=10.134.0.65 LEN=48 TOS=0×00 PREC=0×00 TTL=112 ID=38914 DF PROTO=TCP SPT=31521 DPT=8080 WINDOW=65535 RES=0×00 SYN URGP=0
———————
Но проблема похоже в том, что неправильно настроеда сеть на компе. Вы, если я правильно понял, пытаетесь «натить» в ту же подсеть из которой получаете пекеты. Так делать нельзя. Могу предложить вынести банк-клиент и одну из ваших сетевух в другую подсеть, наприер 192.168.2.0/24, а на другой сетевухе раздавать инет через squid.
Март 3rd, 2010 at 13:14
Нет вы не правильно меня поняли, сеть с инетом 192.168.1.1 – 255, сеть в которой нужен инет 192.168.0.0 – 255. Сервак имеет две сетевухи, одна в сеть инета вторая в сеть конторы. На Windows я просто поднимал NAT и все в локальной сети у кого был указан шлюз сервера, получали доступ в интернет. Спасибо за подсказку по мониторингу. Проэкспериментирую отпишу. P.S. Раздел RESET RULES «НЕ» сбрасывает текущие настройки iptables – вернее не все сбрасывает. Вот скрипт который надо сделать исполняемым
IPTABLES=»/sbin/iptables»
$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
Март 3rd, 2010 at 14:58
Спасибо за подсказку, внес изменения в скрипт.
Если не получится решить проблему кидайте логи/конфиги – вместе посмотрим.
Март 3rd, 2010 at 15:36
Вот я голову уже сломал то! Может и правда всежий взгляд мне поможет победить этого демона! :)
Вот мои настройки:
#!/bin/sh
#########
# VARIBLES #
########
WAN_ADDR=192.168.1.45
WAN_DEV=eth1
LAN_DEV=eth3
LAN_GATE=192.168.0.219
LAN_SUBNET=192.169.0.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
###########
# NAT OUTPUT #
###########
iptables -t nat -A POSTROUTING -o ${WAN_DEV} -j LOG –log-level INFO –log-prefix «New WAN: »
iptables -t nat -A POSTROUTING -o ${WAN_DEV} -j SNAT –to-source ${WAN_ADDR}
######
# SAVE #
######
iptables-save > /etc/iptables.up.rules
Вот результат iptable-save:
# Generated by iptables-save v1.4.4 on Wed Mar 3 17:34:24 2010
*nat
:PREROUTING ACCEPT [6:272]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth1 -j LOG –log-prefix «New WAN: » –log-level 6
-A POSTROUTING -o eth1 -j SNAT –to-source 192.168.1.45
COMMIT
# Completed on Wed Mar 3 17:34:24 2010
# Generated by iptables-save v1.4.4 on Wed Mar 3 17:34:24 2010
*filter
:INPUT ACCEPT [62:4473]
:FORWARD ACCEPT [89:37262]
:OUTPUT ACCEPT [34:2078]
COMMIT
# Completed on Wed Mar 3 17:34:24 2010
# Generated by iptables-save v1.4.4 on Wed Mar 3 17:34:24 2010
*mangle
:PREROUTING ACCEPT [168:42815]
:INPUT ACCEPT [13921:2105433]
:FORWARD ACCEPT [4949:1315518]
:OUTPUT ACCEPT [34:2078]
:POSTROUTING ACCEPT [14792:2603931]
COMMIT
# Completed on Wed Mar 3 17:34:24 2010
Вот то что в лог упало когда я с локальной тачки стуканулся ping ya.ru
Mar 3 17:01:03 kubuntu-inet kernel: [22214.100899] New WAN: IN= OUT=eth1 SRC=192.168.0.24 DST=89.202.149.34 LEN=48 TOS=0×00 PREC=0×00 TTL=127 ID=5634 DF PROTO=TCP SPT=4816 DPT=80 WINDOW=65535 RES=0×00 SYN URGP=0
Направьте на путь истинный! :)
Март 3rd, 2010 at 18:32
Скиньте в контактную форму аську (или куда можно написать) – попробуем покрутить.
https://mossyadmin.ru/contacts
Март 5th, 2010 at 08:31
Разобрались в ситуации. Были неправильно указанны DNS.
Март 12th, 2010 at 14:16
Проблема в том, что у меня соединение с интернетом идет через vpn. Есть так же подключение к локальной сети.
Сеть в инет – eth0
Внуть – eth1
Если запускаю его для локалки провайдера, инет работает. Но при попытке указания внешнего интерфейса ppp0 и его статического айпишника инет не работает. Помоги пожалуйста.
Март 12th, 2010 at 14:48
Попробуйте вместо
iptables -t nat -A POSTROUTING -o ${WAN_DEV} -j SNAT --to-source ${WAN_ADDR}
Использовать
iptables -t nat -A POSTROUTING -o ${WAN_DEV} -j MASQUERADE
Март 12th, 2010 at 16:51
К сожалению это не помогло.
Март 12th, 2010 at 17:00
Кидайте аську в контактную форму – посмотрим, правда теперь уже наверное после выходных.
https://mossyadmin.ru/contacts