= Syn-3 firewall = Dit document gaat uit van voorkennis over netfilter/iptables. De firewall-code bevind zich in de SCC: source:trunk/npl/syn3/webint/src/firewall . (moeten we dit nog omzetten naar een bashscript zodat het open is?) De firewall zorgt voor firewalling NAAR de box zelf en voor forwarding DOOR de machine. Deze 2 verschillen moeten we nog opsplitsen bij de weergave in de SCC zodat dit duidelijker word voor de eindgebruiker. (zie ook #63) Bepaalde chains zijn vast (niet instelbaar/veranderbaar) en andere chains zijn dynamisch. (hier komen de instellingen van de user in). = Custom regels = De gebruiker kan speciale regels toevoegen in '''/etc/firewall/firewall.up'''. Dit is een bashscript wat aangeroepen word nadat de firewall 'gestart' is. Hierin kun je dus nog meer iptables commandos aanroepen. Er word ook gecontroleerd op exit codes. Er staan wat voorbeelden in het script. (vergeet de x-bit niet!) Enkele voorbeeld scripts voor geadvanceerde configuraties: * /etc/firewall/firewall.up.vlannat: Voor gebruik bij een transparante bridge op een VLAN-aware switch. = Algemene chains = Deze worden gebruik voor zowel forwarding als input. == Service groep chains == Voor iedere service-groep die de gebruiker aanmaakt word een apparte DROP en ACCEPT chain gemaakt. Deze chains worden weer aangeroepen vanuit andere chains om bepaalde servicegroepen in 1x te Accepten of Droppen. De servicegroep file ziet er ongeveer zo uit: {{{ [Syn-3] root@darkstar.example.net ~# cat /etc/firewall/services ,, /tcp,,(Al het TCP verkeer) /udp,,(Al het UDP verkeer) 389/tcp,,LDAP database 3128/tcp,,Proxy-server 25/tcp,Email verkeer,Mail bezorgen via SMTP 143/tcp,Email verkeer,Mail ophalen via IMAP 110/tcp,Email verkeer,Mail ophalen via POP3 993/tcp,Email verkeer,Mail ophalen via Secure IMAP (ssl) ...ingekort... /gre,Windows VPN verkeer,Generic routing encapsulation 1723/tcp,Windows VPN verkeer,PPTP control }}} De ''Email verkeer'' service groep ziet er dan als volgt uit in iptables -L -v: {{{ Chain AEmail_verkeer (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:993 Chain DEmail_verkeer (0 references) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:993 }}} De regels in deze chains matchen dus alleen op protocol en poort en hebben de naam van de servicegroep met een A (accept) of D (drop) ervoor. De chains worden aangeroepen door andere chains die al op andere dingen gefiltert hebben. Sommige van deze chains kunnen dus ook ongebruikt zijn. == Common chain == De common chain bevat algemene dingen die altijd van toepassing zijn. Dit is het droppen van packets met state INVALID en het doorlaten van RELATED en ESTABLISHED pakketjes. (gewoon droge statefull firewalling) Deze chain zorgt dus dat paketjes die bij reeds bestaande connecties horen er door kunnen. {{{ Chain common (2 references) pkts bytes target prot opt in out source destination 8 1408 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 1550 802K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED }}} = Firewalling '''van/naar''' de box = == Input chain == In deze '''vaste''' chain worden de pakketjes die naar de box zelf gaan gefirewalled. Deze chain heeft de volgende vaste regels: {{{ Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 174 13561 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 admins tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000 61 4076 admins tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 93 7168 input_deny all -- * * 0.0.0.0/0 0.0.0.0/0 93 7168 common all -- * * 0.0.0.0/0 0.0.0.0/0 20 2238 input_allow all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW }}} * Vanaf interface '''lo''' mag alles. * Verkeer naar poort 10000 en 22 gaat via de '''admins''' chain. Hierin staan de administrator IP's die dus nooit uitgefirewalled kunnen worden. * Het overgebleven verkeer gaat respectievelijk door de '''input_deny''', '''common''' en '''intput_allow''' chains. === Admins chain === Dit is een simpelle lijst met geaccepteerde ip adressen uit '''/etc/firewall/admins''': {{{ Chain admins (2 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 192.168.0.96 0.0.0.0/0 0 0 ACCEPT all -- * * 195.169.61.233 0.0.0.0/0 0 0 ACCEPT all -- * * 195.169.61.234 0.0.0.0/0 0 0 ACCEPT all -- * * 212.203.31.1 0.0.0.0/0 }}} === input_deny en input_allow === Dit zijn de chains waar de hoofd-beslissing gemaakt word om verkeer toe te laten of te blokkeren dat '''naar''' de firewall box zelf gaat. Deze ziet er ongeveer zo uit: {{{ Chain input_allow (1 references) pkts bytes target prot opt in out source destination 191 25152 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 AEmail_verkeer all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21 0 0 AInternet_verkeer all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 AIPSEC_verkeer all -- eth1 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 0 0 ANetwerk all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128 0 0 ASysteem_beheer all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 AVOIP all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 AWindows_networking all -- eth0 * 0.0.0.0/0 0.0.0.0/0 Chain input_deny (1 references) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5050 }}} Hier kan het volgende allemaal gebeuren: * Matchen op source adress. * Matchen op input interface. * Matchen op 1 specifieke destination protocollen/poorten. * Naar een A... of D... chain springen om daar verder te matchen op alle protocollen/poorten van een bepaalde serivce groep. * input_allow bevat alleen de regels die iets toegestaan. * input_deny bevat alleen de regels die iets blokkeren. '''Edwin: Voor vserver-firewalling moet hier nog op destination adres gematched kunnen worden! Zie #63.''' == Output chain == De output chain is op dit moment leeg en heeft een ACCEPT policy. Alles naar buiten toe mag dus. = Forwarding '''door''' de box = == Forward chain == Pakketjes die door de machine gerouteert moeten gaan allemaal door deze '''vaste''' chain. Deze ziet er zo uit: {{{ Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 common all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 forward_pat all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW 0 0 forward_deny all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 forward_allow all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW }}} * Alle pakketjes gaan door de bekende common chain word eerst aangeroepen om bestaande connecties in stand te houden. * Nieuwe connecties gaan door de forward_pat chain. * Alle pakketjes gaan door de forward_deny chain. * Nieuwe connecties gaan door de forward_allow chain. === forward_deny en forward_allow === Hier word de hoofd-beslissing gemaakt voor pakketjes '''door''' de box. {{{ Chain forward_allow (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- ipsec0 eth0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 AInternet_verkeer all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 Chain forward_deny (1 references) pkts bytes target prot opt in out source destination }}} Hier kan het volgende allemaal gebeuren: * Matchen op source adress. * Matchen op destination adress. * Matchen op input interface. * Matchen op output interface. * Matchen op 1 specifieke destination protocollen/poorten. * Naar een A... of D... chain springen om daar verder te matchen op alle protocollen/poorten van een bepaalde serivce groep. * forward_allow bevat alleen de regels die iets toegestaan. * forward_deny bevat alleen de regels die iets blokkeren. === forward_pat === Hier word de hoofd-beslissing gemaakt voor port-forwards '''door''' de box. Deze chain werkt samen met de nat-table om port forwards te kunnen maken. In de nat-table bepalen we waar naartoe ge-portforward word: {{{ [Syn-3] root@kantoor.datux.nl ~# iptables -t nat -L -v -n Chain PREROUTING (policy ACCEPT 2151M packets, 181G bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 1.2.3.4 192.168.101.250 tcp dpt:21 to:192.168.0.176:21 }}} En in de forward_pat chain (in de filter-table) vinden we de bijbehorende firewalling: {{{ Chain forward_pat (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 1.2.3.4 192.168.0.176 tcp dpt:21 }}} Merk opdat de destination het ge-natte adres bevat en niet de oorspronkelijke destination-adres. Een port-forward kan op dit moment alleen per protocol/port en niet voor hele service groepen.