FreeBSD - IPFW NAT проброс порта на Web server

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-21 23:39:14

Добрый вечер.

Сражу скажу что я не являюсь системным администратором, и все что я делаю исключительно из любопытства и ради саморазвития, поэтому многие вещи я не знаю, а некоторые знаю но не понимаю :)

В общем имеем:
1. Компьютер с FreeBSD (9.0) служащий как роутер. ipfw + nat. (Версия 9.0 получилась как то случайно :) перед сборкой ядра, для нужд ipfw, обновил исходники и в итоге получилась версия 9.0)
2. Компьютер с FreeBSD (8.1), в общем он является веб сервером, и вопросов к его работе нет.
3. Несколько компов под Виндой, для повседневного использования.

Все это добро соединено в сеть, соответственно роутер торчит между мной и провайдером, все остальное соединено в сеть через хаб.

Теперь перейду к проблеме.
Вкратце звучит так: "Не получается пробросить 80 порт на веб сервер".
Теперь к технической информации:

Ядро собрано с опциями:

Код: Выделить всё

options         IPFIREWALL 
options         IPFIREWALL_VERBOSE 
options         IPFIREWALL_VERBOSE_LIMIT=1000 
options         IPFIREWALL_NAT 
options         LIBALIAS 
options         ROUTETABLES=2 
options         DUMMYNET 
options         HZ="1000"
/etc/rc.conf:

Код: Выделить всё

# LAN 
ifconfig_rl0="192.168.0.254" 
# WAN 
ifconfig_fxp0="DHCP ether 0x-1x-6x-3x-0x-bx"  
gateway_enable="YES" 
firewall_enable="YES" 
firewall_script="/usr/local/etc/rc.firewall"

/etc/sysctl.conf:

Код: Выделить всё

net.inet.ip.fw.one_pass=1
/usr/local/etc/rc.firewall:

Код: Выделить всё

#!/bin/sh  
fwcmd="ipfw -q"  
wan="fxp0" 
lan="rl0" 
lann="192.168.0.0/24" # LAN network  
mina="192.168.0.10" # WEB server 
big="192.168.0.101" # station1 
  
setup_loopback () {         
  ${fwcmd} add 002 pass all from any to any via lo0         
  ${fwcmd} add 003 deny all from any to 127.0.0.0/8         
  ${fwcmd} add 004 deny ip from 127.0.0.0/8 to any 
}  

${fwcmd} -f flush  

setup_loopback  

${fwcmd} add 100 allow all from any to any via ${lan}  

${fwcmd} nat 1 config if ${wan} deny_in same_ports redirect_port tcp ${mina}:80 80  redirect_port tcp ${big}:33028 33028 
${fwcmd} add 1000 nat 1 ip from any to any via ${wan}
  
${fwcmd} add 60000 deny log all from any to any
redirect_port tcp ${big}:33028 33028 это проброс порта дя mTorrenta на стационарную машину.

При таком конфиге, торрент качает нормально, а вот извне зайти на веб сервер не получается ><

Вся загвоздка заключается в том что, проброс порта для mTorrent`a работает, а для Web Server`a нет.
Скажите, может я все таки что то не так делаю?
Почему же для торрента порт пробрасывается а для Веб сервера нет ><
Последний раз редактировалось vadim64 2010-10-22 7:46:00, всего редактировалось 1 раз.
Причина: [quote][/quote]!=[code][/code]

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение hizel » 2010-10-21 23:52:22

use tcpdump, Luke
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 0:10:36

Хорошо помогите разобраться :)

fxp0 внешний интерфейс.
rl0 внутренний.
94.19.64.217 - мой ип.

пишем:
tcpdump -i fxp0 tcp port 80

И в браузере набираем http://94.19.64.217
Смотрим в консоль.

Код: Выделить всё

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on fxp0, link-type EN10MB (Ethernet), capture size 96 bytes
Это наталкивает на мысль что запрос изнутри сети даже не дошёл до внешнего интерфейса fxp0.

Пробуем посмотреть внутренний интерфейс:

Код: Выделить всё

tcpdump -i rl0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes
01:08:10.943750 IP 192.168.0.101.4865 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 1938192761, win 65535, options [mss 1460,nop,nop,sackOK], length 0
01:08:10.943804 IP 94.19.64.217.pool.sknt.ru.http > 192.168.0.101.4865: Flags [R.], seq 0, ack 1938192762, win 0, length 0
01:08:11.381866 IP 192.168.0.101.4865 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 1938192761, win 65535, options [mss 1460,nop,nop,sackOK], length 0
01:08:11.381915 IP 94.19.64.217.pool.sknt.ru.http > 192.168.0.101.4865: Flags [R.], seq 0, ack 1, win 0, length 0
01:08:11.884345 IP 192.168.0.101.4865 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 1938192761, win 65535, options [mss 1460,nop,nop,sackOK], length 0
01:08:11.884391 IP 94.19.64.217.pool.sknt.ru.http > 192.168.0.101.4865: Flags [R.], seq 0, ack 1, win 0, length 0
И тут я совсем ничего не понимаю... пакет попрыгал туда сюда, а куда нужно так и не попал :) разъясните пожалуйста )
Последний раз редактировалось vadim64 2010-10-22 7:47:51, всего редактировалось 1 раз.
Причина: [quote][/quote]!=[code][/code]

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 0:21:16

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

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение hizel » 2010-10-22 8:17:01

еще один nat на внутренний интерфейс или не мучатся ;]
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 10:13:08

hizel писал(а):еще один nat на внутренний интерфейс или не мучатся ;]
вешал я второй nat, как сказано в примере 3: http://www.lissyara.su/articles/freebsd ... #example_3
В итоге полностью отваливался интернет, трафик завернуть так и не получилось.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение hizel » 2010-10-22 10:30:55

примеры это конечно очень занимательно, но где ваш конкретный ipfw show
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 10:49:12

hizel писал(а):примеры это конечно очень занимательно, но где ваш конкретный ipfw show
Вот для варианта который описан в самом начале поста с 1 натом:

Код: Выделить всё

# ipfw show
00002   0      0 allow ip from any to any via lo0
00003   0      0 deny ip from any to 127.0.0.0/8
00004   0      0 deny ip from 127.0.0.0/8 to any
00600 258 149122 allow ip from any to any via rl0
01000 196 145576 nat 1 ip from any to any via fxp0
60000   0      0 deny log ip from any to any
65535  34   6814 deny ip from any to any
Вот вариант который написан под впечатлением от примера 3:

Код: Выделить всё

# ipfw show
00002  0     0 allow ip from any to any via lo0
00003  0     0 deny ip from any to 127.0.0.0/8
00004  0     0 deny ip from 127.0.0.0/8 to any
00500 82 16995 nat 2 ip from any to any via rl0
00600  0     0 allow ip from any to any via rl0
01000 28  2078 nat 1 ip from any to any via fxp0
60000  0     0 deny log ip from any to any
65535 35  6854 deny ip from any to any
Конфиг выглядит вот так:

Код: Выделить всё

#!/bin/sh  
fwcmd="ipfw -q"  
wan="fxp0" 
lan="rl0" 
lann="192.168.0.0/24" # LAN network  
mina="192.168.0.10" # WEB server 
big="192.168.0.101" # station1 
  
setup_loopback () {         
  ${fwcmd} add 002 pass all from any to any via lo0         
  ${fwcmd} add 003 deny all from any to 127.0.0.0/8         
  ${fwcmd} add 004 deny ip from 127.0.0.0/8 to any 
}  
${fwcmd} -f flush

setup_loopback

${fwcmd} nat 2 config if ${lan} deny_in reset same_ports
${fwcmd} add 500 nat 2 ip from any to any via ${lan}

${fwcmd} add 600 allow all from any to any via ${lan}

${fwcmd} nat 1 config if ${wan} reset deny_in same_ports redirect_port tcp ${mina}:80 80 \
                                        redirect_port tcp ${big}:33028 33028 \
                                        redirect_port tcp ${big}:20843 20843 \
                                        redirect_port udp ${big}:30702 30702
${fwcmd} add 1000 nat 1 ip from any to any via ${wan}

${fwcmd} add 60000 deny log all from any to any
В таком варианте полностью отваливается интернет ><
Последний раз редактировалось vadim64 2010-10-22 11:31:08, всего редактировалось 1 раз.
Причина: [quote][/quote] не тождественно [code][/code]

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение hizel » 2010-10-22 11:15:54

кстати пример 3 не для вашего случая :)

а у вас ip на fxp0 динамический?
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 11:19:20

hizel писал(а):кстати пример 3 не для вашего случая :)

а у вас ip на fxp0 динамический?
Нет. Статичный.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение hizel » 2010-10-22 11:43:59

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

Код: Выделить всё

nat 1 ip from any to any
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-22 18:09:28

hizel писал(а):ну натьте только на него, чтобы все не отваливалось для начала
вообще интересно как будут ходить пакеты если оставить только одно правило:

Код: Выделить всё

nat 1 ip from any to any
Тогда сеть умирает полностью.

Попробую помудрить с тем что бы пакеты с локальной сети идущие на wan ip шли как надо.

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение Gloft » 2010-10-22 23:06:46

Сам демон ната запущен?
Посмотри:

Код: Выделить всё

# ps |grep nat
И пролпиши в rc.conf (вместо em1 твой интерфейс)

Код: Выделить всё

natd_enable="YES"
natd_interface="em1"

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-23 11:08:03

Gloft писал(а):Сам демон ната запущен?
Посмотри:

Код: Выделить всё

# ps |grep nat
И пролпиши в rc.conf (вместо em1 твой интерфейс)

Код: Выделить всё

natd_enable="YES"
natd_interface="em1"
Не путайте, я не использую natd я использую kernel nat который идет вместе с ipfw.
Причина по которой я отказался от natd в том что была сильная нагрузка на систему когда скачивались файлы например в DC++ из за чего скорость падала почти в два раза.

С переходом на kernel nat проблема с нагрузкой прошла, осталось только настроить.
Вот даже картинку нарисовал как у меня организованно, о что не работает: http://img214.imageshack.us/img214/8073/netx.jpg

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-23 12:17:47

Судя по картинке нам надо завернуть трафик идущий с внутренней сети на WANIP на локальном интерфейсе обратно в локальную сеть.
Теперь вот так вот выглядит мой конфиг:

Код: Выделить всё

#!/bin/sh

fwcmd="ipfw -q"

wan="fxp0"
wanip=`ifconfig ${wan} | grep -w 'inet'| cut -d " " -f 2`

lan="rl0"
lanip=`ifconfig ${lan} | grep -w 'inet'| cut -d " " -f 2`

lann="192.168.0.0/24" # LAN network

mina="192.168.0.10" # WEB server
big="192.168.0.101" # station1

setup_loopback () {
        ${fwcmd} add 002 pass all from any to any via lo0
        ${fwcmd} add 003 deny all from any to 127.0.0.0/8
        ${fwcmd} add 004 deny ip from 127.0.0.0/8 to any
}

${fwcmd} -f flush

setup_loopback

${fwcmd} nat 3 config ip ${lanip} deny_in reset same_ports redirect_port tcp ${mina}:80 80
${fwcmd} add 100 nat 1 ip from ${lann} to ${wanip} via ${lan}

${fwcmd} add 200 allow all from any to any via ${lan}

${fwcmd} nat 1 config if ${wan} reset deny_in same_ports redirect_port tcp ${mina}:80 80 \
                                        redirect_port tcp ${big}:33028 33028 \
                                        redirect_port tcp ${big}:20843 20843 \
                                        redirect_port udp ${big}:30702 30702
${fwcmd} add 1000 nat 1 ip from any to any

${fwcmd} add 60000 deny log all from any to any
Теперь набираем в браузере http://94.19.64.217 и смотрим tcpdump -i rl0 tcp port 80

Код: Выделить всё

tcpdump -i rl0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes
13:13:28.280986 IP 192.168.0.101.3759 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 1531368851, win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:13:28.281045 IP 192.168.0.101.3759 > 192.168.0.10.http: Flags [S], seq 1531368851, win 65535, options [mss 1460,nop,nop,sackOK], length 0
Видим что вроде как перенаправленние пошло
Только мне не понятно почему не происходит маскировка адреса на lanip...

Слушаем порт на web server (Mina):

Код: Выделить всё

Mina# tcpdump -i dc0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on dc0, link-type EN10MB (Ethernet), capture size 96 bytes
13:12:35.217737 IP 192.168.0.101.3759 > Mina.http: Flags [S], seq 1531368851, win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:12:35.217789 IP Mina.http > 192.168.0.101.3759: Flags [S.], seq 2196313064, ack 1531368852, win 65535, options [mss 1460,sackOK,eol], length 0
И тут видим что запрос пришел, и что сервер даже пытается ответить, но браузер продолжает утверждать что сервер недоступен.


Если обратиться к серверу по локальному ИП то все работает, и с внешки опять таки все работает :( я уже не знаю че делать
Последний раз редактировалось vadim64 2010-10-23 12:33:31, всего редактировалось 1 раз.
Причина: [quote][/quote] не тождественно [code][/code]

AbS
рядовой
Сообщения: 10
Зарегистрирован: 2010-10-21 23:31:53

Re: FreeBSD - IPFW NAT проброс порта на Web server

Непрочитанное сообщение AbS » 2010-10-23 12:31:18

ой, ошибся в предыдущем посте в конфиге >< а править уже не дают..

в общем, конфиг такой:

Код: Выделить всё

#!/bin/sh

fwcmd="ipfw -q"

wan="fxp0"
wanip=`ifconfig ${wan} | grep -w 'inet'| cut -d " " -f 2`

lan="rl0"
lanip=`ifconfig ${lan} | grep -w 'inet'| cut -d " " -f 2`

lann="192.168.0.0/24" # LAN network

mina="192.168.0.10" # WEB server
big="192.168.0.101" # station1

setup_loopback () {
        ${fwcmd} add 002 pass all from any to any via lo0
        ${fwcmd} add 003 deny all from any to 127.0.0.0/8
        ${fwcmd} add 004 deny ip from 127.0.0.0/8 to any
}

${fwcmd} -f flush

setup_loopback

${fwcmd} nat 3 config ip ${lanip} deny_in reset same_ports redirect_port tcp ${mina}:80 80
${fwcmd} add 100 nat 3 ip from ${lann} to ${wanip} via ${lan}

${fwcmd} add 200 allow all from any to any via ${lan}

${fwcmd} nat 1 config if ${wan} reset deny_in same_ports redirect_port tcp ${mina}:80 80 \
                                        redirect_port tcp ${big}:33028 33028 \
                                        redirect_port tcp ${big}:20843 20843 \
                                        redirect_port udp ${big}:30702 30702
${fwcmd} add 1000 nat 1 ip from any to any

${fwcmd} add 60000 deny log all from any to any
слушаем интерфейс:

Код: Выделить всё

tcpdump -i rl0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes
13:28:59.926295 IP 192.168.0.101.3784 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 661748740, win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:29:02.933485 IP 192.168.0.101.3784 > 94.19.64.217.pool.sknt.ru.http: Flags [S], seq 661748740, win 65535, options [mss 1460,nop,nop,sackOK], length 0
И видим что не происходит маскировка ип и пере адресация на Веб сервер, ну я вообще ничего не понимаю теперь ><
Последний раз редактировалось vadim64 2010-10-23 12:34:27, всего редактировалось 1 раз.
Причина: [quote][/quote] не тождественно [code][/code]