LINUX.ORG.RU
решено ФорумAdmin

Общий доступ в интернет.


0

0

Вопрос не в том как это сделать, вопрос в том как это работает ?

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

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j SNAT $INET_IP

по сути правило такое: если из сети 192.168.1.0 отправлен пакет в интернет через интерфейс ppp0 то преобразуй адрес отправителя на свой внешний.

Но я не могу понять,как он понимает что пакет именно был отправлен на ppp0?

Ведь iptables явно это не делает. Он просто смотрит если пакет подходит под условие то делает заданное действие в нашем случае SNAT.

А вот почему из сети 192.168.1.0 приходят пакеты на интерфейс ppp0 я не врубаюсь.



Последнее исправление: demsi (всего исправлений: 5)

я тоже иногда случайно нажимаю интер, точнее хочу пернести строку. А он новую тему создает.

anonymous
()

-j SNAT

преобразуй адрес отправителя на свой внешний.

/0

ЗЫ ТС не маскарад ли хотел?

erfea ★★★★★
()
Ответ на: комментарий от erfea

Да разницы то нет, что MASQUERADE что SNAT. По мне так SNAT удобней, по сути два этих действия делают почти одно и тоже.

demsi
() автор топика

смотри route и всё станет ясно.

beastie ★★★★★
()

Ведь iptables явно это не делает.

Он вообще мало что делает, а точнее только и умеет что диктовать правила для netfilter (это в ведре такая хрень).

А вот почему из сети 192.168.1.0 приходят пакеты на интерфейс ppp0 я не врубаюсь.

Может потому что у тебя форвардинг разрешён и имеется какой-то роутинг?

erfea ★★★★★
()

Но я не могу понять,как он понимает что пакет именно был отправлен на ppp0?

Решается роутингом, iptables не имеет к этому отношения. См. iproute2.

at ★★
()

Меня другой вопрос всегда мучал - как он понимает, что пришёл ответ именно на ТОТ пакет, который был отправлен с 192.168.1.x, а маны все лень посмотреть...

Suntechnic ★★★★★
()
Ответ на: комментарий от at

вот, да точно. Вот теперь вопрос по route. допустим есть две сетевых карты.

eth0 - сеть 10.48.0.0/15 с доступом в интернет через интерфейс ppp0 ( всмысле с подключением по ppptp) Пусть адрес шлюза из сети 10.48.0.0 будет 10.52.192.1 - этот шлюз выдает адрес из сети 10.48.0.0/15 и также есть шлюз 78.29.3.3 который выдает внешний белый ip адрес на интерфейс ppp0

Ну DNS пропустим

eth1 - сеть 192.168.0.0/24

вот Предположим машина 192.168.0.15 отправляет icmp пакет на google.ru

как должна выглядить таблица чтобы пакет из 192.168.0.15 достиг интерфейса ppp0 ? Правильно ли я сделал ? Сеть Шлюз Маска Интерфейс

10.48.0.0 10.52.192.1 255.248.0.0 eth0

0.0.0.0 78.29.3.3 0.0.0.0 ppp0

192.168.0.0 0.0.0.0 255.255.255.0 eth1

demsi
() автор топика
Ответ на: комментарий от Suntechnic

Меня другой вопрос всегда мучал - как он понимает, что пришёл ответ именно на ТОТ пакет, который был отправлен с 192.168.1.x

Детально вопрос не изучал, но точно знаю что у него есть спецом таблица для ната, куда он скидывает инфу. Ну а ответ очевидно по заголовкам как-то отличается...

erfea ★★★★★
()
Ответ на: комментарий от Suntechnic

Меня другой вопрос всегда мучал - как он понимает, что пришёл ответ именно на ТОТ пакет, который был отправлен с 192.168.1.x, а маны все лень посмотреть...

Вряд ли вы такое найдете в man iptables Это делается очень просто:

Адрес 192.168.0.2 отправляет syn пакет на google.ru по порту 80. 192.168.0.2 Сидит за натом у которого адреса: 192.168.0.1 и 95.168.43.78. Получается Исходный пакет 192.168.0.2:48765 на google.ru:80. Нат смотрит порт переделывает его на уникальный напирмер 5555. И меняет ип адрес на свой внешний. В итоге пакет получился: 95.168.43.78:5555 google.ru:80. Затем google.ru отвечает таким пакетом: google.ru:80 95.168.43.78:5555. Нат смотрит на уникальный номер 5555 по которому и определяет Ip отправителя. В итоге меняет пакет на такой google.ru:80 192.168.0.2:48765. Вот так вроде.

demsi
() автор топика
Ответ на: комментарий от demsi

Честно говоря ничего не понял из описания

eth0 - сеть 10.48.0.0/15 с доступом в интернет через интерфейс ppp0 ( всмысле с подключением по ppptp) Пусть адрес шлюза из сети 10.48.0.0 будет 10.52.192.1 - этот шлюз выдает адрес из сети 10.48.0.0/15 и также есть шлюз 78.29.3.3 который выдает внешний белый ip адрес на интерфейс ppp0

т.е. (насколько понял) eth0 получает адрес по dhcp, после этого поднимает ppp0 для доступа в нет. Тогда 10.52.192.1 не может быть адресом шлюза в сети 10.48.0.0/15, либо не правильно указана маска.

eth1 - сеть 192.168.0.0/24 — ваша локалка, а 192.168.0.15 — хост в локалке, которому требуется доступ в 10.48.0.0/15 (насколько понял домовая сеть прова) и в нет?

Сеть        Шлюз         Маска            Интерфейс
10.48.0.0   10.52.192.1  255.248.0.0      eth0 // Используется маска /13
// В эту сеть шлюз не нужен, она непосредственно подсоединена к eth0
0.0.0.0     78.29.3.3    0.0.0.0          ppp0 // Доступ в нет, вроде все правильно
192.168.0.0 0.0.0.0      255.255.255.0    eth1 // Локалка
Я все правильно понял?

at ★★
()
Ответ на: комментарий от Suntechnic

Нат запоминает ip/port источника (как правило хост в локалке) и назначения (хост в нете). Когда из нета приходит пакет проверяется эта таблица, если находится соответствие пакет отправляется в локалку. См. содержимое /proc/net/ip_conntrack

at ★★
()
Ответ на: комментарий от at

Честно говоря ничего не понял из описания

Так я и правда неверно объяснил.

10.52.192.1 шлюз сети 10.52.192.0/18.

Получается данный шлюз выдает мне адрес из выше указанной сети.

Но я запутался , так как в локалке провайдера есть сеть 10.48.0.0/12.(10.48.0.0/15 это я описался) По сути которая поглащает сеть 10.52.192.0/18. Значит получается есть еще шлюзы которые выдают адреса из подсетей сети 10.48.0.0/12 ? Или я не правильно думаю ?

eth1 - сеть 192.168.0.0/24 — ваша локалка, а 192.168.0.15 — хост в локалке, которому требуется доступ в 10.48.0.0/15 (насколько понял домовая сеть прова) и в нет?

Да. ну только сеть 10.48.0.0/12.

Теперь по таблице вопросы:

Сеть        Шлюз         Маска            Интерфейс
10.48.0.0   10.52.192.1   255.240.0.0      eth0 //  Получается пакеты которые будут идти на 10.48.0.0/12 направятся в шлюз 10.52.192.1
0.0.0.0     10.100.222.9  0.0.0.0          ppp0 // Шлюз другой, только. Ниже покажу
192.168.0.0 0.0.0.0       255.255.255.0    eth1 // Локалка

Шлюз Другой так как ifconfig выдал вот это:

ppp0      Link encap:Point-to-Point Protocol
          inet addr:X.X.X.X  P-t-P:10.100.222.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING MULTICAST  MTU:1400  Metric:1
          RX packets:14378 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7043 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:1312745 (1.2 Mb)  TX bytes:1088068 (1.0 Mb)
То есть, адрес он получает связываясь напрямую с хостом 10.100.222.9.

78.29.3.3 я указываю при подключении ppptp. Но ifconfig выдает 10.100.222.9. И мне кажется что 78.29.3.3 это одна машина 10.100.222.9 , только один адрес внешний а другой локальный. Или я опять что то упустил ?

И наверное для адреса 10.100.222.9 тоже надо указывать маршруты. Чтобы через шлюз 10.52.192.1 шли ?

И последний вопрос, насчет таблицы маршрутизации:

как все таки iptables узнает что пакет пришел на ppp0 ?

Получается что если идет пакет из сети 192.168.0.0/24 на ип адрес например 10.48.52.53, то первым делом система смотрит таблицу маршрутизации, и находит запись

Сеть        Шлюз         Маска                Интерфейс
10.48.0.0   10.52.192.1   255.240.0.0          eth0
И отправляет пакет на 10.52.192.1. То есть система смотрит на ип адрес назначения в пакете, и с помощью таблицы определяет куда ему идти дальше ?

И второй вопрос. Что за значение 0.0.0.0, можно ли в этой записи:

Сеть             Шлюз         Маска                Интерфейс
192.168.0.0    0.0.0.0       255.255.255.0         eth1 // Локалка
Вместо 0.0.0.0 написать адрес своего компа, если он статический ? Будет тоже самое ? А если комп за роутером, то естественно надо указывать ип роутера ?

demsi
() автор топика
Ответ на: комментарий от demsi

Но я запутался , так как в локалке провайдера есть сеть 10.48.0.0/12.(10.48.0.0/15 это я описался) По сути которая поглащает сеть 10.52.192.0/18. Значит получается есть еще шлюзы которые выдают адреса из подсетей сети 10.48.0.0/12 ? Или я не правильно думаю ?

Все верно, пров обычно разбивает клиентскую сеть на подсети. При выборе маршрута действует правило наименьшей сети. То есть маршрут, указывающий на более «узкую» сеть считается более приоритетным.

Шлюз Другой так как ifconfig выдал вот это:

Обычное соединение точка-точка. ip-шники могут быть в разных сетях.

78.29.3.3 я указываю при подключении ppptp. Но ifconfig выдает 10.100.222.9. И мне кажется что 78.29.3.3 это одна машина 10.100.222.9

Да. Скорей всего это BRAS прова.

И наверное для адреса 10.100.222.9 тоже надо указывать маршруты. Чтобы через шлюз 10.52.192.1 шли ?

Нужно указать маршрут до 78.29.3.3. Адрес 10.100.222.9 может меняться.

как все таки iptables узнает что пакет пришел на ppp0 ?

Интерфейс, с какого должен уходить пакет определяет iproute, после этого iptables применяет к пакету необходимые правила. То есть например.

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.52.192.10 // Пакетам, выходящим с интерфейса eth1 заменить адрес источника на 10.52.192.10 (это адрес eth1)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE // Динамический адрес, поэтому маскарадинг
. Обратите внимание на цепочку POSTROUTING таблицы nat. То есть правило применяется после того, как решение о маршрутизации принято.

Что за значение 0.0.0.0

0.0.0.0 шлюз не используется, пакеты в сеть 192.168.0.0/24 отправляются напрямую, без использования шлюза.

Вместо 0.0.0.0 написать адрес своего компа, если он статический ?

Нет.

at ★★
()
Ответ на: комментарий от Suntechnic

Ну на сколько я помню, да. Но это конечно в общих чертах.
Помню я это прочитал вот здесь: «Стивенс У.Р. UNIX. Разработка сетевых приложений »

demsi
() автор топика
Ответ на: комментарий от at

Интерфейс, с какого должен уходить пакет определяет iproute

То есть я понял правильно.
Когда из сети 192.168.0.0/24 идет пакет на сеть 10.48.0.0/12, iproute на основе таблицы маршрутизации определяет с какого интерфейса пойдет пакет?
Просто я хочу знать, что решение об отправлении пакетов, принимается только с помощью таблицы маршрутизации.

Вот тогда еще один вопрос (: (Наверное я вас уже достал)

Допустим я связал две машины с помощью VPN, средствами openvpn к примеру.
Пусть у машины сеть которой я описал выше, адрес будет 192.168.2.1 а у удаленной машины 192.168.2.2
И вот я хочу чтобы с машины 192.168.2.2 можно было бы отправить пакет на сеть 10.48.0.0/12
Я сделал так:
На машине 192.168.2.2 прописал такой маршрут

Cеть           Шлюз             Маска                Интерфейс
10.48.0.0   192.168.2.1   255.240.0.0             tap1
на машине 192.168.2.1
Cеть           Шлюз             Маска                Интерфейс
192.168.2.0  0.0.0.0   255.255.255.0            tap1
также добавил правило(на 192.168.2.1) :
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 10.48.0.0/12 -o eth0 -j MASQUERADE 
Должен ли дойти пакет, или нужно еще что то сделать ?

demsi
() автор топика
Ответ на: комментарий от demsi

Просто я хочу знать, что решение об отправлении пакетов, принимается только с помощью таблицы маршрутизации.

Существовал патч, добавляющий поддержку роутов в iptables, сейчас он благополучно помер, но иногда его можно встретить http://www.plouf.fr.eu.org/bazar/netfilter/pom/archive/pom-ng/.

iptables-ом можно управлять роутингом, например маркируя пакеты.

Я сделал так:

Не совсем верно, роут должен автоматически добавляться при поднятии тунеля и убираться при его закрытии. Поэтому они прописываются в конфиге openvpn/ См. например http://openvpn.net/index.php/open-source/documentation/howto.html

at ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.