LinuxForum.Fans
Тема

iptables nat

Автор: azat 16 сообщений 4379 просмотров
#58648

Плохо работает NAT через iptables

Нужно было чтобы, комп из локалки (оs windows xp sp3), мог заходить в инет, через мой комп (os debian squezze),
Добавил сл. правила:

text

    # forwarding
    $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -s $NAT_IP -j ACCEPT

# masquerade $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $NAT_IP -j MASQUERADE

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

где:
$IPTABLES - путь к iptables
$INET_IFACE - сетевуха, которая смотрит в инет
$LAN_IFACE - сетевуха, которая смотрит в сеть
$NAT_IP - ip, который должен получить доступ в инет


Так вот работает он плохо, т.к. через некоторое время на на компе из локалки инет пропадает
Причем сначала, на том компе из локалки был инет через провайдера, и он работал нормально (его пришлось отрубить)

И к мою компу совсем не сыпятся запросы, смотрел в iptstate

Так же пробовал написать, сл. правило

text

$IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1500

но тоже не помагает

Подскажите кто знает в чем проблема

(Вложение просто так, без него тема почему-то не создавалась!)

#58654

Давайте по порядку.
Зачем вот это правило:

text
 $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT

и стоит оно первым. Вы предоставляете вебсервер (к примеру) для общего пользования?
Про

И к мою компу совсем не сыпятся запросы, смотрел в iptstate

не совсем понятно.
Вы пытались пинговать с винды комп на линуксе?
Тогда вам нужно правило INPUT
Можно взглянуть на весь скрипт, задающий правила?
И ещё, у вас динамический внешний Ip?

#58658
Vadimsky написал:
Давайте по порядку.
Зачем вот это правило:
$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT
и стоит оно первым. Вы предоставляете вебсервер (к примеру) для общего пользования?

чтобы комп(os windows) мог получать обратно пакеты
да

Vadimsky написал:
Про
И к мою компу совсем не сыпятся запросы, смотрел в iptstate
не совсем понятно.

заходил в iptstate и смотрел, там пакеты с src или dst не было, с локальным адресом компа (который os windows)

Vadimsky написал:
ы пытались пинговать с винды комп на линуксе?

вообще не пингуется, но это потому что я закрыл пинг, но samba сервер работает, и с локального того компа заходит на него

Vadimsky написал:
Тогда вам нужно правило INPUT

какое и зачем?

Vadimsky написал:
Можно взглянуть на весь скрипт, задающий правила?

да, в аттаче

Vadimsky написал:
И ещё, у вас динамический внешний Ip?

нет, статический


И еще
В windows в логах, появляется сл. сообщение, не знаю что оно означает, но может поможет
Я сам то гуглил, но ничего путного не нашел

text

Тип события:    Ошибка
Источник события:    MRxSmb
Категория события:    Отсутствует
Код события:    8003
Дата:        10.07.2010
Время:        19:22:39
Пользователь:        Н/Д
Компьютер:    WIN
Описание:
Основной обозреватель сети получил с сервера извещение, что компьютер AZAT объявил себя основным обозревателем домена на транспорте NetBT_Tcpip_{A6FC9B05-3049-41FB-A6FC. Основной обозреватель останавливается или объявляются выборы.
Данные:
0000: 00 00 00 00 03 00 4e 00   ......N.
0008: 00 00 00 00 43 1f 00 c0   ....C..A
0010: 00 00 00 00 00 00 00 00   ........
0018: 06 00 00 00 00 00 00 00   ........
0020: 00 00 00 00 00 00 00 00   ........

AZAT - имя моего компа

#58676

И так по порядку.
чтобы комп(os windows) мог получать обратно пакеты у вас есть правило

text
$IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -s $NAT_IP -j ACCEPT

кстати ему не мешало бы приписать те самые RELATED,ESTABLISHED, ну да ладно, тоже будет работать.
Правило INPUT - разрешающее пинги, но раз они запрещены то проехали, хотя ИМХО для локалки пинги лучше разрешить, хотя бы на время отладки.
Если у вас внешний ip статический то идеологически правильнее будет правило

text
$IPTABLES -t nat -A POSTROUTING -s $PRIVATE_IP -o $INET_IFACE -j SNAT --to-source $REAL_IP

вместо MASQUERADE, да и нагрузка меньше будет.
Что касается приведённых логов винды, то это последствия работы самбы. Самба обявила себя основным обозревателем домена, и винде это не понравилось естественно.
Нужно в конфиге самбы прописать:

text

domain master = no
local master = no
os level = 10
preferred master = no

что бы винда не обращала на неё внимания, либо:

text

domain master = yes
local master = yes
os level = 100
preferred master = yes

что бы винда заткнулась и не возникала.
А по существу вопроса, вы скрипт iptables сами писали или взяли готовый?
Попробуйте написать попроще, с правилами только под ваши нужды.

#58677

За самбу спасибо!

Vadimsky написал:
А по существу вопроса, вы скрипт iptables сами писали или взяли готовый?

Сам писал, там все нужное

А вот по поводу того что сначала работает, а потом нет, как это можно объяснить?
Я думал сначала что это из-за большого кол-ва пакетов(торрент) но потом закрыл торрент клиент, и все равно через некоторое время на винде инет отваливается

#58679

Самое простое - когда на винде отвалился инет, есть ли он на сервере?

#58681

конечно есть)
иначе вопрос был бы другой

#58685

Сервер на линуксе является шлюзом по умолчанию и первичным ДНС-ом для винды?
сделайте на винде (в момент отвала инета)
ping linuxforum.ru
и nslookup linuxforum.ru
и покажите сюда результат.

#58687
Vadimsky написал:
Сервер на линуксе является шлюзом по умолчанию и первичным ДНС-ом для винды?

неа, только шлюзом,
днс в лом поднимать

и ты не правильно подсказал, вот это правило нужное, так как оно отправляет пакеты в компу обратно
$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT
а это, чтобы отправлять пакты в инет
$IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -s $NAT_IP -j ACCEPT
либо из-за этого не работает теперь
$IPTABLES -t nat -A POSTROUTING -s $PRIVATE_IP -o $INET_IFACE -j SNAT --to-source $REAL_IP

Vadimsky написал:
ping linuxforum.ru

просто ничего не выводиться, а чрез некоторое время само закрывается
думаю с nslookup тоже самое, но пока проверить не могу

т.к. я убрал это правило и инета вообще там нету, теперь

#58689
azat написал:
$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT

Разрешает проходить пакетам от установленных соединений

azat написал:
$IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -s $NAT_IP -j ACCEPT

Разрешает ходить пакетам между указанными интерфейсами.

NAT-ом тут и не пахнет =).

Чтобы им запахло следует добавить эту строку (если адрес на внешку статический):

text
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $REAL_IP

или вот эту (если адрес динамический)

text
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $NAT_IP -j MASQUERADE

По поводу пропадания интернета надо смотреть внимательно
1. исправно ли оборудование (сетевые карты, свитч(если есть), кабель и т.д.)
2. исправна ли ОС windows и не заблокировал ли сеть файрвол или касперский (такое бывает =) ).
3. что ходит по сети между шлюзом и рабочей машиной, когда пропал интернет. (возможно это натолкнет на решение проблемы).

З.Ы. Кстати. Когда пропадает инет посмотрите вывод команды cat /proc/sys/net/ipv4/ip_forward на шлюзе. Должна быть единица =)

#58691

одна из них была

вообще с этим все работало, но перествало через некоторое время

elve написал:
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $NAT_IP -j MASQUERADE

а потом сделал эту, и еще убрал одно правило, и перестало все работать

elve написал:
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $REAL_IP
#58693

ДНС и не нужно поднимать, он рекрусировать должен на ДНС провайдера.
Если инет пропал, когда убрали правило, значит ошибка в правилах, ибо по умалчанию пропускаются все --state, если они явно не указаны.
То есть RELATED,ESTABLISHED, а так же NEW и INVALID.
Если указать только

ESTABLISHED
Все пакеты принадлежащие установленному соединению
RELATED
Пакеты, не принадлежащие установленному соединению, но связанные с ним.
Например - FTP в активном режиме использует разные соединения для передачи данных. Эти соединения связанны.

Тоесть и туда и обратно.
Я бы всётаки порекомендовал попробовать написать простое правило, без вложенных блоков, и уже к нему добавлять правила.
Меня например смущает что в блоке close_all() все правила сбрасываются на " по умаолчанию запрещено", а в блоке open_all(), по умолчанию всё включается.
Ведь ни кто не осудит вас, если вы сделаете например вот так:

text
#!/bin/bash
#
# Flash all default
/sbin/iptables -F
/sbin/iptables -X
#
# Setup policy DROP for all
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP
#
# loop=trusted.
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
#
# Reject invalid pakets
/sbin/iptables -A INPUT -m state --state INVALID -j DROP
/sbin/iptables -A FORWARD -m state --state INVALID -j DROP
#
# ESTABLISHED connection
/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Remote SSH control
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -s 192.168.1.4 -j ACCEPT
#
# WEBMIN control
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -s 192.168.1.4 -j ACCEPT
#
# Samba conection
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 137 -s 192.168.1.4 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 138 -s 192.168.1.4 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 139 -s 192.168.1.4 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 445 -s 192.168.1.4 -j ACCEPT
#
# Setup PING
# Allow me ping outside
/sbin/iptables -A INPUT -p icmp -m icmp -i eth0 --icmp-type echo-request -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -m icmp -o eth0 --icmp-type echo-request -j ACCEPT
#
# Setup to WEB access
/sbin/iptables -A OUTPUT -o eth0 -p tcp --sport 80 -s 192.168.1.2 -j ACCEPT

изменив адреса и порты на свои и добавив 1 правило FORWARD.
Кстати, а что там на счёт ping и nslookup c виндовой машины?

#58694

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

#58695

короче теперь вот такие правила
82 # forwarding
83 $IPTABLES -A FORWARD -o $LAN_IFACE -i $INET_IFACE -d $NAT_IP -m state --state RELATED,ESTABLISHED -j ACCEPT
84 $IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -s $NAT_IP -j ACCEPT
85
86 # masquerade
87 $IPTABLES -t nat -A POSTROUTING -s $NAT_IP -o $INET_IFACE -j SNAT --to-source $INET_IP

и теперь сразу ничего не работает

поправка, теперь все ок! (не знаю может из-за того что еще раз вкл\выкл. сетевое подключение в винде, а может из-за того что вырубил файрвол стандартный виндозный)

поправка, дело было не в виндозном файрволе

да и вообще как может быть дело в файрволе, когда я пишу что у меня после какого-то времени отрубалось, а не сразу

#58715

Тут надо было выяснять на месте =). Виндовый файрвол точно не при чем, тут я согласен. Ну раз все хорошо, то и не будем трогать ).

Тему можно пометить как решенную?

#58727

пока все ок
помечай)

возможно что просто сервер не мог обратать нормально маскарад,
а через SNAT пишут нагрузка поменьше

Войдите или зарегистрируйтесь, чтобы ответить.