wiki:SynFirewall

Version 2 (modified by Edwin Eefting, 15 years ago) (diff)

--

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.