Jak upewnić się, że port SSH jest otwarty tylko dla określonego adresu IP?


42

To jest moje /etc/sysconfig/iptables:

Ma dwa porty otwarte 80 apache i 22 dla ssh.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

W przypadku portu 22 (SSH) chcę się upewnić, że nikt nie może połączyć się z tym portem, z wyjątkiem określonego adresu IP.

przykładowy ip:

1.2.3.4

Proszę zignorować wszelkie niedopatrzenia / obawy dotyczące tego, co się stanie, jeśli zmieni się mój adres IP i nie będę mógł SSH na moim serwerze.

Odpowiedzi:


47

jeśli otrzymam pytanie w odpowiedni sposób, chcesz, aby twój serwer był dostępny tylko z określonego adresu IP na porcie 22, możesz zaktualizować Iptables w tym celu:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

W takim przypadku otwierasz port ssh tylko na swój adres IP, jeśli chcesz otworzyć DNS dla sieci wewnętrznej:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Po dodaniu i otwarciu tych adresów IP należy zamknąć drzwi dla pozostałych adresów IP

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Upewnij się, że ustawiłeś reguły we właściwej pozycji w swoim zestawie reguł. Doda iptables -A INPUTreguły na końcu INPUTobecnej wersji).

lub jak powiedział joel , możesz zamiast tego dodać jedną regułę:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

lub możesz po prostu ustawić domyślne zasady zapory za pomocą

iptables -P INPUT DROP

W skrócie, jak przedstawiono w tym pytaniu na temat SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

2
Warto również zauważyć, że iptablesobsługuje inwersję z operatorem Bang w przypadku, gdy chcesz zrobić cel DROP. Przykład:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley,

1
Ponadto bezwarunkowe DROPnie są tak naprawdę potrzebne, możesz po prostu ustawić domyślne zasady zapory za pomocą iptables -P INPUT DROPi pozwolić temu na to. Prawdopodobnie zechcesz również zrobić je jako dodatek, jeśli zrobisz to w ten sposób, w przeciwnym razie cały ruch zostanie złapany DROPi nigdy nie osiągnie twojej ACCEPTreguły.
Bratchley,

1
Nie działało to dla mnie, ponieważ domyślnym ustawieniem opcji -I (insert) jest wstawianie jako reguła nr 1, więc DROP jest wstawiany jako reguła nr 1 i oceniany jako pierwszy, a zatem upuszcza wszystkie pakiety ssh, nigdy nie oceniając reguły ACCEPT. Musisz wykonać, iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPa iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP„3” po INPUT oznacza wstaw jako regułę INPUT nr 3 (zakładając, że wstawiasz dwa ACCEPTS, w przeciwnym razie, jeśli tylko jeden ACCEPT, to użyj „2” dla INPUT.
Kevin Triplett

@Networker Korzystanie -Iwstawi nowe reguły iptables na górze. W związku z tym możesz skończyć z upuszczaniem przed pozwoleniem. Sugeruję użycie -Azamiast tego
BlueCacti

1
Cóż, zamknąłem się, gj
ngwdaniel,

6

Chociaż zalecam używanie kluczy SSH, dam ci wyjaśnienie.

Nie musisz używać tabel IP do tego, co próbujesz osiągnąć, istnieje wiele sposobów. Oto sposób IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = Twój domowy adres IP (całkiem proste)

[SSH_PORT] = Port, na którym uruchomiono SSH (domyślnie 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Dzięki temu nikt poza twoim adresem IP nie będzie mógł zalogować się do SSH.

Istnieje inny sposób, polegający na dodaniu czegoś do sshd_config.

Dodaj następujące:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Pozwala to zalogować się do SSH jako rootużytkownik z twojego adresu IP bez pytania o hasło.

Należy pamiętać, że cronjob z

iptables -X
iptables -F

może być mądry, abyś nie został zablokowany na serwerze za pomocą SSH (cronjob zresetuje IPtables, aby uzyskać dostęp ponownie). Jeśli nadal masz dostęp, możesz usunąć cronjob i ponownie skonfigurować tabele IP.


Jednak cronjob po prostu usunie zaporę ogniową. Po co konfigurować iptables? Jakaś forma dostępu poza pasmem jest zwykle stosowaną metodą. knockdjest inny.
Matt

@mtm Tak, gdy zostaniesz zablokowany, cronjob zresetuje konfigurację IPtables, abyś mógł ponownie uzyskać dostęp do SSH. Powody, dla których ludzie używają IPtables są różne, moim zdaniem jest to skuteczna, prosta i elastyczna zapora ogniowa.
William Edwards,

2
oic. masz na myśli uruchomienie flush raz w czasie konfiguracji, nie regularnie zaplanowane. atrobi to.
Matt

4
Umieszczenie na białej liście samego adresu IP, a następnie zezwolenie na zalogowanie się do konta root bez hasła, wydaje się okropnym pomysłem.
Alex W

1
@AlexW Wiem, że minęło trochę czasu, ale nadal chciałem skomentować: Without-Passwordoznacza, że ​​uwierzytelnianie za pomocą hasła jest niedozwolone, więc zamiast tego musisz użyć uwierzytelniania za pomocą klucza SSH. To rzeczywiście trochę niejasne nazewnictwo dla tej metody uwierzytelniania. Ale to nie znaczy, że nie potrzebujesz hasła, aby zalogować się jako root. Niemniej jednak bezpieczniejszą metodą jest ustawienie PermitRootLogin noi użycie innego konta sudo do logowania, ponieważ root jest częstym celem
BlueCacti

5

Inne odpowiedzi wykorzystują iptables -Iw swoich przykładach, co często nie jest tym, czego powinieneś użyć.

iptables wykona pierwszą pasującą regułę, więc kolejność reguł jest bardzo ważna. -Ito polecenie „wstaw” i powinno być używane z parametrem indeksu, aby określić, gdzie na liście należy dana reguła. -Ato polecenie „append”, które doda regułę na końcu listy.

W niektórych rozproszeniach (być może wszystkich) użycie -Ibez parametru indeksu doda regułę do indeksu 1, sprawiając, że zostanie sprawdzona pierwsza reguła. W tym scenariuszu, jeśli ostatnim uruchomionym poleceniem jest iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables, porzuci cały ruch, niezależnie od tego, czy masz jakieś ACCEPTreguły w dalszej części łańcucha.

Oto przykład konfiguracji reguły, która zezwala na SSH tylko z jednego adresu IP:

Zaczynając bez reguł:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Dodaj nową zasadę „zezwalaj na SSH od 1.2.3.4”:

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Blokuj SSH od wszystkich innych adresów IP:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Teraz Twój łańcuch INPUT będzie wyglądał następująco:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Później, jeśli chcesz dodać do białej listy drugi adres IP, możesz użyć -Iparametru, aby umieścić go przed regułą czarnej listy.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Zauważ, że użycie -I INPUT 2dodało nową regułę jako regułę numer 2 i podbiło regułę DROP do liczby 3.

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.