Zezwól tylko na określony ruch wychodzący na niektórych interfejsach

15

Mam raczej dziwny problem. Mam serwer z dwoma interfejsami sieciowymi eth0i eth1. Każdy z nich jest podłączony do innej sieci. Każda sieć ma bramę internetową. Serwer ma różne połączenia wychodzące : http (niektóre skrypty na serwerach skrobią strony internetowe), klient nfs, klient samba, klient dns i moduł pobierania poczty e-mail, aby wymienić tylko kilka.

Z powodów, dla których nie wchodzę, muszę podzielić tych wychodzących klientów, aby ruch wychodzący http, nfs, samba i dns był wymagany tylko wtedy, eth0gdy wszystko inne przechodzi eth1.

Przeczytałem kilka wyszukiwań w Google i wygląda na iptablesto, że będę tego potrzebować, ale tak naprawdę nie mam pojęcia. Jestem przyzwyczajony do zarządzania regułami zapory przychodzącej ufw.

Czy ktoś mógłby mnie zacząć od kilku przykładowych reguł i powiedzieć, jak zmusić system do przyjęcia tych reguł podczas uruchamiania? Idealnie bez blokowania mnie z połączenia SSH (I można uzyskać dostęp fizyczny, ale Wolałbym nie).

Edycja Mogę podzielić klientów na dwóch użytkowników, jeśli możliwe jest ograniczenie całego ruchu wychodzącego z konta do jednego interfejsu. na papierze, który wydaje się łatwiejszy.

Oli
źródło

Odpowiedzi:

12

Skonfigurowałbym osobną tabelę routingu i zasadę, aby trasować oznaczone pakiety przy użyciu tej tabeli i pozwolić, aby iptables / netfilter oznaczał niektóre pakiety.

Utwórz tabelę: echo 1 known >> /etc/iproute2/rt_tables

Utwórz regułę routingu ( ippolecenie pochodzi z iproute2 ): ip rule add from all fwmark 1 table known

Stworzyliśmy tabelę o nazwie „znane” i stworzyliśmy regułę routingu, która mówi, że każdy pakiet ze znakiem równym 1 jest kierowany zgodnie z „znaną” tabelą. Nazwałem ją tylko znaną, ponieważ jest to lista znanych protokołów - możesz nazwać ją, jak chcesz. Teraz konfigurujemy znaną tabelę, aby odpowiednio trasować.

ip route add default dev eth0 table known

Utwórz reguły iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

Przykład zaznacza pakiety na portach NFS (111, 2049) za pomocą 1. Dodajemy tę regułę do 'mangle' iptable. Różni się to od tabel routingu i nie można go zmienić; tablica mangle jest przeznaczona do zmiany pakietów w jakikolwiek inny sposób niż NAT.

Teraz, aby przekierować wszystko inne przez drugi interfejs, dodajemy trasę do standardowej tabeli routingu.

ip route add default dev eth1

Aby naprawdę to zrozumieć, przeczytaj sekcje 4 i 11 instrukcji LARTC .

Shawn J. Goff
źródło
Cóż, w rzeczywistości jest to o wiele prostsze, niż się obawiałem. Stos sieciowy Linuksa naprawdę jest piękną bestią, prawda ?! Zrobiłem to szybki test i wszystko wydaje się działać zgodnie z oczekiwaniami. Monitoruję każdy interfejs za pośrednictwem, iftopa każdy z nich pokazuje odpowiedni rodzaj ruchu. Dziękuję bardzo.
Oli
Nie wiem, w jaki sposób iptables lub iproute2 przechowują swoją konfigurację. Czy muszę odpalać te zasady przy każdym uruchomieniu?
Oli
@Oli Są usuwane po ponownym uruchomieniu. Możesz zapisywać i przywracać reguły za pomocą iptables-savei iptables-restore. Jeśli korzystasz z NetworkManager, możesz skonfigurować skrypty dyspozytorskie, aby zautomatyzować proces. Niestety, oficjalna strona NM nie ma dokumentacji na temat tej funkcji, ale dokumentacja Ubuntu i Arch Linux wspominają o niej.
Shawn J. Goff
5

Cóż, „ najprostszym ” sposobem powinno być poinstruowanie pojedynczych programów, aby korzystały z określonego interfejsu (lub adresu IP interfejsu. Na przykład:

ping -I eth1 8.8.8.8

instruuje ping, aby używał eth1 jako interfejsu źródłowego, podczas gdy

wget --bind-address 10.0.0.1 http://www.google.it/

instruuje wget, aby przejść przez interfejs, który ma 10.0.0.1jako adres IP.

Szczerze mówiąc, nie wiem, czy jest to możliwe ze wszystkimi programami, których potrzebujesz, ale jest to początek ograniczenia reguł, dla których musisz pisać iptablesi iprouteprogramów.

Na początek powinieneś przeczytać ten samouczek dotyczący wielu połączeń internetowych . Dobrym odczytu jest również jednym z tysięcy iptables tutoriale, expecially na outbound filtering, process/ pid filteringi port filtering.

Pan Shunz
źródło
4

Właściwym sposobem na to jest powiązanie () z interfejsem, którego chcesz używać dla pakietów wychodzących. Ponieważ następnie możesz skonfigurować trasy za pomocą poleceń ip routei ip rule, aby kontrolować sposób routowania pakietów na podstawie ich interfejsu wychodzącego. W moim przykładzie założę następującą sieć:

  • eth0:
    • Adres: 192.168.0.2/24
    • Brama domyślna: 192.168.0.1
  • eth1:
    • Adres: 192.168.1.2/24
    • Brama domyślna: 192.168.1.1

Stworzę dwie tabele routingu, jedną dla ruchu wychodzącego dla eth0 o nazwie alternate i jedną tabelę dla eth1 o nazwie main. Tabela główna tabeli routingu zawsze istnieje i jest normalną tabelą używaną przez komendy routei ip route. Większość ludzi nigdy nie ma do czynienia z innymi stołami. Aby utworzyć tabelę o nazwie alternatywna, dodamy następujący wiersz /etc/iproute2/rt_tables:

10    alternate

Główny stół ma domyślny priorytet 254. Reguły, dla których obowiązuje tabela routingu, są kontrolowane przez ip rulepolecenie. Domyślnie to polecenie wyświetli listę istniejących reguł, które powinny wyglądać mniej więcej tak:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Mówi to w zasadzie, że będzie szukał trasy w tabeli, localktóra jest specjalną tabelą obsługiwaną przez jądro dla lokalnych tras, takich jak mój własny adres IP. Następnie spróbuje tabeli głównej i tabeli domyślnej. Tabela domyślna jest zwykle pusta, więc jeśli nie ma dopasowania w main, nie ma trasy do hosta. Po pierwsze, wypełnijmy tabelę naprzemiennie z regułami dla eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Zwykle chcesz, aby alternatestół wyglądał podobnie do mainstołu. Jedyne różnice polegają na tym, że routing powinien być inny. Możesz nie chcieć dołączać drugiej linii powyżej, jeśli dosłownie chcesz, aby cały ruch NFS, HTTP itp. Przechodził przez bramę domyślną na eth0, nawet jeśli jest przeznaczony dla sieci na eth1. Następnym krokiem jest dodanie reguły określającej, kiedy należy użyć tej alternatywnej tabeli routingu:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Ta reguła mówi, że każdy ruch przychodzący z adresu w sieci 192.168.0 użyje alternatetabeli routingu zamiast zwykłej maintabeli. Ostatnim krokiem jest upewnienie się, że wszyscy klienci, którzy muszą go użyć, zostaną z nim eth0powiązani. Z wget, na przykład, ustaw --bind-address=192.168.0.2, dla NFS ustawclientaddr=192.168.0.2opcja montażu. Jeśli używasz LibWWW z Perlem, możesz ustawić opcję localaddr w LWP :: UserAgent, aby kontrolować lokalny interfejs, z którym się łączy. Jeśli zdarzy ci się mieć klienta, nie możesz kontrolować źródła wiązania i kompilacji nie jest opcją, możesz użyć reguły iptables do zmodyfikowania jego adresu, ale jest to raczej hack i może nie działać. Potrzebna byłaby reguła SNAT skonfigurowana w łańcuchu PREROUTING tabeli nat lub tabeli mangle. Nadal będziesz potrzebować zmodyfikowanych tabel routingu podanych powyżej, aby to działało.

penguin359
źródło