Fedora linux forum

Форум русской поддержки ОС Fedora linux

 

#1 2010-03-15 17:21:14

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Проблема с шлюзом

Всем привет.

Обрисовываю проблему:
Стоит федора(шлюз) с несколькими активными интерфейсами: eth0 смотрит в локалку 192.169.0.0/24, ppp0 — интернет. Фаерволл выключен, selinux тоже.

net.ipv4.ip_forward = 1

У клиентов в локалке указан шлюз на эту тачку. Но клиенты дальше шлюза ничего не видят. Пинг от клиентов до шлюза идет на обои интефейсы. Однако в инет клиенты совсем не могут лезть.

В чем может быть проблема? Вообще ничего не понимаю.

Отредактированно __qwe__ (2010-03-15 17:23:38)

Неактивен

 

#2 2010-03-15 19:51:27

dik-m
Member
Зарегистрирован: 2009-10-28
Сообщений: 85

Re: Проблема с шлюзом

надо включить NAT (Network Address Translate) исходящих пакетов на интерфейс ppp0, т.е. разрешить перенаправление пакетов с/на 192.168.0.0/24

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE

(сокращенно -o) Определяет интерфейс, с которого уйдет пакет.

и желательно на клиентах принудительно указать dns прова, но это не всегда нужно, иногда хватает адреса шлюза

Основы использования iptables далее будет продолжение, но именно по твоей теме

Спойлер:


Основы использования iptables

Принцип работы

Брандмауэр (файрвол) предназначен для фильтрации и обработки пакетов, проходящих через сеть. Когда пакет прибывает, брандмауэр анализирует заголовки пакета и принимает решение, “выбросить” пакет (DROP), принять пакет (ACCEPT, пакет может пройти дальше) или сделать с ним что-то еще более сложное.

В Linux брандмауэр является модулем ядра, его неотъемлемой частью. С его помощью мы можем делать с пакетами множество хитроумных вещей, но основной принцип манипуляции трафиком сохраняется: просматриваются заголовки пакетов и решается их дальнейшая судьба. Интерфейсом для модификации правил, по которым брандмауэр обрабатывает пакеты, служит iptables.

Итак, пребывающий пакет проходит по цепочке правил. Каждое правило содержит условие и цель (действие). Если пакет удовлетворяет условию то он передается на цель, в противном случае к пакету применяется следующее правило в цепочке. Если пакет не удовлетворил ни одному из условий в цепочке, то к нему применяется действие по умолчанию.

Например, к нам пришел пакет от адреса 192.168.164.84 для 128.3.4.5, применим цепочку из трех правил к этому пакету:номер правила условие действие результат
1 пакет от адреса 127.2.4.5 пропустить (ACCEPT) переход к следующему правилу
2 пакет для адреса 234.2.*.5 пропустить (ACCEPT) переход к следующему правилу
3 пакет от адреса 192.168.* выбросить пакет (DROP) пакет выброшен

Как видно, пакет не удовлетворил первым двум условиям цепочки, зато удовлетворил третьему правилу, которое заставило брандмауэр выбросить этот пакет.

Цепочки собраны в три основные таблицы (при желании можно добавить свои):
filter — Таблица, используемая по-умолчанию,
nat — Эта таблица используется, когда встречается пакет, устанавливающий новое соединение.
mangle — Эта таблица используется для специальных изменений пакетов.

Основными цепочками являются следующие:
FORWARD: для проходящих (пересылаемых) пакетов
INPUT: для входящих/получаемых пакетов
OUTPUT: для исходящих/отправляемых пакетов

Действие может быть именем цепочки, определенной пользователем, или одной из специальных целей: ACCEPT, DROP, QUEUE, RETURN или MASQUERADE.

ACCEPT означает принять пакет. DROP означет проигнорировать (выбросить) пакет. MASQUERADE означает скрыть (маскировать) IP. (ниже будет рассмотрено подробно)

Схематично обработку пакета можно изобразить следующим образом:
PACKET IN --->---PREROUTING---[ маршрутизация ]--->----FORWARD---->---POSTROUTING--->--- PACKET OUT
- mangle | — mangle — mangle
- nat (dst) | — filter — nat (src)
| |
| |
INPUT OUTPUT
- mangle — mangle
- filter — nat (dst)
| — filter
| |
`---->----[ приложение ]---->----'

Входящий пакет начинает обрабатываться брандмауэром с цепочки PREROUTING в таблице mangle. Затем он обрабатывается правилами цепочки PREROUTING таблицы nat. На этом этапе проверяется, не требуется ли модификация назначения пакета (DNAT). Важно сменить назначение сейчас, потому что маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING. После этого он будет отправлен на цепочку INPUT (если целью пакета является этот компьютер) или FORWARD (если его целью является другой компьютер в сети).

Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUARADE (подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть

Если назначением пакета является сам компьютер с брандмауэром, то, после маршрутизации, он обрабатывается правилами цепочек INPUT таблиц mangle и filter. В случае прохождения цепочек пакет передается приложению.

Когда приложение, на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблицы filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется-ли использовать DNAT (модификация назначения), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING которая может использовать SNAT и QoS. В случае успешного прохождения POSTROUTING пакет выходит в сеть.

Для добавления правила в цепочку используется ключ -A
iptables -A INPUT правило

добавит правило в цепочку INPUT таблицы filter (по умолчанию). Для указания таблицы, в цепочку которой следует добавить правило, используйте ключ -t:
iptables -t nat -A INPUT правило

добавит правило в цепочку INPUT таблицы nat.

Цель по умолчанию задается с помощью ключа -P:
iptables -P INPUT DROP
Условия для отбора пакетов

Теперь мы знаем как пакеты проходят сквозь различные таблицы и цепочки iptables. Пришло время разъяснить принципы, по которым строятся условия накладываемые на пакеты:
Немного о протоколе TCP/IP

TCP/IP является протоколом, в котором соединение устанавливается в 3 фазы. Если компьютер А пытается установить соединение с компьютером Б они обмениваются специальными TCP пакетами.
A: SYN пакет (првыед Б!)
Б: ACK пакет, SYN пакет (Ога!, как оно?)
A: ACK пакет (дык, ничего)

После чего соединение считается установленным (ESTABLISHED).

iptables различает эти состояния как NEW и ESTABLISHED.
Опции отбора пакетовопция описание пример
—protocol (сокращено -p) Определяет протокол. Опции tcp, udp, icmp, или любой другой протокол определенный в /etc/protocols iptables -A INPUT —protocol tcp
—source IP адрес источника пакетаs. Может быть определен несколькими путями.
Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0 iptables -A INPUT —source 10.10.10.3
—destination IP адрес назначения пакета. Может быть определен несколькими путями — смотри —source iptables -A INPUT —destination 192.168.1.0/24
—source-port Порт источник, возможно только для протоколов —protocol tcp, или —protocol udp iptables -A INPUT —protocol tcp —source-port 25
—destination-port Порт назначения, возможно только для протоколов —protocol tcp, или —protocol udp iptables -A INPUT —protocol udp —destination-port 67
—state Состояние соединения. Доступно, если модуль ‘state’ загружен с помощью ‘-m state’. Доступные опции:
NEW
Все пакеты устанавливающие новое соединение
ESTABLISHED
Все пакеты принадлежащие установленному соединению
RELATED
Пакеты, не принадлежащие установленному соединению, но связанные с ним.
Например — FTP в активном режиме использует разные соединения для передачи данных. Эти соединения связанны.
INVALID
Пакеты, которые не могут быть по тем или иным причинам идентифицированны. Например ICMP ошибки не принадлежащие существующим соединениям iptables -A INPUT -m state —state NEW,ESTABLISHED
—in-interface
(сокращенно -i) Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами iptables -t nat -A PREROUTING —in-interface eth0
—out-interface
(сокращенно -o) Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами iptables -t nat -A POSTROUTING —in-interface eth1
—tcp-flags Определяет TCP флаги пакета. Содержит 2 параметра: Список флагов которые следует проверить и список флагов которые должны быть установлены

—syn Сокращение для ‘—tcp-flags SYN,RST,ACK SYN’. Поскольку проверяет TCP флаги, используется с —protocol tcp.
В примере показан фильтр для пакетов с флагом NEW, но без флага SYN. Обычно такие пакеты должны быть выброшены (DROP). iptables -A INPUT —protocol tcp ! —syn -m state —state NEW

Определение цели

Чтобы определить действие, которое брандмауэр выполнит, если пакет в одной из цепочек удовлетворяет условию, iptables использует цели, устанавливаемые с помощью ключа —jump (или просто -j).

Целью может быть любая другая цепочка, куда будет передан пакет, или одно из следующих действий:

ACCEPT Пропускает удовлетворяющий условию пакет (пакет покидает данную цепочку и передается дальше).

DROP Выбрасывает удовлетворяющий условию пакет (молча, как будто он и не приходил).

REJECT Отклоняет пакет, сообщая об этом передавшему. Имеет дополнительный параметр ‘—reject-with’ определяющий сообщение которое будет передано отправившему пакет, это может быть: icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable (по умолчанию), icmp-proto-unreachable, icmp-net-prohibitedor и icmp-host-prohibited. Сообщение (по умолчанию “порт недоступен”) возвращется отправившему пакет компьютеру..

LOG Заносит в журнал информацию о пакете. Полезно в комбинации с DROP и REJECT для отладки.

RETURN Возвращает пакет в ту цепочку, из которой он прибыл.

Это продолжение предыдущего, но именно по твоей теме

Спойлер:

SNAT Применяет source NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы nat.

DNAT Применяет destination NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочке POSTROUTING таблицы nat.

MASQUERADE Может применяться только в цепочке POSTROUTING таблицы nat. Используется при наличии соединения с динамическим IP. Похож на SNAT, однако имеет свойство забывать про все активные соединения при потере интерфейса. Это полезно при наличии соединения, на котором время от времени меняется IP-адрес, но при наличии постоянного IP это только доставит неудобства. В том числе поэтому рекомендуется для статических IP использовать SNAT.
Примеры

Настроим простейший шлюз для раздачи интернета для дома или малого офиса (SOHO). Допустим, что внутрь сети смотрит интерфейс eth1 с ip адресом 192.168.1.1, а в интернет интерфейс eth0:
eth1 eth0
Внутрнняя сеть --------------------[ маршрутизатор ]---------------------- Internet
192.168.1.0/24 192.168.1.1 внешний ip-адрес 0.0.0.0/0

Разрешим пропуск трафика через шлюз (в противном случае трафик не проходит цепочку FORWARDING):
sysctl -w net.ipv4.ip_forward="1"

Добавим правило, для маскировки ip в цепочку POSTROUTING таблицы nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Теперь клиенты внутренней сети могут получить возможность доступа в интернет установив в качестве шлюза адрес 192.168.1.1 .

Теперь попробуем нечто более интересное: запретим возможность установки новых соединений с маршрутизатором из интернета, а также форвардинг из сетей отличных от 192.168.1.0/24 .

Установим политики по умолчанию для цепочек в DROP, запретив все соединения кроме тех, которые будут разрешены:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

Разрешим входящие соединения на маршрутизатор с внутренней сети (для управления)
iptables -A INPUT -i eth1 --source 192.168.1.0/24 --match state --state NEW,ESTABLISHED -j ACCEPT

Разрешим маршрутизатору отвечать компьютерам во внутренней сети:
iptables -A OUTPUT -o eth1 --destination 192.168.1.0/24 --match state --state NEW,ESTABLISHED -j ACCEPT

Разрешим перенаправление пакетов из внутренней сети во внешнюю для установки соединений и установленных соединений:
iptables -A FORWARD -i eth1 --source 192.168.1.0/24 --destination 0.0.0.0/0 --match state --state NEW,ESTABLISHED -j ACCEPT

Разрешим перенаправление пакетов из интернета во внутреннюю сеть только для установленных соединений:
iptables -A FORWARD -i eth0 --destination 192.168.1.0/24 --match state --state ESTABLISHED -j ACCEPT
Итого:

Маршрутизатор разрешает клиентам внутренней сети устанавливать соединение с узлами в интернет.

Маршрутизатор имеет возможность удаленного управления из внутренней сети и только из внутренней сети.

Маршрутизатор блокирует все попытки установить новое соединение из сети интернет.

Маршрутизатор не принимает пакеты из сети интернет сам, только перенаправляет пакеты во внутреннюю сеть и только принадлежащие установленным соединениям.

Отредактированно dik-m (2010-03-15 20:05:18)

Неактивен

 

#3 2010-03-16 01:06:55

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

dik-m, я временоо пока выключил iptables. Я не могу понять одного — почему нет маршрутизаии пакетов, когда включена net.ipv4.ip_forward. Он без правил фаера дожен уже работать, по логике, как нормальный шлюз.

Впринципе. вот тут уже описывалась эта проблема: http://fedoralinux.ru/forum/viewtopic.php?id=739

Неактивен

 

#4 2010-03-16 07:19:03

dik-m
Member
Зарегистрирован: 2009-10-28
Сообщений: 85

Re: Проблема с шлюзом

как я понял у тебя схема такая
через eht1 поднимается ррр0 который раздаёт интернет на eth0
значит нужно проверить приходят ли на интерфейс сетевой карты eth0 пакеты из внутренней подсети например tcpdump'ом

Неактивен

 

#5 2010-03-16 09:08:39

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

Все, проблему решил.
Как обычно — не знание простых вещей, заставляет натыкатся на пустые хлопоты))))
НАТ нужно поднимать это полюбому (в моем случае). Собсно это и есть реешние проблемы.

В случае если обьединить две разные локалки — то ip_forward было бы достаточно включить.

Неактивен

 

#6 2010-03-16 10:06:41

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

Кстати, dik-m, не знаешь ли...
У меня стоит RFRemix 12 , на ней пинг какой-то тормознутый. Запускаешь пинг — секунду или две думает  потом пингует. Соответвенно это накладывается на все сетевые функции: в брауезере вбиваешь сайт — пару секунд думает  после начинает открыватся.. и т.п.

Есть другая тачка с 11 федорой (простой) — все прерасно.
Может быть из-за того что дистр Ремиксовый?

Неактивен

 

#7 2010-03-16 10:09:27

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

Такое наблюдается на двух тачках (т.е. это не случайность).

Неактивен

 

#8 2010-03-16 21:14:21

Mak_s
Member
Откуда: Чернигов
Зарегистрирован: 2009-12-06
Сообщений: 358

Re: Проблема с шлюзом

Похоже, что просто разные DNS сервера используются, поэтому RFR медленнее резолвит имена — отсюда задержки. Сравни /etc/resolv.conf на этих машинах.


Круче самовара только титан

Неактивен

 

#9 2010-03-17 10:08:49

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

Нее, дело не в резолвинге. Такая "медленность" наблюдается и без него, т.е. пинг по ip допустим яндекса.

Отредактированно __qwe__ (2010-03-17 10:09:25)

Неактивен

 

#10 2010-03-17 10:43:25

Mak_s
Member
Откуда: Чернигов
Зарегистрирован: 2009-12-06
Сообщений: 358

Re: Проблема с шлюзом

Как насчет ping -n ? (по-умолчанию пинг все равно пытается разрезолвить имена, даже если пингуется IP)


Круче самовара только титан

Неактивен

 

#11 2010-03-18 18:57:04

__qwe__
Member
Зарегистрирован: 2010-02-28
Сообщений: 16

Re: Проблема с шлюзом

ping IP_ADDRES

- пинг без резолвинга.

Неактивен

 

#12 2010-03-18 19:25:57

Mak_s
Member
Откуда: Чернигов
Зарегистрирован: 2009-12-06
Сообщений: 358

Re: Проблема с шлюзом

Принципиально не будешь пробовать ping -n IP_ADDRESS? Ну что ж, мне это нужно гораздо меньше.

P.S. Информация к размышлению http://aplawrence.com/SCOFAQ/FAQ_scotec4slow_ping.html

Even if you supply ping with an IP address, it still does DNS lookups


Круче самовара только титан

Неактивен