Mam raczej dziwny problem. Mam serwer z dwoma interfejsami sieciowymi eth0
i 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, eth0
gdy wszystko inne przechodzi eth1
.
Przeczytałem kilka wyszukiwań w Google i wygląda na iptables
to, ż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.
źródło
iftop
a każdy z nich pokazuje odpowiedni rodzaj ruchu. Dziękuję bardzo.iptables-save
iiptables-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.Cóż, „ najprostszym ” sposobem powinno być poinstruowanie pojedynczych programów, aby korzystały z określonego interfejsu (lub adresu IP interfejsu. Na przykład:
instruuje ping, aby używał eth1 jako interfejsu źródłowego, podczas gdy
instruuje wget, aby przejść przez interfejs, który ma
10.0.0.1
jako 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ć
iptables
iiproute
programó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 filtering
iport filtering
.źródło
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 route
iip rule
, aby kontrolować sposób routowania pakietów na podstawie ich interfejsu wychodzącego. W moim przykładzie założę następującą sieć: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
route
iip 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
:Główny stół ma domyślny priorytet 254. Reguły, dla których obowiązuje tabela routingu, są kontrolowane przez
ip rule
polecenie. Domyślnie to polecenie wyświetli listę istniejących reguł, które powinny wyglądać mniej więcej tak:Mówi to w zasadzie, że będzie szukał trasy w tabeli,
local
któ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.Zwykle chcesz, aby
alternate
stół wyglądał podobnie domain
stoł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:Ta reguła mówi, że każdy ruch przychodzący z adresu w sieci 192.168.0 użyje
alternate
tabeli routingu zamiast zwykłejmain
tabeli. Ostatnim krokiem jest upewnienie się, że wszyscy klienci, którzy muszą go użyć, zostaną z nimeth0
powiązani. Zwget
, na przykład, ustaw--bind-address=192.168.0.2
, dla NFS ustawclientaddr=192.168.0.2
opcja 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.źródło