En webserver og epostserver på innsiden

Tiden går, og behovene endrer seg. Et behov som ofte oppstår, er å kunne kjøre tjenester som er tilgjengelige utenfra. Dette blir ofte vanskelig fordi ekstra eksternt synlige adresser enten ikke er tilgjengelig eller dyrt, og det er ofte ikke ønskelig å kjøre mange tjenester på samme maskin som fungerer som brannmur.

Omdirigeringsmekanismene i PF gjør det relativt enkelt å ha servere på innsiden. Hvis vi tenker oss at behovet er å ha en webserver som tilbyr tjenester i klartekst (http) og kryptert (https), og du ønsker å ha en epostserver som sender og mottar epost, samtidig som den lar klienter innenfor og utenfor eget nett bruke en del kjente protokoller for henting og sending, kan disse linjene være alt du trenger å føye til regelsettet fra tidligere:

webserver = "192.168.2.7"
webporter = "{ http, https }"
epostserver = "192.168.2.5"
epost = "{ smtp, pop3, imap, imap3, imaps, pop3s }"

rdr on $ytre proto tcp from any to $ytre port \
       $webporter -> $webserver
rdr on $ytre proto tcp from any to $ytre port 
       $epost -> $epostserver

pass proto tcp from any to $webserver port $webporter \
   flags S/SA synproxy state
pass proto tcp from any to $epostserver port $epost \
   flags S/SA synproxy state
pass proto tcp from $epostserver to any port smtp \
   flags S/SA synproxy state

Her er flagget 'synproxy' tatt med. Det betyr at det er PF, ikke din server eller forsåvidt klient, som håndterer opprettingen av forbindelsen (treveis-håndtrykket) før applikasjonen overtar selv. Dette gir en viss beskyttelse mot visse typer angrep.

Regelsett for konfigurasjoner med DMZ-nett som er isolert bak eget nettverksgrensesnitt og eventuelt tjenester på alternative porter vil ikke nødvendigvis skille seg særlig fra dette.

Ta vare på sine egne - innsiden

Alt jeg har sagt så langt stemmer veldig godt så lenge du bare tar hensyn til trafikk som kommer fra andre steder enn ditt eget nettverk.

Hvis du ønsker at maskiner på lokalnettet skal bruke tjenestene på de samme maskinene, oppdager du fort at trafikken fra lokalnettet sannsynligvis aldri kommer innom det ytre nettverksgrensesnittet, der all omdirigering og adresseoversetting foregår. Dette problemet er faktisk så vanlig at PF-dokumentasjonen nå inneholder fire separate løsninger på problemet.[1]

Alternativene som foreslås i PF-brukerhåndboken er

Vi trenger å fange opp pakkene som kommer fra lokalnettet, og sørge for at forbindelsene blir håndtert riktig slik at returtrafikk kommer frem til den kommunikasjonspartneren som faktisk opprettet forbindelsen.

I vårt eksempel klarer vi dette ved å legge til disse reglene:

rdr on $indre proto tcp from $localnet to $ytre \
       port $webporter -> $webserver
rdr on $indre proto tcp from $localnet to $ytre \
       port $epost -> $epostserver
no nat on $inter proto tcp from $indre to $localnet
nat on $indre proto tcp from $localnet to $webserver \
       port $webporter -> $indre 
nat on $indre proto tcp from $localnet to $epostserver \
       port $epost -> $indre 

Fotnoter

[1]

Se Redirection and Reflection i PF-brukerhåndboken.