Encaminhe a porta 22 para fora de uma interface específica

1

A situação em que estou é onde temos três interfaces separadas em uma máquina específica. Cada rede conectada permite que os servidores (por roteamento / firewall baseado em rede) ofereçam apenas serviços específicos. Obviamente, os clientes podem se conectar a partir de uma ampla variedade de sub-redes e eu estou confiando em firewalls de rede para controles de acesso.

A interface de gerenciamento permite o tráfego ssh, mas para que os clientes possam se conectar, a rota padrão deve ser definida para o gateway na rede de gerenciamento. Isso resolve o SSH, mas interrompe os serviços HTTP que são permitidos apenas na interface de produção. A terceira interface é uma interface de backup, mas todo o tráfego para essa está na mesma sub-rede.

A tabela de roteamento se parece com algo assim:

[root@xxxcpr2 ~]# ip route
10.19.1.0/24 dev eth0 proto kernel scope link src 10.19.1.10
10.18.29.0/24 dev eth1 proto kernel scope link src 10.18.29.25
192.168.5.0/24 dev eth2 proto kernel scope link src 192.168.5.35
default via 10.18.29.1 dev eth1

Acima, eth0 é a interface de gerenciamento, eth1 é a interface de produção e eth2 é a interface de backup.

Essencialmente, a condição que estou tentando acessar é onde o gateway padrão para todo e qualquer tráfego da porta 22 é roteado para fora da interface de gerenciamento, mas todo o tráfego fora de uma sub-rede conectada diretamente deve ser roteado pela interface de produção. Essencialmente, tenho 90% de onde quero estar, apenas quero adicionar uma exceção para o tráfego SSH.

Eu encontrei isso mas eu não foi capaz de fazê-lo funcionar. Talvez seja a minha falta de compreensão ou alguma diferença entre o RHEL e o Ubuntu. Como o gateway padrão da tabela main já estava definido para sair da interface de produção, o que fiz foi:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# ip route add table 22 default via 10.19.1.1
# iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
# ip rule add fwmark 22 table 22
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

A meu modo de pensar (talvez alguém possa apontar como isso está errado) marcar o pacote e criar uma regra para usar a tabela 22 deve funcionar (não sei por que a postagem original mencionou SNAT mas tentei copiá-la como o melhor que pude para a conclusão), mas as conexões ainda estão esgotadas, a menos que eu altere a rota padrão da tabela main .

Basicamente, neste momento, preciso de alguém para apontar o que não estou entendendo ou que estou negligenciando.

    
por Bratchley 24.11.2014 / 16:44

2 respostas

0

Para conexões ssh de entrada (sem rastreamento de conexão)

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 22

Para conexão ssh de saída (sem rastreamento de conexão)

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 22

Você deve conseguir combinar os dois usando --port em vez de --dport e --sport

Provavelmente seria uma prática melhor usar o acompanhamento de conexão, mas as regras acima devem ajudá-lo.

    
por 24.11.2014 / 20:28
0

Um conjunto mais completo de regras de firewall baseado em uma configuração semelhante que eu tenho para o tráfego ssh de entrada.

Certifique-se de que as regras existentes do iptables sejam liberadas antes do teste.

iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -N MarkThem -t mangle
iptables -t mangle -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -j MarkThem
iptables -t mangle -A PREROUTING -p tcp -m tcp -m multiport --ports 22  -j MarkThem
# May need to filter out local LAN connections here.
# But try without filtering first.
# iptables -t mangle -A MarkThem  -s 10.18.29.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 10.19.1.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 192.168.5.0/24   -j RETURN
iptables -t mangle -A MarkThem  -j MARK --set-mark 22
iptables -t mangle -A MarkThem  -j CONNMARK --save-mark

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

Note que eu defini explicitamente as regras para corresponder tanto a origem quanto o destino na porta 22. Você provavelmente vai querer apertar as regras de firewall assim que tiver algo funcionando.

Ao testar conexões ssh de saída, pode ser útil especificar um endereço de ligação com a opção -b para ver se funciona para o tráfego proveniente de seu endereço de gerenciamento.

ssh -b 10.19.1.10 [email protected]

    
por 24.11.2014 / 23:01