FreeBSD, port mapping, адреса не маскируются

Andrej_f
Дата: 03.01.2010 02:51:46
Проброс портов сделан через ipfw+natd, natd.conf:
redirect_port udp 192.168.1.6:50000 50000
redirect_port tcp 192.168.1.6:50101 50101
на 192.168.1.6 приходят пакеты с реальным адресом, а надо с локальным адресом сервера FreeBSD.
Подскажите, пожалуйста, как сделать?
VGrey
Дата: 03.01.2010 15:00:18
1) Опишите Вашу задачу более полно;
2) Покажите ifconfig, ipfw show;
3) Gокажите natd.conf полностью;
4) Покажите ps -ax|grep natd
5) Покажите cat /etc/rc.conf|grep nat
Потому как телепаты в отпуску по случАю Нового Года и Рождества.
Andrej_f
Дата: 04.01.2010 18:14:10
Извиняюсь.
ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.1.99 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:e0:4c:5d:d0:ee
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
ed0: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 188.128.10.122 netmask 0xfffffffc broadcast 188.128.10.123
        ether 00:00:e8:5c:94:ed
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
ipfw.conf
fw="/sbin/ipfw"
inet="ed0"
local="rl0"
ipinet="188.128.10.122"
iploc="192.168.1.99"

${fw} -f flush
${fw} add pass all from any to any via lo0
${fw} add divert natd all from any to any via ${inet}
${fw} add pass ip from any to any via ${local}
#${fw} add pass all from any to any via ${inet}
${fw} add pass tcp from any to ${ipinet} 50101 in
${fw} add pass udp from any to ${ipinet} 50000 in
${fw} add pass all from any to any via ${inet} out
natd.conf
interface ed0
#use_sockets yes
#same_ports yes
redirect_port udp 192.168.1.6:50000 50000
redirect_port tcp 192.168.1.6:50101 50101
log yes
ps -ax|grep natd
6318  p0  R+     0:00.00 grep natd
cat /etc/rc.conf|grep nat
natd_enable="NO"
natd_flags="-f /etc/natd.conf"
Задача такая:
Брать пакеты из инета, передавать их внутрь сети, но менять при этом адрес, откуда пришёл пакет на адрес локального интерфейса (192.168.1.99).
Andrej_f
Дата: 04.01.2010 18:15:44
natd_enable="NO" это сейчас, так как пока испльзуется rinetd
VGrey
Дата: 04.01.2010 23:24:28
Andrej_f
Задача такая:
Брать пакеты из инета, передавать их внутрь сети, но менять при этом адрес, откуда пришёл пакет на адрес локального интерфейса (192.168.1.99).


Андрей, cтандартно redirect_port предназначено для проброса портов в локальную сеть, то есть на машину в локальной сети поступает запрос от внешнего IP, и ответ идет на внешний IP, он натится, а пробрасывается обратно внешнему хосту.
Если Вы подмените в запросе внешний IP на 192.168.1.99, то ответ от 192.168.1.6 пойдет тоже не внешнему IP, а 192.168.1.99, а там нет службы, которая формировала запрос, его некому будет обработать. Иными словами, подмена внешнего IP на адрес локального интерфейса не имеет смысла.
Или ставилась какая-то другая цель? В чем смысл такой замены?

---
Victor
Andrej_f
Дата: 05.01.2010 08:43:44
Да, Вы правы.
Постараюсь описать, что у меня есть и как мне надо.

Есть комп № 1. Имеет 2 сет. интерфейса, один - реальный IP, второй - локальный. Этот комп получает на реальный интерфейс пакеты через интернет от оборудования, обрабатывет их и сохраняет на сервере БД (передает в локальную сеть). Потребовалось сменить провайдера. В этот комп был вставлен ещё 1 сетевой интерфейс, тоже с реальным IP, другого провайдера. Комп под управлением Windows XP, на нем стоит Kerio Winroute Firewall и программа обработки сигналов от оборудования. Часть оборудования перенастроена на новый IP, часть ещё нет. Далее началось следующеее. Как временная мера, решил перенести 1 из реальных интерфейсов на другой комп. Поставил FreeBSD 5.4 на комп № 2.

Получалось следующее:
оборудование начинает соединение (tcp) с комп № 2
комп № 2 принимает пакеты на реальный IP, передает их на комп № 1.
комп № 1 принимает их, но ответы посылает через свой реальный интерфейс (что, как Вы заметили, правильно, поскольку они имеют реальный адрес отправителя).
при этом, оборудование ожидает соединения по интерфейсу компа № 2, ничего не получает и затыкается.

Мне же нужно простой проброс порта с комп № 2 на комп № 1, чтобы комп № 1 отсылал пакеты обратно на комп № 2, а тот уже - обратно оборудованию. С помощью rinetd это решено, НО: rinetd не работает с UDP, только с TCP. Обрудование же работает как по UDP так и по TCP и не имеет постоянных IP, присваиваются по DHCP в момент установления связи.

Понимаю, что сумбурно, но что-то не могу лучше объяснить.
VGrey
Дата: 05.01.2010 10:37:47
Описание, действительно, получилось сумбурным, к сожалению...
Андрей, а можно в виде двух схем: что было, как переключили?
И второе замечание: если у Вас работает rinetd, проброс UDP-портов тоже обязан работать. По всей вероятности, остается какой-то нюанс, который, возможно, удастся понять из схем.

---
Victor
VGrey
Дата: 05.01.2010 10:52:30
Еще вариант: обоих провайдеров включаете в комп №2, не котором freebsd. В этом случае фря занимается маршрутизацией и пробросом портов (два inetd, каждый на своем интерфейсе) а виндовая машина - своей задачей. Как говорится "кесарю - кесарево", так Вы исключите из винды виснущие CNet Pro 100 и упростите маршрутизацию.


---
Victor
Andrej_f
Дата: 05.01.2010 11:58:59
Попробую схемой
   Так было
   +---------------------------+
   |WinXP+Kerio                |
   |         Обработчик        |
   |                           |         +-----------+
<->|78.108.69.250              |  +---+  | Database  |
<->|188.128.10.122  192.168.1.6|->|HUB|->|192.168.1.7|
   +---------------------------+  +---+  +-----------+

   Так теперь
   +---------------------------+
   |WinXP+Kerio                |
   |Обработчик                 |
   |                           |         +-----------+
<->|78.108.69.250              |  +---+  | Database  |
   |                192.168.1.6|->|HUB|->|192.168.1.7|
   +---------------------------+  +---+  +-----------+
                                   ^ запрос на соединение
   +---------------------------+   | передается на 1.6
   |FreeBSD                    |   | 1.6 его обрабатывает
<->|188.128.10.122 192.168.1.99|->-+ данные пишет на 1.7
   +---------------------------+     а ответ дает на 1.99
                                     который его передает в инет
А что касается rinetd, то:
rinetd redirects TCP connections from one IP address and port to another.
rinetd is a single-process server which handles any number of connections to
the address/port pairs specified in the file /etc/rinetd.conf. Since rinetd
runs as a single process using nonblocking I/O, it is able to redirect a
large number of connections without a severe impact on the machine. This
makes it practical to run TCP services on machines inside an IP masquerading
firewall.
LIMITATIONS
     rinetd redirects TCP connections only. There is no support for UDP.
     rinetd only redirects protocols which use a single TCP socket.
Andrej_f
Дата: 05.01.2010 12:07:15
VGrey
Еще вариант: обоих провайдеров включаете в комп №2, не котором freebsd. В этом случае фря занимается маршрутизацией и пробросом портов (два inetd, каждый на своем интерфейсе) а виндовая машина - своей задачей. Как говорится "кесарю - кесарево", так Вы исключите из винды виснущие CNet Pro 100 и упростите маршрутизацию.
---
Victor
Виктор, спасибо, что занимаетесь мной :)
Я так понимаю, на 1.6 указываем шлюзом по умолчанию 1.99, оба интерфейса с реальными IP ставим на FreeBSD, и теперь 1.6 деваться некуда, будет всё пересылать через FreeBSD. Так я уйду от rinetd на natd. Спасибо за идею. Если я правильно понял. Только я чайник во FreeBSD, надо маны покурить пару дней, как запустить 2 natd и правильно их разрулить. Дело в том, что система рабочая и неудачные эксперименты крайне не желательны, клиенты бурно реагируют, начальство бесится, а вазелина у нас "дифисит" (с).