Zarządzanie firewallem Windows XP z poziomu skryptu w PowerShell

W środowisku linuksowym do bardziej zaawansowanej konfiguracji różnych rzeczy związanych z siecią, np. blokady określonego ruchu czy też limitowania prędkości, używa się iptables. Często tworzy się skrypty, które definiują reguły dla iptables opisujące jak ma być zarządzany ruch sieciowy. W Windows nie ma czegoś takiego jak iptables. Być może są tego typu produkty firm trzecich ale sam system nie oferuje czegoś takiego. Jest za to Windows Firewall, znany też jako Zapora systemu Windows w polskiej wersji Windows XP. Jest on bardzo prosty i w żadnym razie nie można go porównać z iptables, jednak chciałbym zauważyć, że podobnie jak iptables można go konfigurować za pomocą skryptów. Podobnie jak w przypadku innych ustawień sieciowych wykonywanych z poziomu konsoli używane jest polecenie netsh, a konkretnie netsh firewall. Windowsowy firewall oferuje tylko jeden rodzaj reguł: reguły zezwalające. Mogą być one włączone albo wyłączone i mogą dotyczyć programu albo portu. Chciałbym pokazać przykładowy skrypt w PowerShellu korzystający z netsh. Jego zadaniem jest zezwolenie na korzystanie z naszego serwera FTP tylko tym osobom, które same mają uruchomione serwery FTP lub SMB i coś udostępniają. Przykład jest dosyć specyficzny, ponieważ wykorzystuje gotową listę hostów publikowaną na stronie internetowej (dostępnej tylko z mojej sieci lokalnej).

$wc = new-object System.Net.WebClient
$file = $wc.DownloadString("http://supreme.btk.pw.edu.pl/host_list.txt")
$linie = $file.split("`n")
$res="";
$linie | foreach {
    if ($_ -match ".*(\d\d\d\d\d\d\d\d\d\d).*") {
        $found = $matches[0]
        $d = $found -match "(\d+\.\d+\.\d+\.\d+).*"
        $matches[1]
        $res=$res+","+$matches[1]
    }
}
netsh firewall add allowedprogram "C:\Program Files\SerwerFTP\ftpd.exe" ftpd ENABLE CUSTOM $res.Substring(1)

Kod jest tylko przykładem specyficznym dla mojej sieci. Linijki w host_list.txt wyglądają w sposób następujący:

10.4.26.25 ftp:142588231396 smb:3072162153

Mamy więc adres IP i ilość bajtów udostępnionych po FTP i SMB. Wyrażenie regularne szuka wystąpienia 10 cyfr. Dzięki temu odszukujemy tych, którzy udostępniają ponad 1 GB plików. Potem kolejne wyrażenie odnajduje adres IP, który razem z przecinkiem jest doklejany do linijki zawierającej listę adresów (zmienna $res). Gdy mamy już wszystkie adresy IP są one podawane jako parametr polecenia netsh firewall add allowedprogram. ftpd to nazwa wpisu jaki zostanie utworzony w windowsowym firewallu. Używana jest metoda Substring, ponieważ użyty sposób tworzenia listy powoduje, że na początku linijki znajduje się niepotrzebny przecinek i trzeba się go pozbyć. Oczywiście "C:\Program Files\SerwerFTP\ftpd.exe" trzeba zmienić na ścieżkę do swojego serwera FTP. W ten sposób w windowsowym firewallu tworzona jest reguła, która wpuszcza tylko tych, którzy udostępniają jakąś większą ilość danych. Nie chcę się tutaj rozwodzić nad tym, czy blokowanie tych, którzy nic nie udostępniają albo udostępniają mało jest właściwe. Podany przykład pokazuje tylko rozwiązanie konkretnego problemu.