Como fornecer uma “LAN guest” em um dispositivo ethernet

1

Eu tenho uma máquina sempre ativa rodando Debian / Squeeze com um par de portas ethernet (ela está fazendo várias tarefas serverish, incluindo DHCP) e uma LAN em cada uma delas.

eth0 está em 192.168.7. * e tem acesso à internet (e ao resto da "LAN do escritório") por meio de um gateway (roteador DSL que traduz NAT) naquela LAN em 192.168.7.1.

eth1 está em 192.168.1. *. Eu estou procurando uma maneira rápida, fácil e amigável ao Debian de configurar a máquina para que qualquer pessoa na 192.168.1. * LAN tenha acesso somente à Internet externa, DHCP, e não possa acessar nenhuma das outras coisas em 192.168.7. *.

Tenho certeza que isso é possível usando um conjunto apropriado de regras iptables. Suspeito que estou procurando um dos:

  • Um guia simples de como configurar o iptables para alcançar o acima (eu não pode ser a primeira pessoa a querer fazer isso).
  • Um apontador para algum software de configuração de firewall fácil de usar que pode fazer isso (embora note que eu não quero bloquear o eth0-side e a rede 192.168.7. *.)
  • Sugestão de algum software projetado para fazer exatamente isso; Eu tem uma idéia, existem alguns pacotes destinados a alcançar semelhante ao o que eu quero para cibercafés etc, mas não tenho certeza por onde começar procurando ou se isso pode ser um exagero.

Qualquer ferramenta que esteja no Debian Squeeze (ou Wheezy) já é uma grande vantagem.

    
por timday 22.08.2012 / 21:23

1 resposta

3

Isso é bastante fácil de fazer com o iptables. No abaixo, 'wan-iface' é a interface na qual sua conexão WAN está ligada. Dependendo de como ele está conectado, pode ser eth2, ppp0, etc. Além disso, observe que você pode renomear as interfaces Ethernet editando /etc/udev/rules.d/70-persistent-net.rules - altamente recomendado quando você tem várias. -i lan é muito mais claro que -i eth0 .

Você pode escrever um script init.d para aplicar essas regras na inicialização ou usar o pacote iptables-persistent. Ou existem vários geradores de regras de firewall empacotados (pessoalmente, eu escrevo as regras do iptables diretamente, já que muitas vezes eu quero fazer coisas estranhas).

Você precisará de uma regra de NAT, se a sua existente já não a cobrir:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j SNAT --to-source external-ip

External-ip é o seu endereço IP real. Se você tiver um dinâmico, altere essa linha para:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j MASQUERADE

Em seguida, você precisará de uma regra de firewall para permitir o tráfego. Estou dando dois aqui, dependendo se seu padrão para encaminhamento é DROP ou não. deve ser descartado, mas ...

iptables -A FORWARD -i eth1 -o wan-iface -j ACCEPT # default is drop
iptables -A FORWARD -i eth1 ! -o wan-iface -j DROP # default is accept

Agora, você só precisa permitir o DHCP. Supondo que seu firewall esteja executando o DHCP e que o DNS esteja na WAN (caso contrário, você precisará permitir que eles falem com o servidor DNS):

iptables -A INPUT -i eth1 -p udp --dport bootps -j ACCEPT
iptables -A INPUT -i eth0 -j DROP # only if your default isn't drop

Isso é, creio eu, a configuração mínima para isso. Você também pode limitar o tráfego que sai para a Internet. Por exemplo, se você quisesse navegar apenas na Web, em vez das regras FORWARD acima, você faria isso (novamente assumindo o DNS na WAN):

iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p udp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport http -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport https -j ACCEPT
iptables -A FORWARD -i eth1 -j DROP # only if default is accept

Observe que o acima permite três portas, domínio (TCP e UDP, para DNS), http (TCP) e https (TCP).

editar:

Em resposta ao seu esclarecimento:

Parece que nenhum NAT está sendo realizado nesta caixa. Além disso, não há interface WAN, o tráfego sai pela LAN. Não é a melhor configuração, mas factível.

Eu usarei "lan-ip" para indicar o endereço IP da caixa Debian em sua LAN (eth0). Usarei "guest-ip" para indicar o endereço IP da mesma caixa em sua rede de convidados (eth1).

Estou ficando confuso com a sua nomeação de interface enquanto escrevo isso, então vou assumir que você siga meu conselho e renomeie as interfaces para "lan" (eth0) e "guest" (eth1). Se não, você pode encontrar um & substituir.

Parece que atualmente você não tem roteamento ou firewall configurados nessa caixa, então darei regras completas, não apenas as que serão adicionadas. Você pode precisar adicionar mais alguns, é claro.

Você precisará ativar o encaminhamento de IP (edite /etc/sysctl.conf para fazer isso). E ative o filtro de caminho inverso no mesmo arquivo.

Você precisará configurar o DHCP para oferecer serviços em sua rede eth1. Observe que o gateway padrão que ele armazena (somente para a rede de convidado eth1) precisará ser guest-ip, não 192.168.7.1.

Sua regra de NAT será um pouco diferente. Seria preferível não ter isso e, em vez disso, fazer isso em 192.168.7.1, mas vou adivinhar que isso não é possível. Se for possível, pule esta regra nat, adicione-a no 7.1 e adicione uma rota para 192.168.1.0/24 via lan-ip.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o lan -j SNAT --to-source lan-ip

agora, já que você não tem um firewall configurado atualmente, as coisas padrão a serem negadas. Esta é a maneira mais segura de fazer as coisas, geralmente.

iptables -P INPUT DROP    # default for traffic to firewall (this box)
iptables -P FORWARD DROP  # default for forwarded traffic
iptables -F               # clear rules
iptables -X               # delete custom chains
iptables -t nat -F        # same, but for nat table
iptables -t nat -X

iptables -A INPUT -i lo -j ACCEPT  # let the box talk to itself. Important.

Neste ponto, sua caixa ficará completamente inacessível. Não é o que você quer. As próximas regras consertam isso. Os dois primeiros configuram o rastreamento de conexão, permitindo que os pacotes façam parte de uma conexão existente (ou muito próximos dela)

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Então, vamos supor agora que você confia nas máquinas na LAN do escritório e permitir todo o tráfego delas. Você pode alterar isso para regras mais restritas, se desejar. Observe que a regra FORWARD permitirá que você acesse máquinas na rede guest da LAN do escritório. Se isso não for desejado, omita-o.

iptables -A INPUT   -i lan          -j ACCEPT
iptables -A FORWARD -i lan -o guest -j ACCEPT

Agora, para permitir algum tráfego da rede de convidados. Primeiro, você precisa permitir o DHCP.

iptables -A INPUT -i guest -p udp --dport bootps -j ACCEPT # dhcp

Em seguida, suponho que você não queira permitir o acesso de convidado a nenhuma das suas redes privadas. Então, vamos deixar todo o tráfego de visitantes para o espaço RFC1918 (privado).

iptables -A FORWARD -i guest -d 10.0.0.0/8      -j DROP  
iptables -A FORWARD -i guest -d 172.16.0.0/12   -j DROP
iptables -A FORWARD -i guest -d 192.168.0.0/16  -j DROP

Como deixamos de usar todo o espaço de endereço privado, o restante é público. Então permita. Esta linha é um pouco assustador, como se uma das linhas anteriores desaparecesse, seria um problema.

iptables -A FORWARD -i guest -o lan -j ACCEPT

Você poderia, é claro, limitar isso a protocolos e portas específicas (como no exemplo da navegação na Web).

Você também pode adicionar regras para registrar pacotes descartados, etc.

    
por 22.08.2012 / 22:33