iptables configuration - conexão ssh somente de uma rede remota

1

Estou tentando configurar o Iptables de um servidor para permitir conexões de entrada SSH apenas de uma determinada rede.

pela forma como esta é a cadeia de regras:

# Drop anything we aren't explicitly allowing. All outbound traffic is okay
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# Accept Pings
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log anything on eth0 claiming it's from a local or non-routable network
# If you're using one of these local networks, remove it from the list below
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF C: "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST D: "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF E: "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK: "
# Accept any established connections
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ssh traffic. Restrict this to known ips if possible.
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
# Opening port 80 and port 443 in order to allow http and https requests
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#Log and drop everything else
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT

Salvar essas regras usando os comandos a seguir parece aplicá-las corretamente:

/etc/init.d/iptables restart && service iptables save

# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
25332   17M RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 LOG        all  --  eth0   *       10.0.0.0/8           0.0.0.0/0           LOG flags 0 level 4 prefix 'IP DROP SPOOF A: ' 
    0     0 LOG        all  --  eth0   *       172.16.0.0/12        0.0.0.0/0           LOG flags 0 level 4 prefix 'IP DROP SPOOF B: ' 
    0     0 LOG        all  --  eth0   *       192.168.0.0/16       0.0.0.0/0           LOG flags 0 level 4 prefix 'IP DROP SPOOF C: ' 
    0     0 LOG        all  --  eth0   *       224.0.0.0/4          0.0.0.0/0           LOG flags 0 level 4 prefix 'IP DROP MULTICAST D: ' 
    0     0 LOG        all  --  eth0   *       240.0.0.0/5          0.0.0.0/0           LOG flags 0 level 4 prefix 'IP DROP SPOOF E: ' 
    0     0 LOG        all  --  eth0   *       0.0.0.0/0            127.0.0.0/8         LOG flags 0 level 4 prefix 'IP DROP LOOPBACK: ' 
    0     0 ACCEPT     tcp  --  *      *       88.253.5.38          0.0.0.0/0           tcp dpt:22 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 25163 packets, 17M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain RH-Firewall-1-INPUT (2 references)
 pkts bytes target     prot opt in     out     source               destination         
24175   17M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 11 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8 
 1052  121K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
   94  6016 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
   11   440 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 
   11   440 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0 

A parte crítica em que estou tendo dificuldades é:

-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT

O que eu estou tentando alcançar é permitir conexão somente desta LAN onde estou, por isso verifiquei aqui o ip externo do meu roteador (é ip estático), e ele retorna digamos 88.253.5.38

Minha principal dúvida é, estou fazendo a coisa certa usando o IP externo do meu roteador? ou devo usar o ip interno da minha máquina ou o intervalo de endereços IP internos?

Ou talvez toda a cadeia tenha algum conflito que não permita a configuração que estou tentando fazer?

Obrigado por qualquer push, estou realmente preso

    
por lese 02.06.2015 / 18:26

2 respostas

2

Am I doing the right thing by using the external IP of my router? or should I use the internal ip of my machine, or the range of internal ip addresses?

TL; DR: se o seu servidor estiver "na Internet" em sua própria máquina, você usa o endereço do roteador nas regras iptables .

Resposta mais longa:

As regras de firewall funcionam na perspectiva do dispositivo que está sendo protegido por firewall. Idealmente, todos os dispositivos do mundo teriam seu próprio endereço IP. Mas eles não fazem isso, e nós temos essa hackeria feia chamada NAT. No caso simplista, trata-se de um dispositivo ou software que utiliza um intervalo de endereços IP, como 192.168.1. *, E os mapeia para um único endereço IP. Os endereços 192.168. * São garantidamente inatingíveis, portanto, nunca podem ser encontrados na Internet real. A rede de cada pessoa está oculta atrás de um dispositivo NAT, de modo que cada rede é apresentada como um único endereço IP exclusivo. Portanto, muitas pessoas podem usar o mesmo intervalo de endereços 192.168. * Em suas redes internas, pois ninguém mais consegue vê-los diretamente.

Então, voltando à pergunta.

Se o seu servidor estiver "fora" da sua rede com NAT, ele verá apenas o único endereço público. Então é isso que deve estar nas regras iptables .

Por outro lado, se o seu servidor estiver conectado à sua própria rede sem um dispositivo NAT entre eles, os endereços internos reais devem ser usados.

Esta é uma versão altamente simplificada da feia realidade do endereçamento de Internet IPv4, mas deve começar.

Agora, para responder ao seu problema específico, é por isso que suas regras de iptables não funcionam como esperado. Comece com a corrente INPUT e siga-a sequencialmente. A primeira linha chama a cadeia RH-Firewall-1-INPUT . Ao seguir isso, você verá um par de regras que ACCEPT trafegam nas portas 80 e 443. E, em seguida, há uma regra DROP para todo o resto. No final dessa cadeia, retornamos para INPUT e finalmente alcançamos seu ACCEPT para a porta 22. Mas todo o tráfego já está sendo descartado até esse ponto, portanto, a regra é irrelevante.

Uma solução aqui é mover a regra ACCEPT para a porta 22 para a cadeia RH-Firewall-1-INPUT , imediatamente após as regras para as portas 80 e 443, mas antes do valor de todos DROP .

A solução apropriada, eu suspeito, é aprender a usar firewalld , mas não sei se isso estava disponível no CentOS 6.x ou se ele chegou primeiro apenas no CentOS 7.

    
por 02.06.2015 / 23:18
2

Então, o que sua regra está dizendo é:

  1. Anexar a INPUT chain
  2. Para pacotes que usam TCP e são destinados à porta 22
  3. Que vêm deste endereço de origem
  4. Nós os aceitaremos.

Existem duas maneiras de fazer isso, e sua pergunta parece um pouco vaga (para mim, pelo menos), então vou responder a todos os três cenários:

Cenário 1

Você quer que alguém de um determinado endereço IP público acesse essa caixa.

Sua regra está atualmente escrita dessa forma. Se eu estiver sentado em minha casa e meu IP público for 88.253.5.38 , então eu posso acessar sua caixa no trabalho ou em outro lugar através do SSH. *

* Possivelmente não está correto, mas vamos ignorar isso por simplicidade. Por exemplo, se você tiver essa caixa atrás de outro firewall, precisará de encaminhamento.

Cenário 2

Você quer que alguém do escritório deles (ou rede interna) acesse essa caixa.

Você precisa mudar apenas um pouco. Apenas o IP mudaria.

Então, eu estou em uma rede 10.0.0.0/8 e minha estação de trabalho tem um IP estático de 10.0.0.127, então você alteraria sua regra para:

-A INPUT -p tcp -s 10.0.0.127 --dport 22 -j ACCEPT

Isso significa que Bob, cuja estação de trabalho possui um IP de 10.0.0.128, não poderá acessar essa máquina por meio do ssh.

Cenário 3

Você deseja que qualquer pessoa do seu escritório acesse (ou rede interna) para acessar essa caixa.

Sua regra mudaria mais, mas ainda não muito.

Mais uma vez, estou em uma rede 10.0.0.0/8 e quero que qualquer pessoa que tenha um IP no intervalo de 10.0.0.1-10.0.0.254 acesse essa caixa. Bem, eu sei que é uma rede / 24, então:

-A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT

Isso significa que Charlie, que tem um IP de 10.0.0.1.127, não pode acessar essa caixa por meio do SSH.

Espero que isso limpe as coisas para você!

    
por 02.06.2015 / 19:46