Nu ska vi sätta upp en brandvägg som min chef lärde mig göra, jag kallar dom transparenta brandväggar men jag vet inte om det är deras riktiga namn för jag vet inte vem som först kom på metoden. Jag kallar dom transparenta för att dom blir som en del av nätverkskabeln, dom har inga ip-nummer och måste administreras med en seriell kabel så dom är nästan som switchar som kan manipulera trafik på alla möjliga sätt. I denna artikel heter det första nätverkskortet fxp0 och det andra heter fxp1 så att ni förstår alla exempel. Vi sätter aldrig några ip-nummer på maskinen så all administration sker antingen lokalt i början eller genom den seriella kabeln när vi väl har fixat det. Jag har gjort detta med FreeBSD 4.11 så jag vet inte om namn på vissa värden i rc.conf eller sysctl har ändrats. Ni behöver veta hur man kompilerar en FreeBSD kärna och det kan ni läsa om i en av mina äldre artiklar.
Jag kommer också ta upp lite om hur man aktiverar bryggning i OpenBSD, det är ju själva bryggan som är speciellt, resten får ni ta reda på själva för det orkar inte vi. Tack till Hex29A som tog reda på hur man gjorde i OpenBSD, jag sa till han att jag skulle ta reda på hur man gjorde i NetBSD också men vi får se, just nu har denna artikeln tagit för lång tid att få klart så jag kanske lägger till det senare.
Måste bara påpeka att detta är min metod för att konfigurera en transparent brandvägg, om någon har en bättre metod eller ett hack på min metod så får dom gärna kontakta mig och tala om det. Som vanligt måste jag också säga att alla ip-nummer i artikeln är påhittade, varken jag, swehack eller någon annan kan hållas ansvariga för vad NI gör med ERA maskiner bla bla bla, nu fortsätter vi.
OpenBSD/NetBSD
###OBS###############OpenBSD/NetBSD###############OBS###
Vi börjar med OpenBSD och NetBSD. I OpenBSD och NetBSD är det otroligt enkelt eftersom stöd redan finns kompilerat i kärnan. Först öppnar ni konfigurationsfilen för varje kort, alltså /etc/ifconfig.fxp0 och /etc/ifconfig.fxp1, i båda filerna sätter ni endast en rad.
% more /etc/ifconfig.fxp0 up
Det ser konstigt ut och tro mig jag tycker det är konstigt men så är det. Nu öppnar ni bryggans konfigurationsfil som är /etc/bridgename.bridge0, där sätter vi följande text.
% more /etc/bridgename.bridge0 add fxp0 add fxp1 up
Nu när bryggan är skapad så behöver man bara aktivera PF med PF=YES i /etc/rc.conf men vi går inte in mer på PF för det är en hel guide i sig. Här har ni ett litet exempel på en pf.conf fil som Hex29A hämtade från openbsd.org.
% more /etc/pf.conf
# Tillåt allt genom fxp0
pass in quick on fxp0 all
pass out quick on fxp0 all
#blockera på fxp1 och tillåt webb & ssh-trafik in
block in on fxp1 all
block out on fxp1 all
pass in quick on fxp1 proto tcp from any to any port {22, 80} \
flags S/SA keep stateDetta skapar regler för ssh och webb.
###OBS###############OpenBSD/NetBSD###############OBS###
Nu fortsätter vi med FreeBSD
Först ska vi konfigurera en ny kärna, vi börjar med det viktigaste. Sätt in options BRIDGE som kommer göra att kärnan kan brygga nätverkskorten, alltså använda korten som en sorts väg för paketen genom eran maskin, paket kan då tas emot av ett kort och skickas vidare av det andra. På vägen passerar paketen kärnan som vi ska utrusta med ipfw så att vi kan kontrollera alla paket. Sen
options BRIDGE # bryggar paket mellan nätverkskorten options DUMMYNET # trafik formare som används för att begränsa bandbredd options IPFIREWALL # stöd för brandvägg i kärnan options IPFIREWALL_VERBOSE # logga till syslogd options IPFIREWALL_FORWARD # transparent proxy stöd options IPFIREWALL_VERBOSE_LIMIT=100 # begränsa loggnings nivån options IPFIREWALL_DEFAULT_TO_ALLOW # släpp in allt som standard options IPDIVERT # rikta om sockets options TCP_DROP_SYNFIN # släpper syn paket och stoppar mot vissa dos attacker options RANDOM_IP_ID # slumpar ID fältet på paket
Om ni vill bygga regler från grunden så kan ni kommentera IPFIREWALL_DEFAULT_TO_ALLOW eftersom det kommer göra så att ipfw som standard släpper igenom allt. Detta är bättre än vad det låter i stora nätverk eftersom ni annars kommer få sitta i flera dagar och bygga regler bara för att saker ska fungera. Ni behöver inte heller dummynet om ni inte ska begränsa bandbredd.
Vi följer här ett paket som går IN i ert nätverk genom fxp0, som ni kan se nedan i regelfilen har jag märkt fxp0 som kortet utåt. Direkt efter fxp0 så kommer paketet till kärnan, ip-stack, ipfw och dummynet är allt en del av kärnan. Bandbreddsbegränsningen fungerar så att dummynet sätter paket i kö det antal mikrosekunder som behövs för att fördröja paketet så att man får känslan av bandbreddsbegränsning, så alla paket går igenom men dom får vänta i kö. Detta låter som en extremt krävande metod men faktum är att jag har sett gamla 486:or med inte mer än 128Mb i ram ha flera regler på en 100Mbit fiber anslutning. Jag har också sett dom sitta utanför gateways och routrar där transparenta brandväggar visar sin finaste funktion. När man tänker efter är dom inte så märkvärdiga, det säljs switchar med samma funktioner och som alla vet så fungerar en switch på ett sådant sätt att den kan sitta utanför routing tabeller, utan ip-nummer osv. Så egentligen bygger vi en egen layer 4 switch.
Vill ni ha lite statistik över eran nätverkstrafik så kan ni köra igång snmpd på maskinen, snmp är extremt enkelt att konfigurera och kräver egentligen endast två rader för att fungera. Stoppa in raderna nedan i en konfigurations fil, jag brukar sätta den i /etc/snmpd.conf. Sen skriver man bara snmpd -Cc /etc/snmpd.conf så startas snmpd och ni kan börja samla in data från maskinens nätverkskort och få fina grafer av er bandbreddsanvädning.
% more /etc/snmpd.conf rouser public rocommunity public statistik.swehack.se disk /usr/home
Som ni ser så är där en rad mer och det är för att mäta diskanvädning på partitionen monterad på /usr/home, så enkelt gör ni alltså det, resten som tex cpu, minnesanvändning och så klart nättrafik kan ni mäta med de två första raderna. Först skapar ni en användare som har enbart läsrättigheter, rouser = read only user. Den användaren heter public men ni kan kalla den precis vad ni vill, detta ska man senare ange för att kunna läsa snmp informationen. Den andra raden skapar en grupp som också endast har läsrättigheter, denna gruppen ska helst ha samma namn som användaren annars finns det otroligt mycket möjligheter att ha flera olika användare och grupper precis som UNIX. I gruppen ser ni att jag har angett ett servernamn, detta är den enda maskinen som får läsa snmp informationen, detta är viktigt eftersom man kan få tag på känslig information genom snmp som inte alla vill dela ut.
När ni nu startar om eran maskin så har ni lite kvar att göra innan paketen faktiskt bryggas mellan korten. Ni har nu stöd i eran kärna för ethernet bryggning men för att aktivera det ska ni ställa in några sysctl värden. Lite snabbt om sysctl, skriver ni sysctl -a så ser ni alla sysctl värden och kan greppa efter de ni behöver. Med sysctl -w kan ni ställa in och ändra värden, skriver ni bara sysctl med ett värdes namn som argument så ser ni det värdet, skriver ni sysctl vardets.namn=0 så kan ni direkt ändra värdet utan att använda -w argumentet. Inte alla sysctl värden går att ändra medan kärnan är igång, vissa är read only och måste ändras i /boot/loader.conf medan resten kan ändras i sysctl.conf som läses in senare än loader.conf. De som måste ändras i loader.conf kräver ju självklart en omstart. Här har ni ett exempel på en sysctl.conf fil för en brandvägg som vi bygger.
% more /etc/sysctl.conf net.link.ether.bridge=1 net.link.ether.bridge_ipfw=1 net.link.ether.bridge_cfg=fxp0:0,fxp1:0
Detta aktiverar först bryggning, aktiverar stöd för det i ipfw och sen anger man vilka kort som man ska brygga mellan. Vad som är in och ut kvittar tekniskt sett eftersom paket skickas likadant åt båda hållen så det beror bara på vilket kort du sätter kablarna i, senare i reglerna kan vi ange variabler för in och ut bara för att hålla reda på det själva men för kärnan kvittar det.
Nu har ni tekniskt sett en färdig switch, nu ska vi konfigurera ipfw så att vi kan börja filtrera paket som skickas genom kärnan. Först aktiverar vi ipfw i rc.conf med följande rader.
firewall_enable="YES" firewall_script="/etc/ipfw.rules"
Som ni kanske ser så aktiverar detta först brandväggen, ipfw, och anger var regelfilen hittas. Vi väljer att döpa den till ipfw.rules och lägga den i /etc men det är helt upp till er. Nu ska jag visa er en regelfil och i kommentarer visar jag vad varje regel gör. I denna filen ser ni två variabler i toppen som anger vad era kort heter, ändrar ni bara dessa så kan ni använda denna filen rakt av. Detta är alltså bara en mall så ni ska helst inte använda den utan att ändra något i den eller lägga till era egna regler. Vi börjar filen med en shebang eftersom en regelfil inte är en riktig konfigurationsfil utan helt enkelt ett script som kör olika kommandon, detta betyder att allt som görs i regelfilen går att göra direkt på kommandoraden och det påverkar ipfw direkt. Ni kan också köra scriptet så fort ni vill uppdatera alla regler. Vill ni se alla aktiva regler så skriver ni ipfw show i terminalen, där ser ni också hur många paket som har behandlats av varje regel, kom ihåg att "allow all from any to any" också är en regel. Detta är bra för att testa och se om regler fungerar eller inte.
% more /etc/ipfw.rules
#!/bin/sh
# här anger vi sökvägen till ipfw kommandot och dess argument, läs mer i man ipfw
fwcmd="/sbin/ipfw -q"
# här flushar vi alla regler så att vi kan lägga in nya, detta är viktigt för att
# ipfw håller ordning på reglerna med unika idnummer och vi vill ju inte ha två
# regler med samma idnummer
${fwcmd} -f flush
# vi flushar också alla pipes, pipes skapar man för att kunna forma trafik
${fwcmd} -f pipe flush
# här kan ni ange era egna kort
in="fxp0"
out="fxp1"
# lite localhost regler, tillåt allt till och från localhost
${fwcmd} add check-state
${fwcmd} add allow all from any to any via lo0
${fwcmd} add allow all from any to 127.0.0.0/8
${fwcmd} add allow all from 127.0.0.0/8 to any
# detta är också bra mot vissa attacker, neka fragmenterade paket
${fwcmd} add deny all from any to any frag in via ${out}
# detta är en häftig sak som chefen gjorde för att få det att se ut som att vi ligger nere,
# det är inte bara därför, att begränsa trafiken för icmp är också bra vid attacker.
# som ni kan se så skapar vi en pipe och varje pipe som identifieras av ett unikt nummer
# kan styra flera ip-nummer, alltså ha mer än en regel, på det viset kan vi begränsa en pipe
# och påverka flera olika ip-nummer
${fwcmd} add pipe 1 icmp from any to 192.168.0.101 in via ${out}
${fwcmd} add pipe 1 icmp from any to 192.168.0.102 in via ${out}
${fwcmd} pipe 1 config bw 5Kbit/s delay 900ms plr 0.6
# här ser ni att vi begränsar pipe 1 till 5Kbit i sekunden och vi lägger in en delay på ping
# tiden till 900ms
# nu kommer vi till det häftiga, bandbreddsbegränsning, för detta måste man skapa
# för detta skapar vi då först en pipe som vi ger nästa unika idnummer, 2
# vi kan ange rakt av hur mycket bandbredd den ska ha
${fwcmd} pipe 2 config bw 8Mbit/s
# detta är en häftig grej som delar upp bandbredden i procent över två ip-nummer
# längre ner ser ni att vi skapar två queues och döper dom till 10 och 11
${fwcmd} queue 10 config pipe 2 weight 70 mask dst-ip 0xffffffff
${fwcmd} queue 11 config pipe 2 weight 30 mask dst-ip 0xffffffff
# ovan ser ni att vi delade upp bandbredden från pipen mellan dessa två queues,
# detta betyder att queue 10 får 70% av 8Mbit medan queue 11 får resten eller 30% av
# pipen som är begränsad till 8Mbit i sekunden
${fwcmd} add queue 10 all from 192.168.0.103 to any
${fwcmd} add queue 11 all from any to 192.168.0.103
# grejen med queues som använer weight är att om en av dom inte använder alla sina procent
# så kan den andra ta det som blir överSå, det var allt för nu, som alltid så reserverar jag mig för att göra ändringar och tillägg till artikeln, vilket jag självklart kommer att göra. Jag hoppas verkligen ni lärde er något trots att jag är så långt ifrån en lärare man kan komma så gjorde jag mitt bästa. Som sagt så ska ni självklart skicka in era synpunkter på artikeln till nocturnal [AT] swehack.se och var så ärliga ni kan för jag vill ju att så många som möjligt ska kunna lära sig av detta.