Talk:Port forwarding

http://www.opennet.ru/docs/RUS/ipfw_rus/ar01s02.html

 Hi..
 * http://trunasuci.pbworks.com/Port-forwarding-on-FreeBSD-via-ipnat

it's normally happen when your server is running "behind the firewall" and using private ip network, we use port forwarding to forward "request" based on specified ports on services...

in this case, we take apache/http port 80 as an example

1- FreeBSD FW gateway + ipnat

ext ip = based on ISP, it's dynamic

internal ip = 10.0.0.200

2- NetBSD server which running web/apache/http

ip 10.0.0.147 port 80/tcp

3- For IPNAT setup, refer to my previous HOW-TO NAT with ipnat on FreeBSD,

just edit /etc/ipnat.conf and add this value:

rdr tun0 0/0 port 80 -> 10.0.0.147 port 80 tcp/udp

SAVE!!!

tun0 is device tunnel 0 created while ure using ppp foa dialing your DSL connection, any connection froum outside/internet to web services port 80, receive by FreeBSD gateway box, will be redirected to the NetBSD web server..

so after saving, u just need to flush and run/apply the rules..NAT with ipnat on FreeBSD

trunasuci# ipnat -FC && ipnat -f /etc/ipnat.rules

2 entries flushed from NAT table

4 entries flushed from NAT list

trunasuci# ipnat -l

List of active MAP/Redirect filters:

map xl1 10.0.0.0/24 -> 0.0.0.0/32

rdr tun0 0.0.0.0/0 port 80 -> 10.0.0.147 port 80 tcp/udp

List of active sessions:

MAP 10.0.0.200     22    <- -> 10.0.0.200      22    [10.0.0.5 4741]

so now u can test it from outside/internet and see if u can reach the webserver behind the firewall..  http://trunasuci.pbworks.com/NAT-with-ipnat-on-FreeBSD 

step 1- Install FreeBSD. Any version will do..

step 2- Done? Then edit /etc/rc.conf add something like this:

ipnat_enable="YES"

ipnat_program="/sbin/ipnat"

ipnat_rules="/etc/ipnat.rules"

step 3- Create your rules files in /etc ( as stated here it's ipnat.rules, but u can named it anything u like )...

check your NIC ip, especially facing your network and will be acting as gateway ip...

trunasuci# ifconfig

xl0: flags=8843 metric 0 mtu 1492

options=9

ether XXXXXX

inet 0.0.0.0 netmask 0xff000000 broadcast 0.255.255.255

media: Ethernet autoselect (100baseTX )

status: active

xl1: flags=8843 metric 0 mtu 1500

options=9

ether XXXXXX

inet 10.0.0.200 netmask 0xffffff00 broadcast 10.0.0.255

media: Ethernet autoselect (100baseTX)

status: active

plip0: flags=108810 metric 0 mtu 1500

lo0: flags=8049 metric 0 mtu 16384

inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4

inet6 ::1 prefixlen 128

inet 127.0.0.1 netmask 0xff000000

tun0: flags=8051 metric 0 mtu 1492

inet 60.48.XX.XX --> 219.93.218.177 netmask 0xffffffff

Opened by PID 1251

example your NIC facing your network and will become gateway is xl1, then your ipnat.rules file should be like this:

map xl1 10.0.0.0/24 -> 0/32

then SAVE!

step 4-

run your ipnat.. mine always flush and run ipnat, pointing to the rules files

trunasuci# ipnat -FC && ipnat -f /etc/ipnat.rules

2 entries flushed from NAT table

4 entries flushed from NAT list

trunasuci# ipnat -l

List of active MAP/Redirect filters:

map xl1 10.0.0.0/24 -> 0.0.0.0/32

so it's run!

on your client pc/box just set this ip of xl1 as gateway ( in this case it's 10.0.0.200 )

walla! it runs!!

test from NetBSD as client/server behind the FreeBSD gateway:

netbsd# nslookup www.yahoo.com

Server:        61.6.32.162

Address:       61.6.32.162#53

Non-authoritative answer:

www.yahoo.com  canonical name = www.wa1.b.yahoo.com.

www.wa1.b.yahoo.com    canonical name = www-real.wa1.b.yahoo.com.

Name:  www-real.wa1.b.yahoo.com

Address: 209.191.93.52

netbsd# uname -a

NetBSD netbsd.trunasuci.opensource.my 3.1_STABLE NetBSD 3.1_STABLE (GENERIC) #0: Thu Jan 1 11:38:51 MYT 2009  root@:/usr/obj/sys/arch/i386/compile/GENERIC i386



echo "rinetd_enable="YES"" >> /etc/rc.conf порт 5900 с адреса 10.1.1.1 на адрес 192.168.0.100:5900. 10.1.1.1 5900 192.168.0.100 5900 >> /usr/local/etc/rinetd.conf

 В документации к нему написано, что возможность NAT появилась во FreeBSD'2.2 вместе с опцией "divert (4) socket".

Прежде, чем настраивать NAT, надо чётко уяснить:

* для HTTP и FTP гораздо лучше работает Squid; * natd позволяет машинам с Intranet-номерами (самоприсвоенными, а не полученными от провайдера) прозрачно выходить в Сеть по большинству протоколов (в это большинство входят все протоколы, работающие поверх устанавливаемых от клиента TCP-соединений, а также все широко известные UDP-based протоколы); * NAT плохо совместим с FTP, если клиент работает в пассивном режиме (т.е. просит сервера открыть TCP-соединение по порту:20); * natd также позволяет перенаправить запросы, идущие к нему по определенному порту, на один из серверов внутренней сети (в данной статье эта задача не рассматривается); * прежде, чем начинать работу, ОБЯЗАТЕЛЬНОпрочитайте manual pages по natd, ipfw и divert и статьи "To NAT or not to NAT, вот в чём вопрос" и Network adres translation; а также изучите устройство файлов /etc/rc.conf, /etc/defaults/rc.conf, /etc/rc.network и /etc/rc.firewall и сохраните их запасные копии. * проводите все манипуляции только имея гарантированный доступ к консоли, иначе при любой ошибке можно оказаться без доступа по сети.

Для начала надо пересобрать ядро с опциями

options IPFIREWALL options IPDIVERT

Я ещё добавляю

options IPFIREWALL_DEFAULT_TO_ACCEPT

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

В файле /etc/rc.conf должны присутствовать следующие строки:

gateway_enable="YES" firewall_enable="YES"; firewall_type="open" natd_enable="YES"; natd_interface="сетевой_интерфейс"

Если при этом сетевой_интерфейс правильно сконфигурирован, дальше можно не читать - после перезагрузки всё должно работать.

Строка 'gateway_enable="YES"' вызывает установку переменной ядра 'sysctl -w net.inet.ip.forwarding=1', разрешающей передачу другим машинам IP-пакетов, полученных от третьих машин (это нужно и для роутера, не занимающегося трансляцией адресов).

Строка 'firewall_enable="YES"; firewall_type="open"' вызывает запуск скрипта /etc/rc.firewall и указывает ему применить наиболее простую конфигурацию пакетного фильтра, в которой разрешены все IP-пакеты, кроме очевидно некорректных.

Строка 'natd_enable="YES"; natd_interface="сетевой_интерфейс"' предписывает скрипту /etc/rc.network запустить демон natd, передав ему в виде аргумента сетевой_интерфейс; а скрипту /etc/rc.firewall - добавить в список ipfw-правил указание дивертить (пересылать через divert socket) natd-демону IP-пакеты, проходящие через указанный сетевой_интерфейс.

Как правило, машина, на которой производится NAT, имеет несколько IP-номеров (не считая 127.0.0.1). Эти IP-номера могут быть распределены по разным сетевым интерфейсам, а могут быть присвоены одному сетевому интерфейсу. Демон natd использует для преобразования адресов основной IP-номер указанного ему сетевого_интерфейса. Если учесть, что при установлении TCP-соединения клиент использует основной IP-номер, то становится очевидно, что IP-номер, полученный от провайдера, следует сделать основным; а самоприсвоенные IP-номера, если их нужно поместить на тот же сетевой интерфейс, должны быть оформлены как алиасные.

В /etc/services должна присутствовать строка

natd	8668/divert	# Network Address Translation socket

Это задает порт по умолчанию (после установки FreeBSD эта строка уже имеется). В /etc/inetd.conf ничего писать не надо - natd не запускается как сервис. 