2011-06-03 16 views
10

Czy jest jakieś polecenie, które może zostać użyte do zerwania istniejącego połączenia TCP/IP z jakiegoś programu?Jak mogę przerwać dowolne połączenie TCP/IP w systemie Linux?

Czy jest coś w połączeniu TCP, o którym system operacyjny jest świadomy, czy system operacyjny widzi tylko przesyłanie TCP na gniazdach lokalnych i czy nie wiesz, które żądanie jest przekazywane do którego gniazda?

Na przykład, jeśli Firefox wysyła żądanie do portu 80 jakiegoś serwera i czeka na odpowiedź. Czy jest to możliwe, aby znaleźć port do odsłuchiwania Firefoksa i oszukać Firefoksa w celu pokazania ERR_CONNECTION_REFUSED lub czegoś podobnego.

Chciałbym rozwiązania, które nie zapobiegnie przepływowi danych i pozwala aplikacji obsłużyć tę sytuację na swój sposób, ale raczej zamknij gniazdo lub połączenie TCP/IP (co powinno być możliwe, ponieważ gniazdo jest czymś systemu operacyjnego jest odpowiedzialny za, jak sądzę, czy połączenie jest również własnością systemu operacyjnego lub po prostu czymś, co aplikacja robi?), więc aplikacja zareagowałaby natychmiast.

Odpowiedz

3

Użyj tcpkill.

+1

i posiadają odpowiednie uprawnienia. –

+2

Należy zauważyć, że to polecenie dodaje tylko wpisy do tabel zapory. W rzeczywistości nie zamyka połączenia, ale ponieważ FF otrzymuje błąd dla następnego pakietu, który próbuje wysłać/odebrać, to powinno działać. –

+0

@Aaron Digulla: Dobry punkt – vitaut

0

Moje podejście do tego jest przy użyciu ramy `iproute2.

Tworzenie blockhole/nieosiągalny tabeli routingu wiadro (w moim przykładzie tabeli id ​​33) poprzez reguły i nadać mu wysoką ważn:

# ip rule add from all lookup 33 prio 1 

teraz znaleźć połączenia ty próbujesz zablokować. W moim przypadku użyłem Chromium podłączyć do google.com:

# ss -n -e -p | grep "chrom" | grep "173.194.*:443" 
ESTAB  0  0    10.211.55.4:46710   173.194.35.2:443 timer: (keepalive,38sec,0) users:(("chromium-browse",8488,106)) uid:1000 ino:38318 sk:f6a4f800 
ESTAB  0  0    10.211.55.4:49288  173.194.35.18:443 timer:(keepalive,34sec,0) users:(("chromium-browse",8488,109)) uid:1000 ino:38047 sk:f6a4cb00 

więc dodajmy 173.194.0.0/16 do tabeli 33 i opróżnić cache:

# ip route add unreachable 173.194.0.0/16 table 33 
# ip route flush cache 

spróbować połączyć do google .com teraz w przeglądarce, a dostaniesz ERR_CONNECTION_REFUSED w przeglądarce.

Aby podnieść zasłonę swojej narzuconego blokady, to prosty równo wiadro:

# ip route flush table 33 

Oczywiście, jeśli potrzebujesz bardziej ziarnisty rozróżnienia, można użyć tc i U32 klasyfikator do flaga Dokładny IP:PORT kombi (i inne aspekty pakietów) i dodać zasadę fw do kubła (przetestowane)

# tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \ 
    match ip src 173.194.0.0/16 match ip dport 443 classid :1 
# ip rule add fwmark 1 table 33 prio 1 realms 3/4 
+0

Myślę, że to rozwiązanie także spowoduje, że przeglądarka nie połączy się, ale nie po to, aby zamknąć połączenie w warstwie TCP, dopóki przeglądarka nie spróbuje wysłać czegoś i wywołać timeout. – dronus

Powiązane problemy