Iptables, aby zezwolić na przychodzące FTP


32

Chcę zezwolić na przychodzący ruch FTP.

CentOS 5.4:

To jest mój /etc/sysconfig/iptablesplik.

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

Domyślnie ładowany jest moduł ip_conntrack_netbios_n.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Ale problem nie tkwi w tym module, ponieważ próbowałem go rozładować i nadal nie miałem szczęścia.

Jeśli wyłączę iptables, mogę przenieść kopię zapasową z innego komputera na FTP. Jeśli iptables wymusza, transfer nie powiódł się.

Odpowiedzi:


27

Twój serwer ftp potrzebuje kanału do przesyłania danych. Port 21służy do ustanowienia połączenia. Aby umożliwić transfer danych, musisz włączyć port20 . Zobacz następującą konfigurację

Najpierw załaduj następujący moduł, aby upewnić się, że pasywne połączenia ftp nie zostaną odrzucone

modprobe ip_conntrack_ftp

Zezwalaj na połączenia FTP na porcie 21przychodzącym i wychodzącym

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Zezwól portowi FTP 20na aktywne połączenia przychodzące i wychodzące

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Wreszcie zezwól na pasywny ruch przychodzący FTP

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Więcej informacji na temat problemów z FTP i zaporą można znaleźć na stronie: http://slacksite.com/other/ftp.html#active

Edycja: Dodano NEWdo reguły wejściowej portu 21.


2
Zapomniałem wspomnieć, że --sport 1024: and --dport 1024:oznacza to, że uwzględniamy wszystkie porty z zakresu, 1024:32535które są portami nieuprzywilejowanymi, co oznacza, że ​​użytkownicy bez uprawnień dostępu mogą używać tych portów do testowania swoich aplikacji.
Valentin Bajrami

@Being Gokul, Zgadza się. Możemy kontrolować nasz serwer na jakich portach powinien nasłuchiwać połączeń klientów. Jednak w trybie pasywnym musimy używać --sporttrybu nieuprzywilejowanego, aby ukrywać problemy z zaporą i pozwalać klientom łączyć się z serwerem.
Valentin Bajrami

2
Możesz dodać, NEW,ESTABLISHEDale to nie powinno mieć znaczenia. Połączenie jest zawsze najpierw w NEWstanie, a następnie przeskakuje, RELATEDco wskazuje, że to połączenie jest powiązane z już dozwolonym połączeniem. Gdy połączenie zmieni się w ESTABLISHEDstan, informuje nas, że połączenie zostało nawiązane po obu stronach (serwer / klient). Zamiast -m state --state ...tego możesz spróbować .
Valentin Bajrami

1
To NEWnaprawdę ma znaczenie. Bez niego to nie działa.
Leandros,

1
@ val0x00ff Nie rozumiem potrzeby --sport 1024:. Dlaczego port klienta miałby być użyteczny dla reguły? Jeśli łączy się z portu 80 z pasywnymi portami serwera, musi również mieć możliwość połączenia.
Yvan

15

Widziałem takie rozległe zasady już na kilku blogach itp. I zastanawiałem się, dlaczego po prostu ich nie użyć

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

wraz z nf_conntrack_ftpmodułem. Jest to bardziej zwięzłe i czytelne, co ogólnie jest dobrą rzeczą, szczególnie w przypadku zapór ogniowych ...

FWIW, wygląda na to, że nastąpiła zmiana w jądrze 4.7, więc musisz albo ustawić net.netfilter.nf_conntrack_helper=1przez sysctl(np. Wstawić /etc/sysctl.d/conntrack.conf), albo użyć

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(zobacz tutaj po więcej szczegółów)


1
Informacje o jądrze 4.7 uratowały mi życie, próbowałem godzinami, aby to zadziałało. Prosty echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperi wszystko działa zgodnie z oczekiwaniami.
Keeper

1
Świetny! 4.7 był problemem, którego nie mogłem rozwiązać na jądrze Jessie 4.9!
Arunas Bartisius

@Jakob występuje problem z POWIĄZANYMI połączeniami, których można użyć w celu uzyskania dostępu do innych usług: home.regit.org/wp-content/uploads/2011/11/… oraz github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan

6

Klient FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

SERWER FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Aby przełączyć między trybem pasywnym a aktywnym po stronie klienta

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.

3
Zdecydowanie zasługujesz na poparcie tego. Zapomnienie o załadowaniu modułu nf_conntrack_ftp jest źródłem problemów podczas rozwiązywania problemów z pasywnymi połączeniami FTP i śledzeniem połączeń iptables. Użycie tego modułu pozwala usunąć typ „NOWY”, aby porty te były chronione przed przypadkowymi połączeniami bez ustanawiania poprzedniej sesji FTP.
Ryan Griggs,

5

Dodanie NOWEGO naprawiłem, jak sądzę.

Teraz mój plik iptables wygląda tak ...

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Wpisanie go jako odpowiedzi, ponieważ zbyt wiele znaków jest niedozwolonych w komentarzach. Bardzo dziękuję za pomoc.


2
Fajnie, zadziałało i cieszę się, że wskazałem ci właściwy kierunek. Proszę zaznaczyć swoją odpowiedź jako rozwiązaną, aby pomóc innym osobom, które szukają właściwej odpowiedzi.
Valentin Bajrami

Uważam, że w przyjętej odpowiedzi jest literówka. Uważam, że --dport 20:65535pozostawia wszystkie porty od 20 do 65535 otwarte z dowolnego portu źródłowego między 1024: 65535, co pozostawia wiele usług narażonych, które prawdopodobnie nie powinny, chyba że jest to wyraźnie dozwolone. Uważam, że zamierzano--dport 1024:65535
itnAnti

0

Jeśli potrzebujesz zarówno połączeń aktywnych, jak i pasywnych i już akceptujesz ESTABLISHEDpołączenia, takie jak:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Następnie wystarczy otworzyć port 21 i dodać specjalną regułę dla portów pasywnych. Dla portu 20 nie jest wymagana żadna reguła, ponieważ została już zaakceptowana przezESTABLISHED powyższą regułę.

Najpierw zaakceptuj nowe połączenia port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Następnie dodaj pomocnika CT dla portów pasywnych 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Zobacz też:

Uwaga: należy ustawić 1024:opcję na serwerze FTP: wyszukaj domyślne porty pasywne w konfiguracji FTP. W przeciwnym razie otworzysz zbyt wiele portów, które mogą nie być względne względem FTP.

Ważna uwaga: nie dodałem OUTPUTreguł, ponieważ obowiązują moje ustawienia domyślne iptables -P OUTPUT ACCEPT. To znaczy, że ufam temu, co wychodzi z mojego pudełka. To może nie być dobrą opcją, szczególnie w konfiguracji NAT.

Bardzo ważna uwaga: FTPS nie będzie działał z taką konfiguracją, ponieważ port pasywny jest ukryty (zaszyfrowany), dlatego nie ma możliwości iptablesodgadnięcia dobrego portu. Zobacz Zmiana IPTables na zezwolenie FTP przez TLS przy użyciu portów pasywnych i https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.