URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 92846
[ Назад ]

Исходное сообщение
"FreeBSD 8.2  Kernel NAT + mpd5"

Отправлено Merlin_ua , 06-Янв-12 16:31 
Добрый день!
       Есть FreeBSD 8.2, сетевуха rl0 смотрит в локалку 192.168.1.0/24, ADSL модем - смотрит в интернет, висит модем на том же rl0, IP модема 192.168.1.252.
       Задача - поднять  mpd5 -> pppoe -> ADSL интернет и раздать на 192.168.1.0/24.
Интернет раздается через IPFW + Kernel NAT

С поднятием интернета все гуд. Проблема состоит в следующем. После поднятия соединения в интернет с помощью mpd:

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

ipfw nat 1 config ip x.x.x.x log same_ports unreg_only
ipfw add nat 1 all from 192.168.1.0/24 to any
ipfw add nat 1 all from any to x.x.x.x

все работает на УРА.

-если попытаться автоматизировать процесс и сделать это все в скрипте mpd-ip-up
/usr/local/etc/mpd5/mpd-ip-up:
1. #!/bin/sh
2. ipfw -q flush
3. ipfw nat 1 config ip $3 log same_ports unreg_only
4. ipfw add nat 1 all from 192.168.1.0/24 to any
5. ipfw add nat 1 all from any to $3

то возникает следующая ситуация: все строки отрабатываются, кроме 3-й. Соответсвенно ни о каком интернете речи быть не может. Если потом в консоле прописать:
ipfw nat 1 config ip x.x.x.x log same_ports unreg_only то нет появляется.

Вопрос следующий: почему не отрабатывает 3-я строка и как это исправить?



Содержание

Сообщения в этом обсуждении
"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено sherlock , 06-Янв-12 18:11 

> -если попытаться автоматизировать процесс и сделать это все в скрипте mpd-ip-up
> /usr/local/etc/mpd5/mpd-ip-up:
> 1. #!/bin/sh
> 2. ipfw -q flush
> 3. ipfw nat 1 config ip $3 log same_ports unreg_only
> 4. ipfw add nat 1 all from 192.168.1.0/24 to any
> 5. ipfw add nat 1 all from any to $3
> Вопрос следующий: почему не отрабатывает 3-я строка и как это исправить?

лень сейчас лезть в доки смотреть сколько параметров передает mpd в скрипт, если $3 последний параметр, то могу предположить, что в нем последним символом может быть "\n", т.е. перевод строки, тогда для третий строки это будет ошибкой, а в пятой все ок. Откусывайте.


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 06-Янв-12 19:49 
> лень сейчас лезть в доки смотреть сколько параметров передает mpd в скрипт,
> если $3 последний параметр, то могу предположить, что в нем последним
> символом может быть "\n", т.е. перевод строки, тогда для третий строки
> это будет ошибкой, а в пятой все ок. Откусывайте.

Параметров как минимум 4, откусывал - не помогает.



"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено YuriStep , 07-Янв-12 00:19 
1 - а что "говорит" ipfw show до и после выполнения mpd-ip-up ?
2 - что в логах ?

"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено михалыч , 07-Янв-12 11:27 
>[оверквотинг удален]
> 1. #!/bin/sh
> 2. ipfw -q flush
> 3. ipfw nat 1 config ip $3 log same_ports unreg_only
> 4. ipfw add nat 1 all from 192.168.1.0/24 to any
> 5. ipfw add nat 1 all from any to $3
> то возникает следующая ситуация: все строки отрабатываются, кроме 3-й. Соответсвенно ни
> о каком интернете речи быть не может. Если потом в консоле
> прописать:
> ipfw nat 1 config ip x.x.x.x log same_ports unreg_only то нет появляется.
> Вопрос следующий: почему не отрабатывает 3-я строка и как это исправить?

Все просто.
Строку 3 нужно пустить после строки 5.
И будет счастье. =)
Сначала объявляем нат, а потом кониг, однако.


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 07-Янв-12 12:07 
>>1 - а что "говорит" ipfw show до и после выполнения mpd-ip-up ?
>>2 - что в логах ?

1. - До - показывает дефолтное правило, после - добавляются правила 4,5 строки. Счетчики по правилу 4-й строки нулевые, если потом ручками сконфить нат - все гуд.
2. - в логах mpd ничего, что может навести на нужный путь, в логах ipfw - почемуто все сообщения от Kernel

>>Все просто.
>>Строку 3 нужно пустить после строки 5.
>>И будет счастье. =)
>>Сначала объявляем нат, а потом кониг, однако.

Не просто. Хотя такое и допустимо (сначала правила, потом конфитг ната), пофиг где ставить 3 строку.

Я выяснил следующее: параметром $3 в mpd является локальный IP присваеваемый провайдером. Так вот, этот IP имеет формат х.х.х.х/32. Для правила 5-й строки - это нормально, а вот для конфига НАТ - это неправильный IP адрес. Нужно как-то откинуть последние 3 символа, т.е. - /32. Думаю тогда все будет ок!


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено михалыч , 07-Янв-12 12:37 
>[оверквотинг удален]
>>>Строку 3 нужно пустить после строки 5.
>>>И будет счастье. =)
>>>Сначала объявляем нат, а потом кониг, однако.
> Не просто. Хотя такое и допустимо (сначала правила, потом конфитг ната), пофиг
> где ставить 3 строку.
> Я выяснил следующее: параметром $3 в mpd является локальный IP присваеваемый провайдером.
> Так вот, этот IP имеет формат х.х.х.х/32. Для правила 5-й строки
> - это нормально, а вот для конфига НАТ - это неправильный
> IP адрес. Нужно как-то откинуть последние 3 символа, т.е. - /32.
> Думаю тогда все будет ок!

А! Я дико извиняюсь, невнимательность моя :(
Да, у вас $3 (IP адрес) в 3-ей строке, у меня же (в моем конфиге) фигурирует $1 (интерфейс)
выходит, что я несколько поторопиляся с ответом.

Вот рабочий конфиг, только что скопипастил (у себя =))

#!/bin/sh
/sbin/ipfw -q add 60 nat 1 all from any to any out xmit $1
/sbin/ipfw -q add 61 nat 1 all from any to $3 in recv $1

/sbin/ipfw -q nat 1 config if $1 reset


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено михалыч , 07-Янв-12 12:37 
С IP не пробовал.

"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 07-Янв-12 12:48 
   Всем огромное спасибо за участие.
   Михалыч, можеш не извеняться. На этом форуме меня очень радует то, что людей отсюда не посылают куда-подальше, как это делается на на некоторых форумах.
   Я Kernel NAT настраиваю впервые. Раньше я делал это через демон natd, а вот друг попросил собрать небольшой сервер, дабы раздать инет по локалке, и вот решил попробывать Kernel NAT. Я даже не предполагал. что можно настроить не через IP а через интерфейс (ну какие примеры нагуглил). Но у меня получилось и через IP. В данном случае 3-я строка выглядит следующим образом:
1. #!/bin/sh
2. ipfw -q flush
3. ipfw nat 1 config ip ${3%/32} log same_ports unreg_only
4. ipfw add nat 1 all from 192.168.1.0/24 to any
5. ipfw add nat 1 all from any to $3

Еще раз: всем огромное спасибо за участие!


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 07-Янв-12 12:54 
Да, вот еще, а как просмотреть конфиги ната в ipfw?

"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено _sirius_ , 07-Янв-12 13:05 
man ipfw

ipfw nat 1 show config



"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено YuriStep , 07-Янв-12 15:09 
> 1. - До - показывает дефолтное правило, после - добавляются правила 4,5
> строки. Счетчики по правилу 4-й строки нулевые, если потом ручками сконфить
> нат - все гуд.
> 2. - в логах mpd ничего, что может навести на нужный путь,
> в логах ipfw - почемуто все сообщения от Kernel

... вот в этом самом месте нужно было "замереть" и подумать :)

> Хотя такое и допустимо (сначала правила, потом конфитг ната)

... абсолютно верно ...

> Я выяснил следующее: параметром $3 в mpd является локальный IP присваеваемый провайдером.

... вот в этом месте нужно было повторить процесс "замереть и подумать" - Вы пытаетесь скормить ipfw конфигурацию для ната, с настройкой на получаемый "в динамике" адрес... "не гут", совсем "не гут"... даже если это адрес, прибитый для Вас у провайдера гвоздями... Правильнее было-бы в данном случае - опереться в конфигурации на имя интерфейса - параметр $1 ... и получить конфигу типа:

/sbin/ipfw -q nat 2 config if $1 reset unreg_only same_ports redirect_port tcp 192.168.0.7:3389 3389 ....

/sbin/ipfw -q add 30021 nat 2 all from \{ 192.168.0.0/24 or 192.168.100.0/24 \} to any out xmit $1                                                                                        
/sbin/ipfw -q add 30022 nat 2 all from any to $3 in recv $1


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 07-Янв-12 23:39 
> ... вот в этом самом месте нужно было "замереть" и подумать :)

Да, Вы правы на все 100! Замирал и думал. А пока думал решил написать на форум, обратиться а помощью! Думаю в этом нет ничего дурного.


"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 07-Янв-12 23:46 
>[оверквотинг удален]
> получаемый "в динамике" адрес... "не гут", совсем "не гут"... даже если
> это адрес, прибитый для Вас у провайдера гвоздями... Правильнее было-бы в
> данном случае - опереться в конфигурации на имя интерфейса - параметр
> $1 ... и получить конфигу типа:
> /sbin/ipfw -q nat 2 config if $1 reset unreg_only same_ports redirect_port tcp
> 192.168.0.7:3389 3389 ....
> /sbin/ipfw -q add 30021 nat 2 all from \{ 192.168.0.0/24 or 192.168.100.0/24
> \} to any out xmit $1
> /sbin/ipfw -q add 30022 nat 2 all from any to $3 in
> recv $1

Про то, что мне не было известно о том, что можно опереться на интерфейс - я уже писал. В дальнейшем если прийдется еще понимать и PPPoE Server с помощью того же mpd то динамическим окажется и сам интерфейс. Но как бы там не было, я думаю, что все равно к чему привязывать: толи $1, или же $3. Единственное ято я упустил из внимания, так это формат $3 параметра. Для того что б его можно было скармливать данным способом, нужно отбросить 3 последних символа, т.е. /32



"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено YuriStep , 08-Янв-12 00:43 
> ... Для того что б его можно было скармливать данным способом,
> нужно отбросить 3 последних символа, т.е. /32

Странно, у меня при статическом адресе - ничего не отбрасывается - и kernel nat спокойно работает ... Есть подозрение, что у Вас просто к моменту обработки скрипта либо интерфейс не успевает получить ip-адрес, либо mpd оперирует данными из кэша ;) Ради интереса можно было-бы втиснуть в скрипт "эху" - поглядеть что там на самом деле в этот момент за значения, ну и естественно попробовать именно в таком синтаксисе вбить их с консоли ;)
А вообще - ИМХО - в связке mpd & ipwf - возьмите за правило - если у Вас интерфейс "динамика" - пусть даже с приколоченным гвоздями адресом - везде, где только возможно - опирайтесь на имя интерфейса, а не его адрес... IPFW штука умная, в большинстве случаев - сама замечательно "разбирает" :)



"FreeBSD 8.2  Kernel NAT + mpd5"
Отправлено Merlin_ua , 08-Янв-12 21:39 
>[оверквотинг удален]
> к моменту обработки скрипта либо интерфейс не успевает получить ip-адрес, либо
> mpd оперирует данными из кэша ;) Ради интереса можно было-бы втиснуть
> в скрипт "эху" - поглядеть что там на самом деле в
> этот момент за значения, ну и естественно попробовать именно в таком
> синтаксисе вбить их с консоли ;)
> А вообще - ИМХО - в связке mpd & ipwf - возьмите
> за правило - если у Вас интерфейс "динамика" - пусть даже
> с приколоченным гвоздями адресом - везде, где только возможно - опирайтесь
> на имя интерфейса, а не его адрес... IPFW штука умная, в
> большинстве случаев - сама замечательно "разбирает" :)

echo $3 > file - выдает адрес х.х.х.х/32. Если вбить онное из консоли, т.е
ipfw nat 1 config ip x.x.x.x/32  - пишет bad ip adress, если же вбивать
ipfw nat 1 config ip x.x.x.x - съедает без проблем. Я в скрипте отбросил /32 и все заработало. Скрип не может стартануть до получения IP адреса, он то в доках обычно и фиурирует как ip-up, и стартует когда готовы все четыре параметра. А какой у Вас mpd? Я как-то одному знакомому настраивал на mpd4, так насколько я помню (но могу и ошибаться, пару лет назад это было) там не было такой ситуации. mpd4 и mpd5 довольно таки сильно отличаются.

   А за совет - спасибо. Обязательно воспользуюсь. Но хочу сказать, что однажды у меня была ситуация, где поднималось три ната, два из которых в одну сеть, плюс спутник и наземный канал. Поднималось это еще на FreeBSD 4.0 + pppd + natd там такие извраты приходилось применять. Но тогда еще сильно сказывалось отсутствие какого-либо опыта в данной теме и срочность выполнения поставленной задачи. Мне тогда пророчествовали, что данное вообще не реально связать, но слава Богу получилось.