Je kan je pakket filter vorm geven door regels toe te voegen aan reeksen. Zulke reeksen (chains in het Engels) worden regel voor regel nagelopen om te kijken of er een regel is voor het huidige pakketje.
Er zijn standaard drie reeksen in de kernel, namelijk INPUT (inkomend), OUTPUT (uitgaand) en FORWARD (doorsturen).
De reeksen zijn als volgt gerangschikt:
_____ Inkomend / \ Uitgaand -->[ Router ]--->|FORWARD|-------> [ keuze ] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | --> Lokale programma's --^
De drie rondjes staan voor de drie reeksen. Als een pakketje bij zo'n cirkel aankomt worden de regels nagelopen om het lot van het pakketje te bepalen. Als hieruit blijkt dat het pakketje moet worden genegeerd (DROP) dan wordt het pakketje gelijk daar gestopt. Als uit de reeks blijkt dat er niets mis is met het pakketje (ACCEPT) dan doorloopt het pakketje de rest van het schema.
Elke reeks bestaat uit een aantal regels en een beleid (policy). Elke regel heeft de vorm van: "Als het pakketje deze eigenschappen heeft, doe dan dit en dat met het pakketje.". Als deze regel niet van toepassing is op het pakketje (het pakketje heeft niet de eigenschappen voor deze regel), dan wordt de volgende regel gelezen. Als de laatste regel is gelezen en er is geen regel die van toepassing is op dit pakketje, dan wordt de actie uitgevoerd die het beleid is. Dit is dus een standaard actie die van toepassing is op alle pakketjes die niet door een regel gespecifeerd zijn. Het beleid is meestal het pakketje negeren (DROP) zodat onbekende pakketjes niet door kunnen dringen.