risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come assicurarsi che la porta SSH sia aperta solo a un indirizzo IP specifico?

Questo è il mio /etc/sysconfig/iptables:

Ha due porte aperte 80 Apache e 22 per 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

Per la porta 22 (SSH) voglio assicurarmi che nessuno possa connettersi a questa porta tranne uno specifico indirizzo IP.

esempio ip:

1.2.3.4

Si prega di ignorare qualsiasi supervisione/preoccupazione riguardo a cosa succede se il mio IP cambia e non posso più SSH sul mio server.

42
user78337

se ricevo la domanda nel modo giusto, vuoi che il tuo server sia raggiungibile solo da un indirizzo IP specifico sulla porta 22, puoi aggiornare Iptables per questo:

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

In tal caso, stai aprendo la porta ssh solo su YourIP, se devi aprire DNS per la tua rete interna:

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

Dopo averli aggiunti e aperti per tali IP, è necessario chiudere lo sportello per il resto degli 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

(Assicurati di impostare le regole nella posizione corretta nel tuo set di regole. iptables -A INPUT aggiungerà le regole alla fine di INPUT come è attualmente.)

o come joel ha detto che puoi invece aggiungere una regola:

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

oppure puoi semplicemente impostare il criterio predefinito sul firewall con

iptables -P INPUT DROP

In breve, come presentato in questa domanda su SO :

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

Anche se raccomando di usare le chiavi SSH, ti darò una spiegazione.

Non devi usare IPtables per quello che stai cercando di ottenere, ci sono molti modi. Questo è il modo IPtables:

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

[YOUR_HOME_IP] = Il tuo IP di casa (abbastanza semplice)

[SSH_PORT] = La porta su cui esegui SSH (per impostazione predefinita 22)

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

Questo assicura che nessuno, tranne il tuo IP, possa accedere a SSH.

C'è un altro modo, ovvero aggiungendo qualcosa al sshd_config.

Aggiungi quanto segue:

AllowUsers [email protected][YOUR_HOME_IP]
PermitRootLogin without-password

Ciò ti consente di accedere a SSH come utente root dal tuo IP senza richiedere una password.

Si prega di tenere presente che un cronjob con

iptables -X
iptables -F

potrebbe essere intelligente in modo da non essere bloccato fuori dal server con SSH (il cronjob ripristinerà IPtables in modo da poter accedere nuovamente). Se hai ancora accesso, puoi rimuovere il cronjob e configurare nuovamente i tuoi IPtables.

7
William Edwards

Altre risposte stanno usando iptables -I nei loro esempi, che spesso non è quello che dovresti usare.

iptables eseguirà la prima regola che corrisponde, quindi l'ordine delle regole è molto importante. -I è il comando "inserisci" e deve essere utilizzato con un parametro index per specificare a quale elenco appartiene una determinata regola. -A è il comando "append", che aggiungerà la regola alla fine dell'elenco.

In alcune distrobuzioni (forse tutte) usando -I senza un parametro indice aggiungerà la regola all'indice uno, rendendola la prima regola selezionata. In questo scenario se l'ultimo comando eseguito è iptables -I INPUT -s tcp 0.0.0.0/0 -j DROP allora iptables eliminerà tutto il traffico, indipendentemente dal fatto che tu abbia o meno delle regole ACCEPT più avanti nella catena.

Ecco un esempio di impostazione di una regola che consente solo SSH da un singolo IP:

A partire senza regole:

#> 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

Aggiungi una nuova regola "consenti SSH da 1.2.3.4":

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

Blocca SSH da tutti gli altri IP:

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

Ora la tua catena INPUT sarà simile a:

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

Successivamente, se è necessario inserire nella whitelist un secondo IP, è possibile utilizzare -I parametro per posizionarlo prima della regola della lista nera.

#>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

Si noti che l'utilizzo di -I INPUT 2 ha aggiunto la nuova regola come regola numero 2 e ha portato la regola DROP al numero 3.

6
STW