DNAT para 127.0.0.1 com iptables / Controle de acesso ao destino para o proxy SOCKS transparente

3

Eu tenho um servidor em execução na minha rede local que funciona como um roteador para os computadores da minha rede. Eu quero alcançar agora que as solicitações TCP de saída para determinados endereços IP são sintonizadas através de uma conexão SSH, sem dar às pessoas da minha rede a possibilidade de usar esse túnel SSH para se conectar a hosts arbitrários.

A abordagem que eu tinha em mente até agora era ter uma instância de redsocks escutando no host local e redirecionar todos os pedidos de saída para os endereços IP que eu quero desviar para essa instância de redsocks. Eu adicionei a seguinte regra do iptables:

iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:12345

Aparentemente, o kernel Linux considera os pacotes provenientes de um endereço não-127.0.0.0 / 8 para um endereço 127.0.0.0/8 como "pacotes marcianos" e os descarta. O que funcionou, no entanto, foi fazer com que os redsocks ouvissem eth0 em vez de lo e, em seguida, fazer com que iptables enviassem os pacotes para o endereço eth0 (ou usando uma regra REDIRECT). O problema sobre isso é que, então, todos os computadores da minha rede podem usar a instância de redsocks para se conectar a todos os hosts da Internet, mas quero limitar seu uso a um determinado conjunto de endereços IP apenas.

Existe alguma maneira de fazer com que os pacotes DNAT do iptables sejam 127.0.0.1? Caso contrário, alguém tem uma ideia de como eu poderia alcançar meu objetivo sem abrir o túnel para todos?

Atualização: Eu também tentei mudar a origem dos pacotes, sem sucesso:

iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 1.2.3.4 -j SNAT --to-source 127.0.0.1
iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 127.0.0.1 -j SNAT --to-source 127.0.0.1
    
por cdauth 20.01.2012 / 10:49

3 respostas

3

Você não pode fazer esse truque com a rede 127/8, pois ela é usada especialmente dentro do kernel do linux. Mas você pode criar uma interface de rede fictícia, atribuir endereço IP a ela, vincular seu serviço a esse endereço e fazer NAT.

root@vm8583:~# ip link add bogus type dummy
root@vm8583:~# sysctl net.ipv4.conf.eth0.arp_ignore=3
root@vm8583:~# ip addr add 10.0.0.1/32 bogus scope host
root@vm8583:~# ip link set bogus up
root@vm8583:~# ip link show bogus
4: bogus: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/ether 5e:8b:38:f3:46:ce brd ff:ff:ff:ff:ff:ff

Note que pode ser necessário definir net.ipv4.conf.eth0.arp_ignore=3 para que o seu servidor não responda ao ARP solicitações para 10.0.0.1 recebidas via eth0 :

arp_ignore - INTEGER
    Define different modes for sending replies in response to
    received ARP requests that resolve local target IP addresses:
. . .
    3 - do not reply for local addresses configured with scope host,
    only resolutions for global and link addresses are replied
    4-7 - reserved
    
por 21.02.2013 / 08:10
2

Eu encontrei a solução para o meu dnat para 127.0.0.1 (loopback) falhando, tenho a resposta no canal irc netfilter.

Existe uma configuração de sysctl que permite ao dnbackback. Para permitir isso

sysctl -w net.ipv4.conf.eth0.route_localnet=1

e para verificar a configuração

cat /proc/sys/net/ipv4/conf/eth0/route_localnet  
    
por 30.06.2015 / 21:41
0

Você pode tentar desativar o filtro de caminho inverso (que é o AFAICT que significa o termo "marciano"). Você pode fazer isso com echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter como root. (Você pode ser capaz de desativá-lo somente na interface lo , mas eu tentaria desabilitá-lo completamente no início.)

    
por 26.03.2012 / 05:49