Configurarea unui firewall simplu pentru ipfw și NAT via natd pe FreeBSD
Vom scrie în rc.conf parametrii rețelei de domiciliu și a rețelei noastre locale. vr0 - interfață externă (publică), vr2 - interfață internă conectată la rețeaua de domiciliu.
ifconfig_vr0 = "inet 123.123.123.123 netmask 255.255.255.0"
ifconfig_vr0_alias0 = "linkul 00: aa: aa: aa: aa: aa"
ifconfig_vr2 = "inet 192.168.12.254 netmask 255.255.255.0"
defaultrouter = "123.123.123.1"
Adăugăm următoarele linii la configurația kernelului nostru:
opțiuni IPFIREWALL
opțiuni IPFIREWALL_VERBOSE
opțiuni IPFIREWALL_VERBOSE_LIMIT = 100
opțiuni IPFIREWALL_FORWARD
opțiuni IPDIVERT
opțiuni DUMMYNET
Descrierea acestor opțiuni:
opțiuni IPFIREWALL_VERBOSE - Suport pentru scrierea pachetelor de trecere în fișierul jurnal, utilizând opțiunea jurnal din reguli și activarea jurnalului pentru pachetele din rc.conf sau prin intermediul variabilei sysctl.
opțiuni IPFIREWALL_VERBOSE_LIMIT = 100 - Indică numărul de pachete care vor fi scrise pentru a fi înregistrate pentru fiecare regulă. Valoarea implicită. Valoarea implicită poate fi înlocuită cu variabila sysctl - net.inet.ip.fw.verbose_limit. Pentru o anumită regulă, ipfw poate fi înlocuit cu ipfw log logount la o altă valoare dorită. De exemplu:
ipfw adăugați logul logului de 300 log de la oricare
opțiuni IPFIREWALL_FORWARD - Suport pentru redirecționarea pachetelor între interfețele de rețea.
opțiuni IPDIVERT - Suport pentru NAT și în special pentru natd.
opțiuni DUMMYNET - Susține limitatorul de viteză.
În plus, există un parametru
opțiuni IPFIREWALL_DEFAULT_TO_ACCEPT
Dacă nucleul este compilat cu această opțiune și paravanul de protecție este activat, regula implicită va fi:
permiteți ip-ului de la oricare altul
În caz contrar, regula implicită va fi:
respinge ip-ul de la oricare altul
Dacă serverul este configurat prin ssh - aceasta poate fi o plasă de siguranță pentru a activa această opțiune în kernel, compila kernel-ul, instalați, și apoi, după setarea ipfw și a obține o configurație de lucru - dezactivați această opțiune și recompilați kernel-ul din nou, de data aceasta fără să-l (pentru securitate).
Deci - colectăm nucleul:
cd / usr / src
facem buildkernel KERNCONF = MY_KERNEL
face kernel installKernel = MY_KERNEL
despre asamblarea nucleului - citiți secțiunea corespunzătoare a manualului.
Noi includem suport pentru firewall-ul din sistem și scriem un script simplu cu un stub
Pentru ca ipfw și natd să funcționeze, trebuie să faceți modificări în rc.conf, adăugând următoarele linii:
firewall_enable = "YES"
firewall_script = "/ etc / ipfw.rules"
firewall_logging = "YES"
gateway_enable = "DA"
natd_enable = "DA"
natd_interface = "vr0"
natd_flags = "- m"
firewall_enable = "YES" - activați firewall-ul propriu-zis. Dacă firewall-ul se află în kernel, acesta este pornit, altfel modulul este încărcat.
Atenție! Atunci când modulul este încărcat, o regulă implicită pentru a nega ip de la orice la orice, așa că, dacă ați activat în opțiunile kernel IPFIREWALL_DEFAULT_TO_ACCEPT, a uitat să instalați un nou kernel, și a permis firewall - în speranța unei reguli permite ip de la orice la orice - ar putea suferi frustrarea
firewall_script = "/ etc / ipfw.rules" - script-ul shell obișnuit care va fi lansat când firewall-ul începe - în teorie ar trebui să existe comenzile ipfw care vor descrie firewall-ul nostru. Acest stochka poate fi absent - atunci se execută scriptul implicit - /etc/rc.firewall.
firewall_logging = "YES" - Activează înregistrarea pachetelor care trec în jurnal. Cu condiția ca regula să specifice jurnalul de cuvinte cheie.
gateway_enable = "YES" - redirecționarea pachetelor între interfețe. Prezența acestei opțiuni în rc.conf setează valoarea sysctl a variabilei net.inet.ip.forwarding la 1 atunci când computerul pornește.
natd_enable = "DA" - Activați daemon NAT - natd.
natd_interface = "vr0" - Interfață externă pentru NAT. Interfața publică.
natd_flags = "- m" - Steaguri care sunt transmise la natd. Vedeți omul natd pentru detalii.
După ce ați făcut o opțiune în rc.conf - scrieți scriptul pentru un stub pentru firewall-ul nostru în fișierul /etc/ipfw.rules. Acest paravan de protecție va permite accesul de oriunde.
#! / bin / sh
# ipfw cmd
fwcmd = "/ sbin / ipfw"
$ -q -f flush
$ add permite ip de la orice la oricare
După aceea, repornim.
repornire
Dacă totul a fost făcut corect - atunci după repornire - noi
ne putem întoarce la mașina noastră de către ssh.
vom vedea în ieșirea ipfw show - regulile noastre (până acum o singură regulă și regula implicită)
Scrieți un firewall simplu
Regulile ipfw sunt executate după cum urmează: pachet transmis este verificat pentru respectarea normelor în ordinea în care acestea sunt situate, până când se întâlnesc este potrivit pentru el - și apoi executat pe un pachet de acțiune descris în regula.
Regulile ipfw sunt numerotate și este verificată prima regulă cu un număr mai mic, etc. După ce pachetul a căzut sub o anumită regulă, acesta cade din firewall.
Excepție - pachetele care intră în Deviere (cum ar fi NAT și prin natd), după operații pe ele pentru a le redirecționa înapoi în firewall, în următoarea regulă post-Deviere, și du-te în jos lista de reguli, până la o normă adecvată va fi îndeplinită.
Acest comportament poate fi schimbat, dar în acest articol voi omite detalii despre acest lucru. Sintaxa ipfw - omite, pentru a evita repetarea inutilă și dezordinea textului articolului. Vedeți omul ipfw, secțiunea corespunzătoare a manualului și legăturile de la sfârșitul articolului.
Mi-a plăcut următoarea metodă de depanare a unui paravan de protecție:
creați un fișier pentru testarea firewall-ului, de exemplu /etc/ipfw.rules.test.
faceți executabil. Adăugăm comenzi la acesta pentru a forma firewall-ul nostru.
dacă rezultatul ne satisface - atunci adăugăm conținutul firewall-ului testului la scriptul care va fi executat atunci când mașina este pornită. În caz contrar, modificați scriptul și repetați de la pasul 3.
Dacă am creat un fișier /etc/ipfw.rules.test firewall care ne-a blocat accesul de la distanță la mașină - aparatul trebuie să fie repornită, apoi cizme de la /etc/ipfw.rules firewall, care este sigur de a lucra.
Comenzi ipfw utile:
lista ipfw - prezintă o listă de reguli
ipfw arată de asemenea o listă de reguli, dar și numărul de pachete și octeți care se încadrează în aceste reguli. Foarte convenabil pentru depanare.
ipfw -d show - arată starea dinamică (păstrați starea).
ipfw zero - zeroarea tuturor contoarelor. Dacă păstrăm sub forma unei reguli ipfw zero #, atunci numai contorul de reguli cu acest număr va fi resetat.
Este logic să urmați această secvență de reguli:
De ce sunt necesare reguli permise pentru a scrie reguli pentru NAT? Pentru că dacă le scrieți înainte de NAT, atunci imediat ce o astfel de regulă se întâlnește, va fi executată și traficul va trece peste NAT, deoarece NAT este în continuare în listă. La mașinile pentru NAT această regulă de rezolvare va fi inutilă, adică va înceta să lucreze pentru ei. Dacă într-adevăr trebuie să limitați mașinile pentru NAT - este mai bine să o faceți în mod explicit decât într-un mod atât de complicat.
După depanare, am primit un astfel de firewall simplu:
#! / bin / sh
# ipfw cmd
fwcmd = "/ sbin / ipfw"
# Interface internă
iif = "vr2"
# Interfață externă
oif = "vr0"
# Adresa IP internă
iip = "192.168.78.254"
# Adresă IP externă
oip = "178.165.65.79"
# LAN internă
ilan = "192.168.78.0/24"
# Verificați regulile dinamice
$ add check-state
# Permiteți activității interne localhost
$ add permite ip de la orice la orice prin lo0
# nu permite site-ului localhost să trimită pachetele afară
$ add deny ip de la orice la 127.0.0.0/8
$ add deny ip de la 127.0.0.0/8 la orice
# Denegeți pachetele icmp fragmentate
$ add deny icmp de la orice la orice frag
• Dezactivați conexiunile la rețeaua internă din rețeaua externă.
$ add deny ip de la orice la $ in via $
• Dezactivați transmisia icmp pe interfața externă
$ adăugați deny log icmp de la orice la 255.255.255.255 în via $
$ adăugați deny log icmp de la orice la 255.255.255.255 out via $
# Nu NAT pentru rețeaua internă
$ add divert natd ip de la $ la orice out prin intermediul $
$ add divert natd ip de la orice la $ in via $
# Permite conexiunile stabilite
$ add permite tcp de la orice la orice stabilit
# Permiteți traficul de ieșire
$ add permite ip de la $ la orice out xmit $
# Permiteți difuzarea multiplă
$ add permite igmp de la orice la 224.0.0.0/8 în via $
$ add permite igmp de la orice la 239.0.0.0/8 in via $
$ add permite udp de la orice la 239.0.0.0/8 în via $
# Permiteți DNS
$ add permite udp de la orice 53 la orice prin $
# Permiteți NTP
$ add permite udp de la orice la orice 123 prin $
# Permiteți conexiunea SSH la server
$ add permite tcp de la orice la mine 22 în via $
# Permiteți conectarea HTTP la server
$ add permite tcp de la orice la mine 80 în via $
# Permiteți conectarea FTP la server
$ add permite tcp de la orice la mine 20,21,64000-64999 prin $
# Permiteți solicitarea ecmpon icmp, răspunsul ecou și expirați pachetul TTL
$ add permite icmp de la orice la orice icmptypes 0,8,11
# Permite conectarea din rețeaua locală
$ add permite ip de la orice la orice prin $
# Respingeți altă activitate
$ adăugați deny log logountul 10000 ip de la orice la oricare
De asemenea, probabil, următorii parametri sysctl vor fi interesați: firewall:
# sysctl -a | grep ip.fw
net.inet.ip.fw.static_count: 17
net.inet.ip.fw.default_to_accept: 0
net.inet.ip.fw.tables_max: 128
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 100
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.one_pass: 1
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: 4096
net.inet.ip.fw.dyn_count: 0
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.enable: 1
regulile de verificare și tcp de la oricare dintre cele stabilite la începutul firewall-ului pot ridica performanța, deoarece va verifica regulile dinamice și conexiunile stabilite la început, în urma căreia numărul de cecuri va scădea.