FreeBSD router kernel NAT ipfw GRE vpn server ok working

добавлено l2tp psk — еще чуть побыстрее работает  12-2017

связанная статья http://santosha.no-ip.info/wordpress/tunnel-vpn-site-to-site-link/

ipfw freebsd #FreeBSD настройка примеры Unix Linux развести интернет по всем компьютерам и связать магазин склад и офис !
пример рабочего конфига для маршрутизатора роутера на FreeBSD для выхода в Интернет в малом офисе а также соединения с точкой продаж магазином где 3 терминала в сети и сервер

(напоминаю что если сервер настраивается удаленный то убедитесь что скрипт ipfw правильный и выполнится без ошибок иначе на сервер больше не соединитесь никак — firewall заблокирует всю сеть вообще — после его загрузки или команды flush включается только последнее по списку правило 65535 запрещающее прохождение всех пакетов по сети. И что загрузка системы дойдет до rc.local без вопросов перед этими изменениями например не монтируются недоступные диски или сетевые накопители через etc fstab ).

 

[bash]

# when load first time do not pass sending dhcp request to inet provider ... after firewall set is OK
#add to loader.conf - net.inet.ip.fw.default_to_accept=1

2 вариант подгрузил kernel module ipfw nat ядро не собирал
- из loader.conf natd соответственно отключен

root@pc1:~ # kldstat
Id Refs Address Size Name
1 59 0xffffffff80200000 1a1c900 kernel
2 4 0xffffffff81c1d000 45c20 linux.ko
3 3 0xffffffff81c63000 7f98 linux_common.ko
4 4 0xffffffff81c6b000 1d290 ipfw.ko
5 1 0xffffffff81c89000 2d10 coretemp.ko
6 1 0xffffffff81c8c000 15090 fuse.ko
7 1 0xffffffff81ca2000 6878 sem.ko
8 1 0xffffffff81ca9000 10c210 nvidia-modeset.ko
9 2 0xffffffff81db6000 f57558 nvidia.ko
..
11 1 0xffffffff82d13000 47f0 ipfw_nat.ko
12 2 0xffffffff82d18000 14550 libalias.ko
13 1 0xffffffff82e19000 3ca2 linprocfs.ko
14 1 0xffffffff82e1d000 22ca ums.ko
..
16 1 0xffffffff82e2a000 16a25 smbfs.ko
17 2 0xffffffff82e41000 3117 libiconv.ko
18 2 0xffffffff82e45000 e89 libmchain.ko
19 2 0xffffffff82e46000 7bdb7 osscore.ko
20 1 0xffffffff82ec2000 e070 oss_envy24ht.ko
21 1 0xffffffff82ed1000 74c rtc.ko
root@pc1:~ #

# добавлен GRE протокол он вообще то отлавливается ipfw отдельно хоть на низком уровне встроен в tcp ip — спрятан внутри пакета tcp-ip (encapsulated).

root@pc1:~ # /sbin/ipfw show
00045 122168 113102615 nat 123 ip from any to me recv igb1 in
00050 56327 23810849 allow ip from any to any in
00055 35456 4513402 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00100 6577 12903115 allow ip from any to any via lo0
60000 2683 187296 allow gre from any to any
62000 0 0 allow ipv6-icmp from any to any
63000 5868 334536 allow icmp from any to any
65000 115666 76945341 allow ip from any to any
65535 1555 224904 deny ip from any to any
root@pc1:~ #

root@pc1:~ # cat /boot/loader.conf
legal.intel_wpi.license_ack=1
hw.vga.textmode=1
#wpifw_load="YES"
#if_wpi_load="YES"
#vboxdrv_load="YES"
fuse_load="YES"
coretemp_load="YES"
#hw.pci.default_vgapci_unit="0"
#hw.psm.synaptics_support=1
linux_load="yes"
net.graph.maxdata=8192
kern.maxvnodes=85000
kern.maxproc=15000
kern.maxfiles=32700
kern.securelevel=-1
sem_load="YES"
#nvidia change to nvidia-modeset 1.09.2016 ( add textmode for console)
nvidia-modeset_load="YES"
nvidia_load="YES"
libalias_load="YES"
ipfw_load="YES"
ipdivert_load="YES"
ipfw_nat_load="YES"

//ip not actual
root@pc1:~ # cat /etc/rc.conf
hostname="pc1"
#fsck_y_enable="YES"
background_fsck="YES"
ifconfig_igb0="192.168.3.211"
# inet .. netmask 0xffffff00 broadcast 192.168.3.255
#ifconfig_re0="SYNCDHCP"
sshd_enable="YES"
#ifconfig_igb0_ipv6="inet6 accept_rtadv"
#vboxdrv_enable="YES"
#vboxnet_enable="YES"
gateway_enable="YES"
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_nat_flags="redirect_port tcp 192.168.3.2:1723 1723 redirect_port tcp 192.168.3.2:4899 4900"
firewall_nat_interface="igb1"
#standard rule //flush command in rc.local
firewall_type="OPEN"
#dummynet_enable="YES"
#natd_enable="YES"
#natd_interface="igb1"
#natd_flags="-f /etc/natd.conf"
##crash if 12 current kernel after 17-aug-2016 (soundon in rc.local)
oss_enable="YES"
..

root@pc1:~ # cat /etc/rc.local
#kldload linux
#kldload fuse
ifconfig igb0 192.168.3.211
/usr/local/bin/ntfs-3g /dev/da0s1 /media/disk
# не работает пока замкнул винчестер отверткой
# this is hardware problem
# поставить напоминалку перепаять пзу flashку 25xx а то данные с новой платкой не считаются
mount_smbfs -I192.168.3.2 -EUTF-8:CP1251 //Админ1@srv01/e$ /mnt
mount_smbfs -I192.168.3.2 -EUTF-8:CP1251 //Админ1@srv01/F /mnt1
#mount_smbfs -L ru_RU.UTF-8 -E UTF-8:CP1251 //админ2@srv02/e$ /mnt

# for ati driver 7.2.0 - no KMS kernel part & fw autoload
#kldload radeonkms
##kldload drm
#kldload nvi-.ko

#soundon

# all in loader.conf // load modules - do not compile all into kernel
#kldload libalias
#kldload ipfilter
#kldload ipfw
#kldload ipfw_nat
#kldload ipdivert

/sbin/ipfw -q -f flush
# echo y | ipfw flush
/sbin/ipfw add 45 nat 123 ip from any to me recv igb1 in
/sbin/ipfw add 50 allow ip from any to any in
/sbin/ipfw add 55 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
/sbin/ipfw add 100 allow ip from any to any via lo0
#add gre TEST OK
/sbin/ipfw add 60000 allow gre from any to any
/sbin/ipfw add 63000 allow icmp from any to any
/sbin/ipfw add 62000 allow ipv6-icmp from any to any
/sbin/ipfw nat 123 config if igb1 redirect_port tcp 192.168.3.2:1723 1723 redirect_port tcp 192.168.3.2:4899 4900
/sbin/ipfw add 65000 allow ip from any to any
/sbin/ipfw nat 123 show config
/sbin/ipfw show

#vpn pptp at 192.168.3.2 .. там винда сервер 2012 не mpd
route add 192.168.0.0 192.168.3.2
#route add -net 192.168.0.0/24 192.168.3.2
#если internet по 2 кабелю
#route add 0.0.0.0 192.168.3.2
#route show 192.168.0.0
#/root/rungnome.sh
#/usr/bin/env DISPLAY=:0 xterm

[/bash]

server vpn with two connections — merge two LAN’s inbound port 1723 addr 192.168.3.2 outbound from 192.168.3.2 to 1723 port (2-nd LAN server at remote shop), GRE (encapsulated into IP) pass
to/from igb1 — internet interface.
(vpn PPTP site-to-site connect), port 4899 remote control Radmin for Windows — redirect to 4900 because many connections from Hacker.
handbook not ignore

[bash collapse="0"]
#firewall script only //the same as above
/sbin/ipfw -f flush

#redirect port to server vpn ..3.2 tcp packet receive to ME - FreeBSD router
/sbin/ipfw allow tcp from any to me dst-port 1723 in via igb1
#LAN interface connect to 3 home PC (or office)
/sbin/ipfw add allow ip from any to any via igb0
/sbin/ipfw add allow ip from any to any via lo0
# /sbin/ipfw add 40 allow gre from any to any # //wrong - must follow after NAT rule, GRE is encapsulated into IP // летчики и программисты на русский не переводят
# /sbin/ipfw add 40 allow tcp from me 1723 to any out via igb1 # //coocoo 0 match in ipfw show - miss dst-port before 1723, source go from LAN - used NAT out rule
/sbin/ipfw add nat 123 ip from any to me recv igb1 in
/sbin/ipfw add allow ip from any to any in
/sbin/ipfw add nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
# /sbin/ipfw add 60 nat 123 gre from any to any # //wrong
/sbin/ipfw add allow gre from any to any
/sbin/ipfw add allow icmp from any to any
/sbin/ipfw add allow ipv6-icmp from any to any
/sbin/ipfw nat 123 config if igb1 redirect_port tcp 192.168.3.2:1723 1723 redirect_port tcp 192.168.3.2:4899 4900
/sbin/ipfw add allow ip from any to any
/sbin/ipfw nat 123 show config
/sbin/ipfw show

root@pc1:~/nat/ipfw# ipfw nat 123 show config
ipfw nat 123 config if igb1 redirect_port tcp 192.168.3.2:4899 4900 redirect_port tcp 192.168.3.2:1723 1723
root@pc1:~/nat/ipfw# ipfw show
00100 15 760 allow tcp from any to me dst-port 1723 in via igb1
00200 5149 1421284 allow ip from any to any via igb0
00300 916 489136 allow ip from any to any via lo0
00400 5065 2189448 nat 123 ip from any to me recv igb1 in
00500 30 960 allow ip from any to any in
00600 1312 149548 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00700 0 0 allow gre from any to any
00800 126 7056 allow icmp from any to any
00900 0 0 allow ipv6-icmp from any to any
01000 3758 2202057 allow ip from any to any
65535 531 38220 deny ip from any to any

[/bash]

а так более правильно бо сервер выделяет протокол gre 47 из ip и его пакеты подсчитываются (в примере выше нули)

[bash collapse="0"]
# firewall rules add into file rc.local (or rc.conf - comment firewall_type="OPEN" add next line firewall_script="/etc/ipfw.rules"
#-------ipfw.rules--------
/sbin/ipfw -f flush
# igb1 internet - use dhclient - get internet address 74.10.11... from provider (edit igb1)
/sbin/ipfw allow tcp from any to me dst-port 1723 in via igb1
/sbin/ipfw add nat 123 ip from any to me recv igb1 in
/sbin/ipfw add allow ip from any to any in
/sbin/ipfw add nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
/sbin/ipfw add nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
/sbin/ipfw add allow gre from any to any
/sbin/ipfw add allow icmp from any to any
#LAN interface connect to 3 home PC (or office) - edit igb0
/sbin/ipfw add allow ip from any to any via igb0
/sbin/ipfw add allow ip from any to any via lo0
/sbin/ipfw add allow ipv6-icmp from any to any
/sbin/ipfw nat 123 config if igb1 redirect_port tcp 192.168.3.2:1723 1723 redirect_port tcp 192.168.3.2:4899 4900
/sbin/ipfw add allow ip from any to any
/sbin/ipfw nat 123 show config
/sbin/ipfw show
#--------------
root@pc1:~ # chmod 777 /etc/ipfw.rules
root@pc1:~ # ./etc/ipfw.rules
root@pc1:~ # ipfw show
00100 28 1408 allow tcp from any to me dst-port 1723 in via igb1
00200 1575025 1032418979 nat 123 ip from any to me recv igb1 in
00300 558482 371772859 allow ip from any to any in
00400 149949 10591741 nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
00500 191644 67467366 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00600 154426 12581594 allow gre from any to any
00700 536464 494946460 allow ip from any to any via igb0
00800 57575 156049681 allow ip from any to any via lo0
00900 67182 3762082 allow icmp from any to any
01000 0 0 allow ipv6-icmp from any to any
01100 637297 838280315 allow ip from any to any
65535 151 12190 deny ip from any to any
root@pc1:~ #

# сервер vpn на винде 2012 server, не на этом компьютере, который только шлюз router. Разбирался что он не работает - оказалось забыл удалить все интерфейсы из списка NAT - компьютер в локальной сети а раньше он раздавал Интернет.( Vpn pptp - windows server 2012 now Remote Access + Routing, remove all interfaces from NAT except internal). Можно вместо него настроить MPD, просто подключен который уже работает, с настройкой объединения сетей.
root@pc1:/# netstat -rn
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default 77.41.x.x UGS igb1
77.41.x.x/20 link#2 U igb1
77.41.x.x link#2 UHS lo0
127.0.0.1 link#3 UH lo0
** 192.168.40.0/
192.168.0.0/31 192.168.3.2 UGS igb0
192.168.0.0/16 192.168.3.2 UGS igb0
192.168.3.0/24 link#1 U igb0
192.168.3.211 link#1 UHS lo0

Internet6:
Destination Gateway Flags Netif Expire
::/96 ::1 UGRS lo0
::1 link#3 UH lo0
::ffff:0.0.0.0/96 ::1 UGRS lo0
fe80::/10 ::1 UGRS lo0
fe80::%igb0/64 link#1 U igb0
fe80::225:90ff:fe76:b120%igb0 link#1 UHS lo0
fe80::%lo0/64 link#3 U lo0
fe80::1%lo0 link#3 UHS lo0
ff02::/16 ::1 UGRS lo0
root@pc1:/#

[/bash]

вот вся отладка (правило 105 убрать — пакеты gre не проходят куда нужно — достаточно 100 правила — т.к. пакет GRE
находится внутри TCP -но ipfw умеет их различать и считает если выводить ipfw show)
правило 600 нужно — иначе входящий трафик на 1723 проходит но не получает ответ! но его надо уточнять!
как — пробую сейчас.

[bash collapse="1"]

root@pc1:~ # ipfw show
00100 356 17992 allow tcp from any to me dst-port 1723 in via igb1
00105 1476 110712 allow gre from any to any in via igb1
00200 4383986 4749307786 nat 123 ip from any to me recv igb1 in
00300 4311101 4248534611 allow ip from any to any in
00400 136595 38899924 nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
00500 2684856 2351493378 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00600 147471 98464179 allow gre from any to any
00700 4702995 6782099119 allow ip from any to any via igb0
00800 152519 1450032928 allow ip from any to any via lo0
00900 42240 2365122 allow icmp from any to any
01000 0 0 allow ipv6-icmp from any to any
01100 0 0 allow ip6 from any to any
01200 172394 156649193 allow ip from any to any
65535 747 51884 allow ip from any to any
root@pc1:~ # /sbin/ipfw delete 105
root@pc1:~ # /sbin/ipfw delete 600
root@pc1:~ # ipfw show
00100 356 17992 allow tcp from any to me dst-port 1723 in via igb1
00200 4386112 4751685401 nat 123 ip from any to me recv igb1 in
00300 4312101 4248625646 allow ip from any to any in
00400 136596 38899981 nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
00500 2685948 2351923913 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00700 4704996 6784469150 allow ip from any to any via igb0
00800 152519 1450032928 allow ip from any to any via lo0
00900 42297 2368314 allow icmp from any to any
01000 0 0 allow ipv6-icmp from any to any
01100 0 0 allow ip6 from any to any
01200 172415 156650341 allow ip from any to any
65535 747 51884 allow ip from any to any
root@pc1:~ # нет ответа на внешние соединения - надо
ipfw add 600 allow gre from any to any xmit igb1 out

root@pc1:~# ipfw show
00100 231 11704 allow tcp from any to me dst-port 1723 in via igb1
00103 95909 7548259 allow tcp from any to me dst-port 80,443,22
00106 16 5896 allow udp from any 500 to 192.168.3.2 dst-port 500
00108 0 0 allow udp from any 1500 to 192.168.3.2 dst-port 1500
00109 0 0 allow udp from any 4500 to 192.168.3.2 dst-port 4500
00119 0 0 allow udp from any 1701 to 192.168.3.2 dst-port 1701
00200 969248 753882989 nat 123 ip from any to me recv igb1 in
00202 0 0 allow esp from any to 192.168.3.2
00300 532990 275517182 allow ip from any to any in
00400 47210 4173359 nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
00500 452694 409672519 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
00502 0 0 nat 123 esp from 192.168.3.0/24 to any xmit igb1 out
00600 49906 4254611 allow gre from any to any
00601 8657 844757 allow udp from any to any
00700 495033 327728917 allow ip from any to any via igb0
00800 23896 202461135 allow ip from any to any via lo0
00900 17128 959330 allow icmp from any to any
01000 0 0 allow ipv6-icmp from any to any
01100 365890 256675867 allow ip from any to any
65535 135 7662 deny ip from any to any
root@pc1:~# ipfw nat show config
ipfw nat 123 config if igb1 redirect_port tcp 192.168.3.2:51413 51413 redirect_port tcp 192.168.3.2:3389 3389 redirect_port tcp 192.168.3.211:92 92 redirect_port tcp 192.168.3.211:80 80 redirect_port tcp 192.168.3.211:90 90 redirect_port tcp 192.168.3.2:443 443 redirect_port tcp 192.168.3.2:4899 4900 redirect_port udp 192.168.3.2:4500 4500 redirect_port udp 192.168.3.2:500 500 redirect_port udp 192.168.3.2:1701 1701 redirect_port tcp 192.168.3.2:1723 1723

побольше правил ipsec l2tp-psk // ikev2 not work! 2012 server or 2016 // сервер за роутером
psk это pre-shared key — вместо сертификата задается строка пароля одинаковая на компьютере и на сервере,
на 2012 r2 и на 2016 сервере работает! шифрование достаточное а ключ можно раз в неделю менять.

loader.conf: net.inet.ip.fw.default_to_accept=1  > 0
root@pc1:/usr/local# ipfw show 
00070 538514 3586232248 allow ip from any to any via lo0
# ipfw default 65535 deny any to any - first send dhcp request fail, sendmsg err in dmesg
# if add default_to_accept into loader.conf - last rule change to allow any to any
# net.inet.ip.fw.default_to_accept=1 в примере ниже не добавлен но если добавить то соединение с провайдером
# не будет обрываться при загрузке - иначе режет пакет запроса dhcp по igb1 - внешнему интерфейсу 
# add DNS traffic -count only - 1280 rule ip from any to any -pass dns 67 dhcp 53
# ipfw add 82 allow udp from any 53 to me in via igb1
# ipfw add 84 allow udp from me to any 53 out via igb1
00100 62944 60425498 allow ip from any to any via lo0
00200 0 0 allow ip6 from any to any via lo0
00300 0 0 allow ip from any to any via tun0
00350 0 0 allow tcp from any to me dst-port 1723 in via igb1
00400 28795 4663924 nat 123 udp from any to me dst-port 443,500,4500,1701,1900 in via igb1
00600 0 0 nat 123 gre from any to me recv igb1 in
00700 42712 2538576 allow tcp from any to me dst-port 22,80,90 in via igb1
00800 1188328 1430489446 nat 123 ip from any to me recv igb1 in
00900 370644 54948534 allow ip from any to any in
00950 1024 162956 nat 123 udp from 192.168.3.0/24 to any dst-port 500,4500,1701,1900 xmit igb1 out
01000 0 0 nat 123 esp from 192.168.3.0/24 to any xmit igb1 out
01100 0 0 nat 123 gre from 192.168.3.0/24 to any xmit igb1 out
01200 274078 48037118 nat 123 ip from 192.168.3.0/24 to any xmit igb1 out
01300 0 0 allow gre from any to any
01400 43563 6197686 allow udp from any to any
01500 0 0 allow esp from any to any
01600 522054 898467768 allow ip from any to any via igb0
01700 6154 344600 allow icmp from any to any
01800 0 0 allow ipv6-icmp from any to any
01900 539060 156065544 allow ip from any to any
02000 0 0 allow ip6 from any to any
02100 0 0 allow ip from any to any
65535 249 18571 deny ip from any to any
root@pc1:/~ # ipfw nat show config
ipfw nat 123 config if igb1 same_ports reset redirect_port tcp 192.168.3.2:1723 1723\
redirect_port tcp 192.168.3.2:443 443\
redirect_port tcp 192.168.3.2:4899 4900\
redirect_port tcp 192.168.3.2:3389 3389\
redirect_port tcp 192.168.3.2:51413 51413\
redirect_port udp 192.168.3.2:1701 1701\
redirect_port udp 192.168.3.2:500 500\
redirect_port udp 192.168.3.2:4500 4500\
redirect_port udp 192.168.3.2:5500 5500
root@pc1:/~ #<br> move https from 700 to 400 if no https www server run at router computer</p><p>на винде или на сервере в командной строке ОТ Админа пишем netstat -a<br> С портами надо уточнять !! в тех документации Microsoft написано udp 500, 1701, 1900, 4500, 5500 еще<br> и tcp 1723 + gre 47 protocol если pptp. и еще 443 https - для pptp и l2tp-psk точно не нужен.<br> Входящие порты открыты у клиента ! который инициирует соединение. и у сервера тоже - проверить netstat<br> По таблице правил ipfw которая чуть выше с компа из сети за сервером FreeBSD соединение и устанавливается и работает. (где цифры не 0 значит такой трафик есть и пакеты бегают но не факт что попадают куда надо и не отбрасываются - смотрим правила)<br> Роутер соответственно с двумя сетевыми платами - igb1 это интернет по dhcp, igb0 локальная сеть и там сервер vpn на windows.<br> ipfw delete 950<br> # бредятина убирается - на самом деле зачем обратно транслировать в сеть локальную через nat исходящие l2tp ipsec psk пакеты а 1200 правило нужно без него транслятор адресов запутается и у локалки не будет интернета<br> # учитываем что соединение IPSEC L2TP (PSK) использует только порты udp, 1723 tcp можно е открывать, а если открывать это правило должно быть первым до NAT ! напрямую проброшен порт.
1812 1813 1645 1646 nat udp добавить для сервера 2012 ipsec nps npas (смотрим порты внутреннего интерфейся из консоли роутера в mmc) 
# ! и все заработало и исходящее соединение и входящее
nat one_pass no
root@pc1:/# sysctl net.inet.ip.fw.one_pass
net.inet.ip.fw.one_pass: 0
root@pc1:/# 

Ноябрь 12, 2017

0

Значение /etc/sysctl.conf net.inet.ip.fw.one_pass=0 После проверки nat -ом. если в нате стоит deny_in и записей  в таблице nat нет. то пакет пойдет дальше по правилами фаера. Если значение стоит 1.sysctl.conf net.inet.ip.fw.one_pass=1  то пакет будут принят создаться запись в нате и пакет дальше по правилам фаера не пойдет.
[/bash]

# читаем внимательно — как получается электронщики продавали схемы и платы да у нас на рынке который потом в Митино переехал — парочку дорожек замкнуто на питание и землю а в описании надо убрать 2 перемычки и одну добавить и тогда работает!

 

 





  • на 2012 сервере если он не раздает интернет — убрать из nat все интерфейсы кроме внутреннего.. а то может не пустить никого по сети 50 на 50! (bfe не настраивается и рубит все входящие соединения)
  • 2012 2012R2 server — use as VPN, not Intermet router — Nat interface only Internal ! remove all LAN from NAT section (NAT combine with Firewall — may random block any network traffic)

 

исправлено в декабре 2017

небольшой тест занявший 3 часа (много букав).

вообще у этой конфигурации есть исходник т. е. откуда она взятаforums.freebsd.org/threads/34520/
FreeBSD Donate to FreeBSD
Home
About
Get FreeBSD
Documentation
Community
Developers
Support
FoundationForums > Server and Networking > Firewalls >Significant network latency when using ipfw and in-kernel NAT

Discussion in ‘Firewalls‘ started by dreijer, Sep 13, 2012.

dreijer

dreijer New Member

3

Hi there,

We’re running FreeBSD 9.0-RELEASE on a box whose primary purpose is to act as a firewall and a gateway. Up until today, we’ve been using ipfw(4) in conjunction with natd(8) and the divert action in ipfw(4) to forward packets between the FreeBSD box (i.e. the public Internet) and our private servers.

Unfortunately, natd(8) appears to be quite the CPU hog and we therefore decided to switch to the in-kernel NAT support in ipfw(4). The issue we’re running in to is that the network latency appears to be skyrocketing when ipfw(4) contains nat rules. Basically all TCP traffic
originating from the box times out and pinging google.com on the box gives an average of ~10 SECONDS — and that’s even if I explicitly allow all ICMP traffic before the packets even get to the nat rules in ipfw.

The really odd part, however, is that I can ping the FreeBSD box just fine externally. For instance, pinging the server from my home connection gives an average of 45 ms. I’m also able to communicate just fine with the internal servers through the FreeBSD box.

Does anybody have any idea what’s going on? I assume I must’ve misconfigured something big here…

dreijer, Sep 13, 2012
#

AnonymousAnonymous Guest

I have a working setup with ipfw(8)() and in-kernel NAT on FreeBSD 8.3. I do not see the described latency, and pinging google.com from the NAT machine gives almost the same round-trip time as from a client behind the NAT. Actually, the ping from the client expectedly takes a little bit longer.

You might want to post your NAT and IPFW rules.

I hope that it is not an 9.0 issue, since I am going to upgrade my server soon.

 

dreijer New Member

Messages:
3
Thanks Received:
0

Definitely. Since this is a server in production, I’ve obfuscated some of the IPs, etc.

First off, here’s the ifconfig. Our setup consists of a private (ix0) and a public nic (ix1) and an ip tunnel (gif0), which is what we use in ipfw to forward incoming packets to our internal boxes:

Code:
ix0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=401bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,VLAN_HWTSO>
        ether XX:XX:XX:XX:XX:XX
        inet <private VLAN IP> netmask 0xffffffc0 broadcast xx
        inet6 xxxx::xxx:xxxx:xxxx:xxxx%ix0 prefixlen 64 scopeid 0x7
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (10Gbase-Twinax <full-duplex>)
        status: active
ix1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=400bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWTSO>
        ether XX:XX:XX:XX:XX:XX
        inet <public IP> netmask 0xfffffff8 broadcast xx
        inet6 xxxx::xxx:xxxx:xxxx:xxxx%ix1 prefixlen 64 scopeid 0x8
        inet <alias public IP> netmask 0xffffffff broadcast xx
        inet <alias public IP> netmask 0xffffffff broadcast xx
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (10Gbase-Twinax <full-duplex>)
        status: active
ipfw0: flags=8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0xa
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        tunnel inet <private VLAN IP> --> <private VLAN IP>
        inet 172.16.1.1 --> 172.16.1.2 netmask 0xffff0000
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        options=1<ACCEPT_REV_ETHIP_VER>

The basic ruleset looks like this. One-pass is off so that packets are reinjected after going through NAT’ing and pipes:

Code:
00001  16653   4417407 allow ip from any to any via ix0
00003  14588   2860344 allow ip from any to any via gif1
00006      0         0 allow ip from any to any via lo0
00010      0         0 deny ip from 192.168.0.0/16 to any in via ix1
00011      0         0 deny ip from 172.16.0.0/12 to any in via ix1
00012      0         0 deny ip from 10.0.0.0/8 to any in via ix1
00013      0         0 deny ip from 127.0.0.0/8 to any in via ix1
00014      0         0 deny ip from 0.0.0.0/8 to any in via ix1
00015      0         0 deny ip from 169.254.0.0/16 to any in via ix1
00016      0         0 deny ip from 192.0.2.0/24 to any in via ix1
00017      0         0 deny ip from 204.152.64.0/23 to any in via ix1
00018      0         0 deny ip from 224.0.0.0/3 to any in via ix1
00019     15      1020 allow icmp from any to any via ix1   # For testing purposes, allow all ICMP in and out of the public adapter
00020   7537    647951 nat 1 ip from any to any in via ix1   # NAT all incoming traffic
00030      0         0 check-state # For some reason, this never gets matched even though rule #100 is matched
00100    161    124340 skipto 805 tcp from any to any out via ix1 setup keep-state   # For testing purposes, allow all TCP originating from the box out of the public adapter
00110      0         0 skipto 805 icmp from any to any out via ix1 keep-state
00200  36557   1996626 skipto 500 tcp from any to 172.16.1.2 dst-port 443 in via ix1   # Forward NAT'ed traffic for port 443 over the ip tunnel
00201  46593  63973143 skipto 805 tcp from 172.16.1.2 443 to any out via ix1
00400      8      6192 deny ip from any to any via ix1
00500      0         0 pipe 1 ip from any to any in via ix1   # Packet shaping
00501      0         0 allow ip from any to any in via ix1
00805   8963   3412995 nat 1 ip from any to any out via ix1
00806   8963   3412995 allow ip from any to any
10000      0         0 deny ip from any to any via ix1   # Last ditch catch
65535 864357 867120912 allow ip from any to any

‘ipfw nat show config’ yields:

Code:
ipfw nat 1 config if ix1 log reset redirect_port tcp 172.16.1.2:443 <public IP>:443

And finally, here are the horrifying ping times (furthermore, all outgoing TCP traffic originating from this box, such as wget or pkg_add, time out. I’ve managed to get an outgoing telnet working, but it’s horrible slow and takes a while to establish):

Code:
PING google.com (74.125.227.14): 56 data bytes
64 bytes from 74.125.227.14: icmp_seq=0 ttl=56 time=2746.953 ms
64 bytes from 74.125.227.14: icmp_seq=1 ttl=56 time=2097.460 ms
64 bytes from 74.125.227.14: icmp_seq=2 ttl=56 time=2186.068 ms
64 bytes from 74.125.227.14: icmp_seq=3 ttl=56 time=4292.776 ms
64 bytes from 74.125.227.14: icmp_seq=4 ttl=56 time=5056.965 ms
64 bytes from 74.125.227.14: icmp_seq=5 ttl=56 time=5323.720 ms
64 bytes from 74.125.227.14: icmp_seq=6 ttl=56 time=5007.974 ms
64 bytes from 74.125.227.14: icmp_seq=7 ttl=56 time=4756.587 ms

It’s worth mentioning that when I switch back to using natd and divert in the ruleset (which really only changes the nat portions and everything else stays the same), the ping time drops to ~300ms, which is a big difference for simply «using» natd even when the ICMP packets aren’t supposed to be going through NAT’ing whatsoever. The ~300ms ping time is still way too high, though, since our other boxes have a ping time to Google of ~0.300ms…

Any ideas?

 Soren

 
Anonymous

Anonymous Guest

It looks to me as if TSO is enabled on your adapter ix0.The manual of ipfw(8)() states in the section BUGS:

Some observations about the firewall rules:

Your ipfw rule 0003 refers to gif1, however, gif1 is not present in your ifconfig(8)() listing. You mentioned explicitly gif0 in your message, and you might want to check your actual rule set.

Also in my case, the check-state rule does always show package/byte counts of zero. So, I assume this is normal.

In my opinion, your rule 200 should become a lower index and go before rule 100, and I would append setup keep-state to it, so most probably rule 201 could be omitted.

I don’t think that rule 100 can be for testing only. In my setup a similar rule lets all the clients connecting to the internet, and with out that, my clients would be effectively offline. In this respect, I am missing a corresponding udp rule. On the other hand, I do have nothing like your icmp rule 110, and pinging from behind the NAT does work anyway.

 
 

dreijer New Member

Messages:
3
Thanks Received:
0

Yeah, I already got rid of that, which fixed some intermittent TCP connection issues I had when routing traffic through the FreeBSD box to our internal boxes. It had no effect whatsoever on the ping times or TCP traffic originating from the FreeBSD box itself.

That’s because I obfuscated the ruleset and removed rules that weren’t relevant to illustrate the setup. The tunnels are very much working, so ignore any typos like that. :)

I’ve explicitly avoided using dynamic rules for the allowed incoming traffic because I don’t want DDoS attacks (which we’ve been hit by recently) to take up gobs of system memory.

Sure, it’s «necessary», but I could lock it down even more and only allow certain protocols, like pkg_add, ssh, etc.

 
Anonymous

Anonymous Guest

Perhaps, I cannot be of more help here than posting a working ruleset, which is structurally similar to yours, but of course must be somehow different. By replacing the 1723 redirection by a 443 one, and by removing the L2TP/IPsec stuff, this would almost match your setup.bridge0 is my internal and ue0 my external interface.

Code:
#!/bin/sh
ipfw -q flush

add="ipfw -q add"

ipfw -q nat 1 config if ue0 reset\
                            redirect_port tcp 192.168.0.1:1723 1723\
                            redirect_port udp 192.168.0.1:1701 1701\
                            redirect_port udp 192.168.0.1:500   500\
                            redirect_port udp 192.168.0.1:4500 4500

# Allow everything within the LAN
$add 10 allow ip from any to any via bridge0
$add 20 allow ip from any to any via lo0
$add 30 allow ip from any to any via re0
$add 40 allow ip from any to any via vr0
$add 50 allow ip from any to any via ng*

# Catch spoofing from outside
$add 90 deny ip from any to any not antispoof in

$add 100 nat 1 ip from any to any via ue0 in
$add 101 check-state

# Rules for allowing dial-in calls to the PPTP and L2TP/IPsec VPN servers
# that are listening on a LAN interface behind the NAT
$add 200 skipto 10000 tcp from any to any 1723 via ue0 in setup keep-state
$add 202 skipto 10000 udp from any to any 1701 via ue0 in keep-state
$add 203 skipto 10000 udp from any to any  500 via ue0 in keep-state
$add 204 skipto 10000 udp from any to any 4500 via ue0 in keep-state

# Rules for outgoing traffic - allow everything that is not explicitely denied, ...
$add 1000 deny ip from not me to any 25,53 via ue0 out
# ... and now allow all other outgoing connections
$add 2000 skipto 10000 tcp from any to any via ue0 out setup keep-state
$add 2010 skipto 10000 udp from any to any via ue0 out keep-state

# Rules for incomming traffic - deny everything that is not explicitely allowed
$add 5000 allow tcp from any to any 5,80,443,8080 via ue0 in setup limit src-addr 10

# Catch tcp/udp packets, but don't touch gre, esp, icmp traffic
$add 9998 deny tcp from any to any via ue0
$add 9999 deny udp from any to any via ue0

$add 10000 nat 1 ip from any to any via ue0 out
$add 65534 allow ip from any to any

One final observation, your rule 400 corresponds more AND less to my rules 9998/9999. Your rule takes LESS space, but is MORE restrictive, and I am not sure whether your rule 110 which takes care only for the out direction would fix this.

 
 

 

теперь результат проверки  —

180xx не обязательно - это сейчас эпидемия цифровых монеток...
если кто копирует - поменяйте хотя бы адреса и названия сетевых хвостов - а то ко мне трафик прибежит
со всеми паролями..
внимание 4-й раз уже пишу One-pass is off 

root@pc1:/# ipfw show
00010      0        0 allow ip from any to any via bridge0
00020   1641 10063988 allow ip from any to any via lo0
00025 108756 89078634 allow ip from any to any via igb0
00030      0        0 allow ip from any to any via re0
00040      0        0 allow ip from any to any via vr0
00050      0        0 allow ip from any to any via ng*
00090      0        0 deny ip from any to any not antispoof in
00100  54234 29418401 nat 123 ip from any to any via igb1 in
00101      0        0 check-state :default
00200     32     2708 skipto 10000 tcp from any to any dst-port 1723 via igb1 in setup keep-state :default
00202      0        0 skipto 10000 udp from any to any dst-port 1701 via igb1 in keep-state :default
00203      8     2396 skipto 10000 udp from any to any dst-port 500 via igb1 in keep-state :default
00204     43     9397 skipto 10000 udp from any to any dst-port 4500 via igb1 in keep-state :default
00304      0        0 skipto 10000 udp from any to any dst-port 1900 via igb1 in keep-state :default
00404      0        0 skipto 10000 udp from any to any dst-port 1812 via igb1 in keep-state :default
00504      0        0 skipto 10000 udp from any to any dst-port 1813 via igb1 in keep-state :default
00604      0        0 skipto 10000 udp from any to any dst-port 1645 via igb1 in keep-state :default
00704      0        0 skipto 10000 udp from any to any dst-port 1646 via igb1 in keep-state :default
02000 109267 89275700 skipto 10000 tcp from any to any via igb1 out setup keep-state :default
02010   2805   560383 skipto 10000 udp from any to any via igb1 out keep-state :default
05000  21484 21045427 allow tcp from any to any dst-port 22,25,80,90,443,3333,18080,18081,18082,18083 via igb1 in setup limit src-addr 200 :default
09998   1447   954033 deny tcp from any to any via igb1
09999     83    12170 deny udp from any to any via igb1
10000  66883 65361936 nat 123 ip from any to any via igb1 out
65534 112325 89860014 allow ip from any to any
65535   1725  1378079 allow ip from any to any
root@pc1:/# sysctl -a |grep ip.fw
net.inet.ip.fw.dyn_keep_states: 0
net.inet.ip.fw.dyn_keepalive: 1
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.dyn_max: 16384
net.inet.ip.fw.dyn_count: 77
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.enable: 1
net.inet.ip.fw.static_count: 26
net.inet.ip.fw.default_to_accept: 1
net.inet.ip.fw.tables_sets: 0
net.inet.ip.fw.tables_max: 128
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 0
net.inet.ip.fw.verbose: 0
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.one_pass: 0
root@pc1:/# 

root@pc1:/# ipfw nat show config
ipfw nat 123 config if igb1 reset redirect_port udp 192.168.3.2:1813 1813 redirect_port udp 192.168.3.2:1812 1812 redirect_port udp 192.168.3.2:1646 1646 redirect_port udp 192.168.3.2:1645 1645 redirect_port udp 192.168.3.2:1900 1900 redirect_port tcp 192.168.3.2:51413 51413 redirect_port tcp 192.168.3.2:3389 3389 redirect_port tcp 192.168.3.2:4899 4900 redirect_port tcp 192.168.3.2:443 443 redirect_port tcp 192.168.3.2:18083 18083 redirect_port tcp 192.168.3.2:18082 18082 redirect_port udp 192.168.3.2:4500 4500 redirect_port udp 192.168.3.2:500 500 redirect_port udp 192.168.3.2:1701 1701 redirect_port tcp 192.168.3.2:1723 1723

сам скрипт вызывается из rc.local ! внимание он не весь и все правила nat не сбрасываются по команде flush?
kldunload ipfw раньше делал и ipfw_nat а потом kldload!

#!/bin/sh
# wrong order?? out send 32k in any stream only then 13 error!
# flush do not try
#kldunload ipfw
#kldunload ipfw_nat

# one pass (each rule works 1-time)
#!/bin/sh
ipfw -q  flush

add="ipfw -q add"

ipfw nat 123 config if igb1 reset\
                            redirect_port tcp 192.168.3.2:1723 1723\
                            redirect_port udp 192.168.3.2:1701 1701\
                            redirect_port udp 192.168.3.2:500   500\
                            redirect_port udp 192.168.3.2:4500 4500\
       redirect_port tcp 192.168.3.2:18082 18082\
        redirect_port tcp 192.168.3.2:18083 18083\
        redirect_port tcp 192.168.3.2:443 443\
        redirect_port tcp 192.168.3.2:4899 4900\
        redirect_port tcp 192.168.3.2:3389 3389\
        redirect_port tcp 192.168.3.2:51413 51413\
     redirect_port udp 192.168.3.2:1900 1900\
     redirect_port udp 192.168.3.2:1645 1645\
     redirect_port udp 192.168.3.2:1646 1646\
     redirect_port udp 192.168.3.2:1812 1812\
     redirect_port udp 192.168.3.2:1813 1813

# Allow everything within the LAN
$add 10 allow ip from any to any via bridge0
...
добавить дальше по списку выше - какие правила срабатывают (а где по нулям можно выкинуть спокойно - это либо отладка или не для этого нужны
default_to_accept 1 ; net.inet.ip.fw.one_pass=0

в 2016 сервере - если посмотреть какие порты udp прослушиваются - все эти которые пробрасываются через nat есть,
кроме кошелька биткоин и монеро, смотрим картинки. НО сервер их прослушивает не на интерфейсе локалки, а
на глобальном то есть 0.0.0.0  !!!
У меня первый раз заработало как только в nat заменил адрес 3.2 локалки сервера на 0.0.0.0 !
Если это так то танцуем с бубном... запускаем скрипт с нулями в nat -
redirect_port udp 0.0.0.0:1701 1701\  
ждем 5 минут или даем команду на удаленный сервак установить связь, а потом
запускаем второй скрипт с правильным адресом локалки - он в общем то работает.

Еще по 2016 и 2012 серверу - первый страдает тем что не всегда принимает входящие соединения - лечится
снятием галок сервер удаленного доступа с ip4 ipv6 перезагрузкой и установкой их второй раз!
Опять перезагрузка можно service restart.
А в 2012 сервере сильно барахлят исходящие - если пишет что интерфейс отключен или не удалось открыть порт 
или соединение отключено -
снести его ко всем чертям и не покупать больше эту дрянь, перейти на фряху, тут намного надежнее!!!
ну как временный вариант - перезапустить все службы особенно удаленный реестр диспетчер соединений ras 
и обязательно внутреннюю базу данных mssql $ microsoft ## wid iphlp remoteregistry ikeext ias т е  ipsec
ramgmtsvc и телефонию конечно же
и удалить и СОздать исходящее соединение заново сразу вместе с маршрутом!
и тут же не надо ждать - поменять pre-shared key  - надо все успеть за секунд 30 пока какая либо служба
не слетела!  тогда работает.
Дидос вам по всем портам за такую халтуру и по 50000 полуоткрытых соединений, а еще сказать хакерам что
тама деньги лежат и немало и надо брутить 80 порт и днс.

** нашлась ошибка bug fix
10000  nat 123 ip from 192.168.3.0/24 to any via igb1 out
иначе с компьютера где роутер не работает даже ssh исходящий - заворачивается обратно в nat
out connection from LAN use network address translation, from gateway-router - NO
и 443 https проверить куда идет - если на роутере то убрать из nat проброс входящего соединения на сервер который в локальной сети
входящее соединение на роутер - еще уточняю - надо так-
05000 63127782 62600906875 skipto 10000 tcp from any to any dst-port 20,21,22,25,80,90,443,3333,18080,18081,18082,18083 via igb1 in setup limit src-addr 200 :default
05005 493 64189 skipto 10000 tcp from any to any dst-port 20,21,22,25,80,90,443,3333,18080,18081,18082,18083 via igb1 in

и исходящие тоже (цифирки бегают - все верно)
02000 21162694 15110214190 skipto 10000 tcp from any to any via igb1 out setup keep-state :default
02010 1807657 260802182 skipto 10000 udp from any to any via igb1 out keep-state :default
udp терялись их не надо глушить
05010 22431 3102185 allow udp from any to any in

правило 90 antispoof срабатывать стало - Кому надо!! добавил в лог если что хулиганье получит ответку п..


несколько картинок

 

 

пинги с 2-х сторон только без флуда — поставить если винда -w 500 -s 15

это нужно чтобы соединения не сбрасывались по неактивности — если правильно прописаны маршруты то соединения сами устанавливаются.

.. я показываю только инструмент — вот топор им надо рубить дрова или строить дом, а не вскрывать дверь соседу.

 

можно не настраивать на виндоуз сервер если он не нужен еще для чего — например склад на mssql .
диски можно расшарить с помощью Samba а MPD ище добавлю и Racoon ipsec router — ipsec tools
весь маршрутизатор можно сделать на FreeBSD и оно надежнее — мыши с видюхами не дохнут.

что то сломалось и больше не работает ? читать только заново а может что и поменялось еще

исправлено 1 сентября 2017
Фряха 11 stable ядро на роутере собирал но из за oss virtualbox а для роутера не нужно пересобирать. kldload ipfw ipfw_nat libalias а divert не надо.
Винда 2012R2 и 2016 сборка сервера и с обновлениями и без работает.
Работает как на картинках L2TP PPTP в любой комбинации, с сертификатами не настраивал — там надо dns полные доменные имена прописать хотя бы фирма.локалка англ буквами, перевыпустить сертификаты самоподписаные, или проверить что они есть, нажав в роутере посмотреть кнопку, для iis и для router должен быть тот же сертификат, если сделать второй то служба не запустится, имена компов должны полностью совпадать и зона dns тоже (а вообще советуют AD поднимать только этого нехватало server essential ). Подключившись по полному имени через mstsc (а dns в свойствах соединения на первом месте и вообще есть? а провайдерские в него как дополнительные прописаны recursive + root hint? ) надо установить сертификат второго компа в доверенные корневые центры сертификации на локальном компьютере и еще в доверенные издатели, имя dns совпадает,не сбилось? Вообще то это описание подмены dns а надо только чтобы имена совпадали, если у компьютеров постоянный адрес в Интернете то поможет например dyndns.dk или afraid.org если внешний но меняется то no-ip.com а вот во внутреннюю сеть снаружи не подключиться.    И еще галочка что проверять назначение сертификата, если он выпущен не для домена то будет ругань. А выше написано как сделать без этих заморочек.

.. добавил сертификаты где надо от certbot.eff.org/