Reguły iptables zezwalające na ruch HTTP tylko do jednej domeny

20

Muszę skonfigurować mój komputer tak, aby zezwalał na ruch HTTP tylko do / z serverfault.com. Wszystkie inne strony internetowe, porty usługowe są niedostępne. Wymyśliłem te zasady iptables:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Nie działa całkiem dobrze:

  • Po upuszczeniu wszystkiego i przejściu do reguły 3:

    iptables -A WYJŚCIE -p tcp -d serverfault.com --port 80 -j AKCEPTUJ

Otrzymuję ten błąd:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Czy uważasz, że ma to związek z DNS? Czy powinienem na to pozwolić? Czy powinienem po prostu wpisać adresy IP do reguł? Czy uważasz, że to, co próbuję zrobić, można osiągnąć za pomocą prostszych zasad? W jaki sposób?

Byłbym wdzięczny za wszelką pomoc lub wskazówki w tym zakresie. Wielkie dzięki!

Zenet
źródło
2
Nie zapomnij o sstatic.net i innych. serverfault.com nie pochodzi całkowicie od serverfault.com
Zoredache
Czy możesz uruchomić serwer proxy w innym systemie? To jest najlepsze / najłatwiejsze rozwiązanie: serverfault.com/questions/215134
mattdm

Odpowiedzi:

29

W przypadku reguł IPTables kolejność ma znaczenie. Reguły są dodawane i stosowane w kolejności. Ponadto podczas ręcznego dodawania reguł są one natychmiast stosowane. Tak więc w twoim przykładzie wszelkie pakiety przechodzące przez łańcuch INPUT i OUTPUT zaczynają być upuszczane, gdy tylko zostaną ustawione domyślne zasady. Nawiasem mówiąc, właśnie dlatego otrzymałeś komunikat o błędzie. To się dzieje:

  1. Zastosowane zostaną domyślne zasady DROP
  2. IPTables otrzymuje nazwę hosta jako miejsce docelowe
  3. IPTables próbuje wyszukać DNS na „serverfault.com”
  4. Wyszukiwanie DNS jest blokowane przez akcję DROP

Chociaż opcje źródła / miejsca docelowego akceptują nazwy hostów, jest to zdecydowanie odradzane. Aby zacytować stronę podręcznika,

Nazwy hostów zostaną rozwiązane tylko raz, zanim reguła zostanie przesłana do jądra. Należy pamiętać, że określenie dowolnej nazwy do rozwiązania za pomocą zdalnego zapytania, takiego jak DNS, to naprawdę zły pomysł.

Slillibri uderzył w gwoździe w głowę, na co w swojej odpowiedzi przegapiłeś zasadę AKCEPTACJI DNS. W twoim przypadku nie będzie to miało znaczenia, ale ogólnie ustawię domyślne zasady później. Ostatnią rzeczą, jakiej chcesz, jest praca zdalna i zezwolenie SSH po włączeniu domyślnej odmowy.

Ponadto, w zależności od dystrybucji, powinieneś być w stanie zapisać reguły zapory, tak aby były one automatycznie stosowane w momencie rozpoczęcia.

Wiedząc o tym i zmieniając skrypt, oto co poleciłbym.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Scott Pack
źródło
3
Piękna, dobrze wykonana odpowiedź.
JakeRobinson
1
Doceniam to, chociaż musiałaś przeoczyć mój błąd. Ups
Scott Pack
3
W rzeczywistości możesz umieścić swoje iptables -Pinstrukcje w dowolnym miejscu skryptu, ponieważ zasady łańcucha są stosowane tylko wtedy, gdy pakiety „wypadają” z końca łańcucha. Zazwyczaj umieszczam instrukcje polityki (zwykle DROPpolityki) na górze moich skryptów iptables.
Steven Poniedziałek,
1
@Steven: Masz absolutną rację. Wygląda na to, że PO wpisuje je interaktywnie. Udawajmy, że masz połączenie z hostem przez SSH i twoja pierwsza reguła dotyczy zasad DROP. Twoje połączenie SSH zostanie zerwane, zanim będziesz mógł wpisać kolejne reguły. To ten sam problem z timingiem, jeśli jest to inna manifestacja, niż ona wpadła.
Scott Pack
Dzięki. Próbowałem tego. Ale nie działało bez dodawania sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Czy nie należy tego dodawać?
Kiran,
7

Dodaj

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

aby umożliwić wyszukiwanie DNS.

slillibri
źródło
5

Tego rodzaju wymagania można lepiej obsłużyć za pomocą internetowego serwera proxy i / lub filtra. W tym celu można skonfigurować Dansgaurdian. Musisz użyć reguł NAT, aby wymusić ruch przez filtr.

Użycie iptables do filtrowania pozwoli na dostęp do stron dostępnych z odpowiednich adresów IP. Jest to zwykle niewielki podzbiór całej sieci.

BillThor
źródło
1
Całkowicie się z tym zgadzam. iptablesjest prawdopodobnie niewłaściwym narzędziem do użycia tutaj, ponieważ nie radzi sobie szczególnie dobrze z nazwami DNS. Serwer proxy sieci Web z odpowiednimi ustawieniami filtrów jest znacznie lepiej dopasowany.
Steven Poniedziałek,
2

Obawiam się, że iptables nie działa na tym poziomie, zależy tylko na adresie IP, a nie na nazwie hosta. Jeśli chcesz zablokować dostęp do innych nazw wirtualnych hostów na tym samym IP, musisz spojrzeć na umieszczanie plików .htaccess.

Niall Donegan
źródło
Chodzi o to, że kiedy próbuję zastosować zasadę 3 bez „upuszczania wszystkiego”, działa to dobrze z iptables!
Zenet
2
hmm, źle odczytałem pytanie. Tak, to, co dzieje się w tle, polega na tym, że iptables rozwiąże serverfault.com do 64.34.119.12 (zobacz odpowiedź od slillibri, aby zrozumieć, dlaczego rozwiązanie nie działa). Ponieważ jednak iptables nie rozumie nazw hostów i po prostu zezwala na ip, będziesz mógł połączyć się z dowolną witryną na tym ip, jeśli ma wiele witryn.
Niall Donegan
2
@ Emily, może działać dobrze, pod warunkiem dodania reguły, ale jeśli adres IP serverfault.com ulegnie zmianie, ruch nie będzie dozwolony. Zezwolenie na witrynę taką jak google.com, na której często zmieniane są setki adresów, nie działałby wcale.
Zoredache
1

Musisz to skonfigurować na swoim serwerze internetowym. iptables to filtr pakietów. Transakcje HTTP wysyłają nazwę strony (tj. Przepełnienie stosu) jako część ładunku TCP (tj. Nie jako część nagłówka TCP, który łatwo odczytuje iptables).

Biorąc to pod uwagę i fakt, że transakcje HTTP prawie na pewno zostaną rozłożone na wiele pakietów (tj. Nie można po prostu dopasować ciągu w nagłówku HTTP), jest to znacznie lepiej obsługiwane przez konfigurację serwera WWW lub serwera proxy z przodu z tego.

Przydałoby się znać uzasadnienie tego, istnieje kilka innych alternatyw:

  1. Przekieruj na poprawny adres URL, jeśli wprowadzą nieprawidłowy adres URL (np. Przekieruj na stackoverflow.com, jeśli wprowadzą www.stackoverflow.com)
  2. Powiedz swojemu serwerowi, aby nie obsługiwał hostów innych niż stackoverflow.com
  3. Umieść witrynę w osobnym adresie IP, na który nic się nie rozwiąże, i tylko twój serwer może nasłuchiwać.
Philip Reynolds
źródło
Cześć Phil, nie jestem pewien, czy rozumiem jaki serwer sieciowy? Nie mam serwera. Robię tę konfigurację na moim komputerze.
Zenet