добавлено l2tp psk – еще чуть побыстрее работает 12-2017
связанная статья https://yahobby.ru/wordpress/tunnel-vpn-site-to-site-link/
еще pfsense
ipfw freebsd #FreeBSD настройка примеры Unix Linux развести интернет по всем компьютерам и связать магазин склад и офис !
пример рабочего конфига для маршрутизатора роутера на FreeBSD для выхода в Интернет в малом офисе а также соединения с точкой продаж магазином где 3 терминала в сети и сервер
(напоминаю что если сервер настраивается удаленный то убедитесь что скрипт ipfw правильный и выполнится без ошибок иначе на сервер больше не соединитесь никак – firewall заблокирует всю сеть вообще – после его загрузки или команды flush включается только последнее по списку правило 65535 запрещающее прохождение всех пакетов по сети. И что загрузка системы дойдет до rc.local без вопросов перед этими изменениями например не монтируются недоступные диски или сетевые накопители через etc fstab ).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# 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:~ #</pre> # добавлен GRE протокол он вообще то отлавливается ipfw отдельно хоть на низком уровне встроен в tcp ip - спрятан внутри пакета tcp-ip (encapsulated). <pre class="prettyprint lang-sh" data-start-line="1" data-visibility="hidden" data-highlight="" data-caption="">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 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#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 |
а так более правильно бо сервер выделяет протокол gre 47 из ip и его пакеты подсчитываются (в примере выше нули)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# 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:/# |
вот вся отладка (правило 105 убрать – пакеты gre не проходят куда нужно – достаточно 100 правила – т.к. пакет GRE
находится внутри TCP -но ipfw умеет их различать и считает если выводить ipfw show)
правило 600 нужно – иначе входящий трафик на 1723 проходит но не получает ответ! но его надо уточнять!
как – пробую сейчас.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
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</pre> побольше правил ipsec l2tp-psk // ikev2 not work! 2012 server or 2016 // сервер за роутером psk это pre-shared key - вместо сертификата задается строка пароля одинаковая на компьютере и на сервере, на 2012 r2 и на 2016 сервере работает! шифрование достаточное а ключ можно раз в неделю менять. <pre class="prettyprint lang-ini" data-start-line="1" data-visibility="visible" data-highlight="" data-caption="ipfw script router + vpn">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 то пакет будут принят создаться запись в нате и пакет дальше по правилам фаера не пойдет. |
# читаем внимательно – как получается электронщики продавали схемы и платы да у нас на рынке который потом в Митино переехал – парочку дорожек замкнуто на питание и землю а в описании надо убрать 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/
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 New Member
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…
Anonymous 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.
теперь результат проверки –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
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/
FreeBSD server desktop + wine + internet workstation virus free _ bitminer Cryptonight virtualbox + windows + Linux ubuntu — one Xeon processor ” 29xx 48 284G 700ssd _2x3TB hdd” .
добавил еще пример конфигурации (найдено..) а на 13 версии FreeBSD что то уточнять надо – поменялось.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
FreeBSD, ipfw nat и несколько провайдеров Aug. 5th, 2011 at 4:29 PM Несколько разных вариантов организации NAT в случае с несколькими провайдерами. ** не является последней версией Disclaimer: Автор не несет ответственности за результаты, возникшие в результате осмысления/применения текст данного поста. Приведенные ниже конфигурации не являются полными (не рассмотрены, например ситуации с DNS в случае нескольких провайдеров, варианты с несколькими fib'ами и аспекты переключения). Фактически, данный пост рассказывает о возможностях применения свежепоявившегося '''nat global'''. Это ограничивает область применения данных конфигураций более-менее свежим 8.2-STABLE и -CURRENT. Портировать на более старые версии не так сложно, при желании можно озвучить запрос в комментах. Варианты, от простого к сложному: Задача: есть 2 провайдера, надо организовать какое-то резервирование и немножко балансировки. Самое простое: N натов в N разных провайдеров, табличка в ipfw с сетями и номерами натов. Просто, понятно. Позволяет делать схемы с резервированием и ограниченной балансировкой Примерная реализация: ipfw nat 1 config ip ${isp1_addr} # ISP 1 ipfw nat 2 config ip ${isp2_addr} # ISP 2 # Табличка с соответствиями префиксов внутри сети с номерами натов ipfw table 1 add 172.16.1.7 1 ipfw table 1 add 172.16.1.0/24 2 # Транслируем пакетики, летящие наружу ipfw nat tablearg from 'table(1)' to not me out # Направляем отттранслированные пакеты нужному провайдеру ipfw fwd ${isp1_gw} ip4 from ${isp1_addr} to any out ipfw fwd ${isp2_gw} ip4 from ${isp2_addr} to any out # Транслируем пакеты, летящие на наши внешние адреса ipfw nat 1 from any to me recv ${isp1_iface} in ipfw nat 2 from any to me recv ${isp2_iface} in Работа ipfw fwd после применения ipfw nat требует выключения net.inet.ip.fw.one_pass для того, чтобы пакеты после трансляции попали обратно в ipfw Далеее - скриптуем доступность того или иного канала и в зависимости от этого переписываем дефолт/сети в табличке В случае, если к задаче добавляется необходимость организации проброса портов на внутренние сервисы, причем требуется доступность внутреннего сервиса со всех N (или хотя бы > 1) провайдеров, схема выше перестанет работать. Для решения необходимо либо ставить userland'ный редиректор (заплатив потерей исходных IP-адресов в логах и усложением администрирования), либо усложнять схему. Для этого потребуется Небольшой экскурс в особенности работы nat'а в ipfw В ipfw nat и ng_nat использует библиотека libalias(3). Она позволяет создать сколько угодно различных сущностей ната (пока хватает памяти, разумеется) с различными конфигурациями. Сам процесс конфигурации не представляет особого интереса, поэтому его можно опустить. Более интересно посмотреть на собственно трансляцию данных в пакетах: Сконфигуренному экземпляру ната необходимо передавать трафик посредством 2х функций: * LibAliasIn (как правило, трафик из мира на внешний адрес) * LibAliasOut (как правило, трафик от внутренних клиентов, которых нужно транслировать). Определение, какую из функций вызвать при получении пакета, ложится на пользователя libalias(3) (то есть, собственно ipfw_nat.c и ng_nat.c). ipfw nat эту задачу решает очень просто: если у пакета уже есть исходящий интерфейс (т.е. мы позваны на pfil-хуке out и выполнен routing lookup), то трафик передается LibAliasOut. В противном случае - LibAliasIn. Для пользователя системы это значит, что: * ipfw nat X ... out будет транслировать src ip-адреса/ прочие атрибуты протокола в сконфигурированный IP-адрес инстанса * ipfw nat X ... in будет транслировать dst ip-адреса/прочие атрибуты протокола в внутренний адрес (взятый из таблицы стейтов) В случае выставленного в инстансе флага reverse все происходит с точностью до наоборот * Для "хитрых" конфигураций (например, сочетание reverse и обычного ната) натить на адресах интерфейсов не получится, посколько .. out хук в каком-то из случаев не будет вызываться, т.к. пакет предназначен локальной системе Есть еще один нюанс, который нам понадобится. Указанные выше функции сначала пытаются найти существующий стейт в своих таблицах. В случае, если стейт не найден функции могут его либо создать (новое TCP-соединение наружу, новая попытка соединения на адрес redirect_port), либо проигнорировать (вернуть) пакет. Поведение зависит от переданного параметра create. По умолчанию (ipfw nat, ng_nat без дополнительных опций) - соединение разрешают, то есть создают стейт. Начиная с недавнего времени в ipfw nat появилась опция global (аналог natd globalport), которая перебирает все сконфигурированные инстансы ipfw nat, вызывая LibAliasIn/LibAliasOut с параметром create, равным 0. Таким образом, только если в одном из натов найдется стейт (т.е. пакет принадлежит какой-то существующей сессии) он оттранслируется. Таким образом, конфигурация с учетом новых требований может выглядеть примерно так: ipfw nat 1 config ip ${isp1_addr} # ISP 1 ipfw nat 2 config ip ${isp2_addr} # ISP 2 ipfw nat 10 redirect_port tcp 172.16.1.2:25 ${isp1_addr}:25 redirect_port tcp 172.16.1.2:25 ${isp2_addr}:25 # Табличка с соответствиями префиксов внутри сети с номерами натов ipfw table 1 add 172.16.1.7 1 ipfw table 1 add 172.16.1.0/24 2 ... # Делим для упрощения IN и OUT ipfw skipto 5000 from any to any out # Отдаем пакет на пробу нату-редиректору. если пакет не попадает ни на один проброс - # нат не будет его никуда транслировать ipfw nat 10 ip4 from any to me recv ${isp1_iface} ipfw nat 10 ip4 from any to me recv ${isp2_iface} # Отдаем пакет per-провайдер натам. Если провайдеров сильно больше двух # или же есть много внешних адресов, в которые нужно натить - # имеет смысл переписать на tag X, tagged X для интерфейсов и tablearg для каждого адреса ipfw nat 1 ip4 from any to me recv ${isp1_iface} ipfw nat 2 ip4 from any to me recv ${isp2_iface} ... (5000) # Направляем в нужный нат существующие трансляции. У оттранслированных пакетов меняется # src-адрес и в правила дальше они не попадают ipfw nat global ip4 from ${localnet} to not me # Транслируем пакетики, летящие наружу. Поскольку теперь есть global, то возможности балансировки # значительно расширились: можно балансировать по протоколам/портам, probability и прочему. # То есть, фактически, легко можно сделать per-session load balancing ipfw nat tablearg from 'table(1)' to not me # Направляем отттранслированные пакеты нужному провайдеру ipfw fwd ${isp1_gw} ip4 from ${isp1_addr} to any ipfw fwd ${isp2_gw} ip4 from ${isp2_addr} to any Следующая задача, которая в общем-то была бы сферической в вакууме, если бы не суровая чугунная реальность: Требуется обеспечить работоспособность этих редиректов внутри локальной сети. Проблема тут в следующем: Пусть есть адрес 172.16.1.42, который через 1.2.3.4:25 должен попадать на 172.16.1.2:25. Шаг 1 (TCP SYN от .42 прилетает на шлюз) 172.16.1.42:33456 -> 1.2.3.4:25 Шаг 2 (транслируем через 10й инстанс в redirect_port на input) 172.16.1.42:33456 -> 172.16.1.2:25 Шаг 3 (пакет далее не транслируется и убегает в локальную сеть искать 172.16.1.2) Шаг 4 (172.16.1.2 получает SYN-пакет, отвечает SYN+ACK на 172.16.1.42:33456.) 172.16.1.2:25 > 172.16.1.42:33456 Шаг 5 (172.16.1.42 отвечает RST, поскольку подобного соединения в TCP-стеке найти не может (src-адрес с т.з. 42 должен быть 1.2.3.4)) Таким образом, надо менять еще и адрес источника, то есть вводить еще один nat. То есть: перед редиректом сначала меняем адрес источника, затем отдаем пакет в нат с редиректами. Ответные пакеты разворачиваем наоборот. Из-за нюансов, описанных выше, для ната нам нужен будет еще 1 адрес, не висящий непосредственно на интерфейсе. Выбирать в общем-то можно любой приватный, не использующийся в сети (т.е. тот, трафик на который пойдет через наш маршрутизатор с натами). "Не висящий непосредственно на интерфейсе" нужно для корректной работы out-хука в ipfw nat (описано выше). Реализуется оно например через blackhole маршрут (аналог типичного приема с ''ip route 1.2.3.0/24 null0'' в quagga, когда нужно натить много разных клиентов в пул публичных адресов). Примерно так: route add 10.10.10.10 -blackhole -iface lo0 Рисуем, как оно должно выглядеть: # В квадратных скобочках - в каком хуке ipfw мы получаем соответствующий пакет # TCP SYN [IN] 172.16.1.42:33456 -> 1.2.3.4:25 # ipfw nat в позе reverse (то есть, натим пакет в внешний адрес, out hook) [IN] 10.10.10.10:54123 -> 1.2.3.4:25 # наш нат с пробросом портов (in hook) [IN] 10.10.10.10:54123 -> 172.16.1.2:25 Ответ: # TCP SYN+ACK [IN] 172.16.1.2:25 -> 10.10.10.10:54123 # Отдаем пакет нату с пробросом (put hook) [OUT] 1.2.3.4:25 -> 10.10.10.10:54123 # Отдаем пакет reverse nat'у (in hook) [OUT] 1.2.3.4:25 -> 172.16.1.42:33456 Смотрим теперь как это выглядит в правилах: ipfw nat 1 config ip ${isp1_addr} # ISP 1 ipfw nat 2 config ip 2.3.4.5 # ISP 2 ipfw nat 10 redirect_port tcp 172.16.1.2:25 ${isp1_addr}:25 redirect_port tcp 172.16.1.2:25 ${isp2_addr}:25 # skip_global позволяет избежать неприятных нюансов с nat global (global не проверяет этот инстанс), который вызывается раньше ipfw nat 11 config ip 10.10.10.10 reverse skip_global ipfw table 1 add 172.16.1.7 1 # Табличка с соответствиями префиксов внутри сети с номерами натов ipfw table 1 add 172.16.1.0/24 2 ... ipfw skipto 5000 from any to any out # Делим для упрощения IN и OUT # В данный нат нужно направлять только тот трафик, который относится к редиректам # Можно сделать это например, так: ipfw allow ip4 from ${localnet} to ${localnet} recv ${int_iface} ipfw nat 11 ip4 from ${localnet} to me recv ${int_iface} ipfw nat 10 ip4 from any to me recv ${isp1_iface} ipfw nat 10 ip4 from any to me recv ${isp2_iface} ipfw nat 1 ip4 from any to me recv ${isp1_iface} ipfw nat 2 ip4 from any to me recv ${isp2_iface} # Отправляем пакеты на наш виртуальный адрес порт редиректору ipfw nat 10 ip4 from ${localnet} to 10.10.10.10 recv ${int_iface} # Направляем их же дальше 2му нату ipfw nat 11 ip4 from any to 10.10.10.10 recv ${int_iface} ... (5000) # Направляем в нужный нат существующие трансляции. У оттранслированных пакетов меняется # src-адрес и в правила дальше они не попадают ipfw nat global ip4 from ${localnet} to not me ipfw nat tablearg from ${localnet} to not me # Направляем отттранслированные пакеты нужному провайдеру ipfw fwd ${isp1_gw} ip4 from ${isp1_addr} to any ipfw fwd ${isp2_gw} ip4 from ${isp2_addr} to any Немного о внутренностях libalias, для интересующихся: Многократно упоминаемый выше стейт (link в терминах libalias) состоит из: * src ip (внутренний ip-адрес) * dst ip (адрес из "мира") * alias ip (внешний ip-адрес, в который мы натим) * proxy ip (нынче не используется) * src port * dst port * alias port * proxy port * link type (протокол (TCP, UDP, ICMP, ...)) Некоторые поля в стейтах могут быть "масками" (wildcards). Так работает, например, redirect_port (мы не знаем ни dst ip, ни dst port при конфигурации) и ряд хелперов (alias_ftp, как минимум)<br> Сами стейты живут в 2х разных хеш-таблицах (для in и для out). Поиск выполняется следующим образом: * пакеты '''in''' хешируются по dst ip, dst port, link type * пакеты '''out''' хешируются по src ip, dst ip, src port, dst port, link type. Это позволяет "маскам" работать в случае redirect_port, поскольку src ip, src port не участвуют в хешировании пакета и нужный стейт (с redirect port) находится. redirect_proto таким образом работать не может, поскольку первый пакет может прилететь не снаружи, а изнутри. Для того, чтобы редирект все-таки работало, во всех функциях, транслирующих адреса "изнутри" "наружу" в случае неудачного поиска делается отдельный хитрый поиск с указанием только src ip, dst ip и протоколом (link type) для проверки существования redirect_address. Модули libalias: Сам по себе nat является достаточно тривиальной задачей: нужно уметь транслировать TCP/UDP (адреса/порты), ICMP (адреса + сообщения об ошибках, которые надо матчить в существующие сессии), прочие протоколы (только адреса). Это все делается на L4 по более-менее фиксированным смещениям. Тем не менее, существует достаточное количесво не nat-friendly протоколов, с которыми тоже желательно что-то уметь делать. Классические примеры: FTP, SIP Здесь нужен (по возможности) полноценный разбор L7, причем в ядре. Libalias предоставляет достаточно удобные инструменты: * модульный интерфейс Здесь можно зарегистрироваться, указать, какой протокол/протоколы нас интересуют и передать ссылки на функции: быстрого матчинга и собственно транслятора * своя пересобиралка пакетов В процессе изменения пакета у него может поменяться длина, что подразумевает необходимость исправлять TCP seq на протяжении всей сессии. Libalias делает это за нас. * Создание wildcads-стейтов. Здесь возможности очень сильно ограничены хешом на out-хуке, поэтому в ряде модулей приходится либо полагаться на удачу (то, что FTP-сервер будет использовать FTP-DATA порт в случае активного FTP), либо выставлять для конфигурации модуля отдельные функции (номер порта в SCCP) В целом, тем не менее, достаточно удобно. Tags: freebsd, ipfw, nat 17 comments Leave a comment ShareFlagLink Comments ( 17 comments — Leave a comment ) dadv Aug. 5th, 2011 02:18 pm (UTC) s/2.3.4.5/${isp2_addr} / s/ // s/"Фактически" второй раз// rm этот пост :-) Link | Reply | Thread | birdofluck Aug. 5th, 2011 03:35 pm (UTC) гм, зачем rm? Link | Reply | Parent | Thread | dadv Aug. 6th, 2011 06:03 pm (UTC) Потому что он больше никому не интересен. Link | Reply | Parent | Thread | birdofluck Aug. 6th, 2011 06:05 pm (UTC) Так мы все же про _пост_ или про _коммент_ ? :) Link | Reply | Parent | Thread | dadv Aug. 6th, 2011 06:31 pm (UTC) Про коммент, конечно. Он тоже пост :-) Link | Reply | Parent | Thread | birdofluck Aug. 6th, 2011 07:28 pm (UTC) Ага :) Ты обещал по существу покомментить, кстати Link | Reply | Parent | Thread | dadv Aug. 6th, 2011 07:33 pm (UTC) А ты оказался более исчерпывающь, чем я думал :-) Дальше дополнять смысла нет, дальше только полностью переписывать в более академическом стиле с охватом бОльшего количества смежных тем - скрипты для пингования, распространение информации о живости провайдера по внутренней сети путем переписывания ip route с redistribute static и прочие сильно advanced topics, а это уже не формат коммента. Link | Reply | Parent | Thread | birdofluck Aug. 7th, 2011 08:33 am (UTC) Вообще, нат в хитрых позах - больше [small] office specific. Не надо людей пугать еще IGP с редистрибуцией :) А вот про смежные темы можно было бы и понаписать, например про определение живости. Я потом допишу еще и тему про DNS, а потом это все можно будет скомпилировать, описать более подробно и выложить куда-нибудь. Возможно - перевести и дополнить handbook Link | Reply | Parent | Thread | dionisiy_drev Aug. 18th, 2012 02:18 pm (UTC) скажу честно, довольно долго не могу настроить двух провайдеров, в части проброса портов. перепробовал многие варианты и с pf и setfib и разными прокси. Мне нужно добиться как в linux snat dnat, тут почему-то большая проблема, прямая реализация только у pf и natd Edited at 2012-08-18 02:21 pm (UTC) Link | Reply | Thread | birdofluck Aug. 18th, 2012 03:51 pm (UTC) А вопрос в чем? :) Link | Reply | Parent | Thread | dionisiy_drev Aug. 19th, 2012 09:28 am (UTC) Если не получится обязательно задам, а так два провайдера, две физические сетевухи (одна с бридж АДСЛ модем, другая оптика с конвертера) + две физические для локальной сети. Сначала делал через алиасы в том числе и для провайдеров, потом еще две сетевухи добавил (точнее одну с двумя портами, low profile). До балансировки даже не доходил, т.к. перенаправление мне мозги уже вынесло. Надо перенаправлять фтп, рдп ну и еще. Т.к. шлюз в винде указан один, тут остается только в разные подсети выносить каждого провайдера, но тогда балансировка обламывается, вроде как. Короче я Вашу схему еще не пробовал с global, revers и т.д. Link | Reply | Parent | Thread | dionisiy_drev Aug. 20th, 2012 02:43 am (UTC) ipfw nat global это по всем натам шерстит? а где его config? откуда он знает что там переписывать Link | Reply | Thread | dadv Nov. 26th, 2012 01:16 pm (UTC) ему не требуется config, он знает что переписывать по текущим таблицам трансляции рабочих инстансов. Link | Reply | Parent | Thread | Дмитрий Митько Nov. 26th, 2012 01:20 pm (UTC) ошибочка " net.inet.ip.fw_one_pass" net.inet.ip.fw.one_pass Link | Reply | Thread | birdofluck Nov. 26th, 2012 01:23 pm (UTC) Re: ошибочка Поправил, спасибо. Link | Reply | Parent | Thread | stalkernova Dec. 21st, 2012 12:33 am (UTC) А можно выложить полную рабочую версию конечного конфига? А то наличие многоточия и skipto 5000 немного запутывет. Link | Reply | Thread | Сергей Баранов Jul. 11th, 2016 09:32 am (UTC) Спасибо за статью Спасибо за статью, прочитал в целом касаемо nat global все встало на свои места. У меня остался вопрос безопасности по второму примеру (да и думаю к третьему он будет иместо быть): Снаружи мы закрываемся deny_in ipfw nat 1 config ip ${isp1_addr} reset same_ports deny_in # ISP 1 А в каком месте лучше разместить контроль исходящих пакетов, например разрешить пользователям только pop3,smtp выход? Логически просится в блоке [IN] до 5000 блока, сразу после ipfw nat 2 ip4 from any to me recv ${isp2_iface} Link | Reply | Thread | ( 17 comments — Leave a comment ) |
на pfsense переход – та же freebsd только поудобнее настойка -взял из нее только Openvpn там где 2 сервера по общему ключу соединяются – это совмещается с маршрутизатором ipfw
How to Install Midnight Commander MC on PfSense 2.4.5
snippets, Tools / freebsd, mc, pfsense / By Vadim.t0rik 1.7 (7)
Sometimes you want to install some package that FreeBSD has, but pfSense does not (for example: mc).
Connect via SSH to the server, enter:
1 |
pkg install mc |
and we read the abuse, from which it follows that the repository is not connected
1 2 3 4 5 6 7 |
[2.4.5-RELEASE][admin@gate]/usr/local/etc/pkg/repos: pkg install mc Updating pfSense-core repository catalogue... pfSense-core repository is up to date. Updating pfSense repository catalogue... pfSense repository is up to date. All repositories are up to date. pkg: No packages available to install matching 'mc' have been found in the repositories |
The developers of the distribution believe that installing from the FreeBSD repositories can harm the system in one way or another (for example, pull in inappropriate versions of packages as dependencies).
But if you continue to persist in your desire (like me, for example), then you can do the following:
1 |
ee /usr/local/etc/pkg/repos/pfSense.conf |
First line:
1 |
FreeBSD: { enabled: no } |
change to:
1 |
FreeBSD: { enabled: yes } |
Save file, then run:
1 |
pkg update |
The install MC:
1 |
pkg install mc |
and use:
#SHELL=/bin/csh mc
Similar Posts:
1,475
How useful was this post?