Baixe o app para aproveitar ainda mais
Prévia do material em texto
Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! Capítulo 2: Compartilhamento , DHCP e Proxy Um dos usos mais comuns e mais simples para um servidor Linux de rede local é simplesmente compartilhar a conexão. A vantagem de usar um servidor dedicado ao invés de simplesmente compartilhar usando o próprio modem ADSL é que você pode incluir outros serviços, como um cache de páginas (Squid), filtro de conteúdo (SquidGuard ou DansGuardian), firewall, servidor Samba (compartilhando arquivos com a rede interna), servidor de impressão e assim por diante. Em uma rede pequena ou média, com de 10 a 50 micros, é possível usar um único servidor de configuração razoável para todas estas funções. Em redes maiores, com 100 micros ou mais, isso passa a depender muito do nível de utilização do servidor. Por exemplo, um simples Pentium 100, com 32 MB de RAM pode compartilhar a conexão com um link de até 8 megabits para um número indefinido de clientes. O mesmo servidor pode compartilhar uma impressora e compartilhar arquivos (serviços mais pesados que simplesmente compartilhar a conexão), desde que estes serviços não sejam utilizados de forma intensiva. Porém, uma configuração modesta como esta já não é adequada para rodar um servidor proxy para uma rede de 50 micros, por exemplo. Uma máquina mais atual, como um Pentium E ou um Athlon X2, com 512 MB de RAM e um HD de 7200 RPM, já pode rodar o mesmo proxy para 100 ou 200 micros com folga, incluindo serviços adicionais (como uma VPN, por exemplo). Adicione 2 GB de RAM e ele poderá rodar também um servidor de arquivos para os mesmos 200 micros. Máquinas mais parrudas podem desempenhar funções mais pesadas. Você pode, por exemplo, usar o VMware Server (que veremos em detalhes mais adiante) para rodar diversas máquinas virtuais, cada uma com um sistema operacional diferente, de forma a atender diversos usuários da rede. Dessa forma, você pode concentrar aplicativos Windows em uma máquina virtual com o Windows 2003 e o Terminal Services, oferecer aplicativos para usuários remotos usando um servidor com o Fedora e o NX Server (que veremos em detalhes no capítulo sobre acesso remoto) e assim por diante. Você pode até mesmo manter algumas máquinas virtuais com sistemas antigos, como o Windows 98, para rodar aplicativos de legado que rodam apenas sobre ele. Mas, cada coisa a seu tempo :) Compartilhando a conexão Do ponto de vista da segurança e até mesmo da facilidade de configuração, é sempre recomendável usar um servidor com duas placas de rede, separando o tráfego proveniente da internet do tráfego da rede local. Com duas placas separadas, fica mais fácil criar as regras de firewall adequadas para bloquear acessos provenientes da internet e, ao mesmo tempo, permitir o tráfego vindo da rede local. Se você acessa via ADSL, é recomendável manter o modem configurado como bridge ao invés de configurá-lo como roteador. Dessa forma, o servidor recebe todas as portas de entrada, permitindo que você acesse o servidor remotamente via SSH (muito útil para prestar suporte remoto em servidores instalados por você) ou disponibilize um servidor web ou FTP. Embora acabe sendo mais trabalhoso, nada impede que você configure o modem como roteador e use o servidor para novamente compartilhar a conexão recebida do modem, acrescentando os demais serviços. Nesses casos, você vai precisar configurar o modem para encaminhar ao servidor as portas que devem ficar abertas, como a porta 22, usada pelo SSH (caso você pretenda administrar o servidor remotamente), por exemplo. Isso é feito através da interface de administração do modem, através da opção "Port Forwarding", ou similar: Página 1 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! Encaminhamento de portas dentro da configuração de um D-Link 500G As opções de configuração variam bastante de acordo com o modelo do modem, mas (com exceção de um punhado de modelos realmente muito antigos) deve estar disponível pelo menos a opção de criar regras estáticas de encaminhamento, onde você pode encaminhar um conjunto de portas, incluindo uma regra para cada uma. Na maioria dos casos, a interface de configuração do modem permite também encaminhar faixas de portas, ou criar uma DMZ (o que faz com que todas as portas sejam encaminhadas para o servidor, como se ele estivesse diretamente conectado à Internet). No final, sua rede ficaria com uma topologia similar a essa, com o servidor colocado entre a rede local e o modem. Uma das interfaces do servidor receberia um endereço de rede local, de forma a receber os acessos provenientes dos clientes da rede e a segunda seria configurada para acessar a Internet através do modem: Ao usar uma conexão via cabo, o layout da rede continua o mesmo, a única diferença é que no acesso via cabo a configuração da conexão é mais simples, já que é preciso apenas obter a configuração da rede via DHCP e não é necessário configurar o roteamento de portas, já que o cable modem funciona como um bridge. Depois de montar o cabeamento da rede, comece configurando a rede local usando uma das faixas de endereços IP reservadas como, por exemplo, a 192.168.1.x, onde o servidor fica com o IP 192.168.1.1 (ou 192.168.1.254, caso prefira) e os micros da rede interna recebem endereços dentro da mesma faixa. O endereço IP de rede local do servidor (192.168.1.1 no exemplo) passa a ser o gateway da rede, já que é a ele que os clientes irão contactar quando precisarem acessar qualquer endereço externo: Página 2 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! No caso do servidor, o gateway padrão é definido apenas ao configurar a conexão com a Internet, não ao configurar a rede local. Caso você utilize um utilitário de configuração para configurar as interfaces de rede no servidor, configure primeiro a interface de rede local, mantendo os campos do default gateway e dos servidores DNS em branco, deixando para configurar a interface da Internet por último. Isso evita alguns erros comuns. Por exemplo, se você configurar a conexão com a web e depois configurar a rede local, colocando um endereço qualquer no campo "default gateway", o gateway informado na configuração da rede local vai substituir o gateway do provedor (definido ao conectar na internet), fazendo com que a conexão deixe de funcionar. Aqui temos um exemplo de configuração manual da rede para distribuições derivadas do Debian, onde a interface eth0 é usada como interface de rede local e a eth1 é usada como placa de internet, configurada via DHCP: # sudo nano /etc/network/interfaces auto lo eth0 eth1 iface lo inet loopback iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 iface eth1 inet dhcp Agora reinicie as interfaces com os comandos: # sudo ifdown eth0 # sudo ifup eth0 # sudo ifdown eth1 # sudo ifup eth1 Página 3 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! Depois de configurada a rede, verifique se consegue pingar os PCs da rede interna (ex: ping 192.168.1.61) a partir do servidor. Se estiver usando Linux nas estações, experimente ativar o servidor SSH em uma das estações e tentar se conectar a ela a partir do servidor. Da primeira vez que configurar a rede, use endereços IP estáticos para todas as estações, pois assim é mais fácil detectar problemas diversos. Depois de tudo funcionando,mude para configuração via DHCP, como veremos a seguir. Se alguma das estações estiver inacessível, verifique se não existe um firewall ativo, verifique o cabo de rede e experimente trocar a porta usada no switch. Ativando o compartilhamento Depois de tudo preparado, ativar o compartilhamento propriamente dito é bastante simples. No Linux, o compartilhamento é feito usando o Iptables, o firewall integrado ao Kernel. Na verdade, o Iptables é expandido através de módulos, por isso suas funções vão muito além das de um firewall tradicional, incluindo funções avançadas de roteamento. Para ativar o compartilhamento, são necessários apenas três comandos: # modprobe iptable_nat # echo 1 > /proc/sys/net/ipv4/ip_forward # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE Substitua o "eth1" pela placa da Internet. Este comando simplesmente compartilha a conexão proveniente da placa da internet com todas as demais placas de rede espetadas no servidor, por isso não é necessário especificar a placa de rede local. O primeiro comando ativa o "iptable_nat", o módulo do Iptables responsável por oferecer suporte ao roteamento de pacotes via NAT. O segundo ativa o "ip_forward", o módulo responsável pelo encaminhamento de pacotes, utilizado pelo módulo iptable_nat. Finalmente, o terceiro cria uma regra de roteamento, que orienta o servidor a direcionar para a internet todos os pacotes (recebidos dos clientes) que se destinarem a endereços que não façam parte da rede local (ou seja, qualquer coisa fora da faixa 192.168.1.x). A partir daí, o servidor passa a ser o gateway da rede. Em muitas distribuições com o Kernel 2.6, é necessário usar um quarto comando ao compartilhar uma conexão ADSL. Este comando ajusta os tamanhos dos pacotes recebidos do modem ao MTU usado na rede local. Note que, apesar da diagramação do livro tornar necessário quebrar o comando em duas linhas, trata-se de um único comando: # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -m \ tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu A barra invertida ("\") faz com que o shell não interprete o caractere seguinte (no caso, a quebra de linha), permitindo quebrar o comando em duas linhas, sem causar um erro. Esse é um truque que permite incluir comandos longos demais para caberem na página, divididos em duas linhas ou mais. Na verdade, o comando forma uma única linha. Como de praxe, é importante proteger o servidor de ataques provenientes da Internet usando um firewall. Podemos ativar um firewall simples de bloqueio usando mais alguns comandos do Iptables, complementando os três comandos anteriores: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -m state --state INVALID -j DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i eth0 -j ACCEPT Página 4 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP O primeiro comando faz com que o seu servidor deixe de responder a pings, o que evita muitos ataques casuais. Os dois comandos seguintes protegem contra IP spoofing (uma técnica usada em diversos tipos de ataques, onde o atacante envia pacotes usando um endereço IP falseado como remetente, tentando assim obter acesso a PCs da rede interna) e contra pacotes inválidos, que são comumente utilizados em ataques DoS e ataques de buffer overflow. As duas linhas seguintes autorizam pacotes provenientes da interface de loopback (lo), juntamente com pacotes provenientes da rede local. Como pode ver, a sintaxe das regras do Iptables segue um padrão lógico, onde você especifica uma determinada condição e diz o que o firewall deve fazer com os pacotes que se enquadrarem nela. No caso da regra que autoriza os pacotes da rede local (iptables -A INPUT -i eth0 -j ACCEPT) usamos os parâmetros "-A INPUT" (pacotes de entrada) e "-i eth0" (recebidos na interface eth0), seguidos da regra "-j ACCEPT", que diz que os pacotes devem ser aceitos sem checagem adicional. Não se esqueça de substituir o "eth0" pela interface de rede local correta, caso diferente. Continuando, a linha "iptables -A INPUT -p tcp --dport 22 -j ACCEPT" abre a porta 22, usada pelo SSH para conexões externas, permitindo que você possa administrar o servidor remotamente. Você pode abrir mais portas simplesmente adicionando mais linhas, com as portas desejadas. Concluindo, temos a linha "iptables -A INPUT -p tcp --syn -j DROP", que faz o trabalho pesado, bloqueando tentativas de conexão provenientes da Internet. Depois de testar o compartilhamento, falta fazer com que os comandos sejam executados durante o boot, tornando a configuração permanente. A forma mais simples de fazer isso é colocar os comandos no arquivo "/etc/rc.local", um script próprio para a tarefa, que está disponível tanto em distribuições derivadas do Debian quanto em distribuições da linhagem do Red Hat. Um exemplo de arquivo completo, incluindo os comandos para ativar o firewall seria: #!/bin/sh # sudo nano /etc/rc.local modprobe iptable_nat echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -A INPUT -p icmp --icmp-type echo-request -j DROP echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -m state --state INVALID -j DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i eth0 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP Esta receita é genérica, deve funcionar em qualquer distribuição. Lembre-se de substituir "eth1" pela interface de internet e o "eth0" pela interface de rede local, caso diferentes. Uma segunda opção, mais elegante, porém mais complicada, é criar um serviço de sistema, que pode ser ativado e desativado. Neste caso, crie o arquivo de texto "/etc/init.d/compartilhar". Dentro dele vão as linhas a seguir: #!/bin/bash # Interface da Internet: Página 5 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! ifinternet="eth1" # Interface da rede local iflocal="eth0" iniciar(){ modprobe iptable_nat echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o $ifinternet -j MASQUERADE iptables -A INPUT -p icmp --icmp-type echo-request -j DROP echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter iptables -A INPUT -m state --state INVALID -j DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i $iflocal -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP } parar(){ iptables -F iptables -F -t nat } case "$1" in "start") iniciar ;; "stop") parar ;; "restart") parar; iniciar ;; *) echo "Use os parâmetros start ou stop" esac Este é um shell script que aceita três funções: start, stop e restart, executando dentro de cada uma os comandos que compartilham e param o compartilhamento da conexão. Esta estrutura é similar à usada nos demais scripts de inicialização do sistema, como os do Apache, Samba, Squid e outros serviços. Veja que em vez de especificar as interfaces de internet e de rede local dentro dos comandos, passei a usar duas variáveis no início do script, que facilitam a configuração e tornam o script mais elegante. Quando precisar usar o script em outra máquina, onde as interfaces sejam diferentes, você precisa apenas se lembrar de alterar as duas variáveis. Note também que os comandos a partir do "iptables -A INPUT -p icmp --icmp-type echo-request -j DROP" correspondem às proteções e ao firewall e podem ser removidos caso desejado. Para usar o script,transforme-o em um arquivo executável, usando o comando: # chmod +x /etc/init.d/compartilhar A partir daí, você pode iniciar e parar o compartilhamento usando os comandos: # /etc/init.d/compartilhar start # /etc/init.d/compartilhar stop Página 6 de 7 Extraído do livro: Servidores Linux, Guia Prático, de Carlos Morimoto. Quer comprar o Servidores Linux, Guia Prático impresso? Clique aqui! Para que o script seja executado durante o boot, você pode adicionar o comando "/etc/init.d/compartilhar start" no arquivo "/etc/rc.local", em vez de colocar os comandos diretamente, como fizemos no exemplo anterior. Outra opção (mais elegante) é criar um link para ele dentro da pasta "/etc/rc5.d", o que também faz com que ele seja executado durante o boot: # cd /etc/rc5.d # ln -s ../init.d/compartilhar S21compartilhar Como vimos no primeiro capítulo, o "S" indica que o script deve ser executado com o parâmetro "start" e o "21" indica a ordem em que deve ser executado durante o boot, em relação aos outros serviços. A ordem de execução dos serviços muda de distribuição para distribuição, mas nessa posição garantimos que ele será executado depois da ativação das interfaces de rede e de outros serviços essenciais. Se você é um administrador paranóico, verifique a configuração dos serviços na distribuição em uso e altere a ordem de inicialização do script de firewall, de forma que ele seja carregado antes de qualquer outro serviço que aceite conexões, como o Samba ou o Apache. Com isso você garante que o firewall será carregado primeiro e não fica com seu servidor vulnerável nem mesmo por um curto espaço de tempo durante o boot. Isso nos leva a uma terceira opção para salvar a configuração, utilizando os próprios arquivos de inicialização do sistema. Ela é a mais "correta" do ponto de vista técnico, embora menos flexível. Nesse caso, a configuração seria feita em três passos: A primeira parada seria o arquivo "/etc/modules", onde são listados os módulos carregados pelo sistema durante o boot. Nele seria adicionada a linha "iptables_nat", ativando o carregamento do módulo. Em seguida, você adicionaria (ou descomentaria) a linha "net.ipv4.conf.default.forwarding=1" no arquivo "/etc/sysctl.conf", para ativar o roteamento de pacotes, tornando permanente o comando "echo 1 > /proc/sys/net/ipv4/ip_forward". Finalmente, depois de executar o comando "iptables -t nat -A POSTROUTING -o $placa -j MASQUERADE", que efetivamente ativa o compartilhamento, você usaria o comando"/etc/init.d/iptables save active" (nas derivadas do Debian) ou "service iptables save" (nas derivadas do Red Hat) para salvar regra e fazer com que ela passe a ser reativada durante o boot. No livro, você verá ainda como Compartilhar usando uma única placa de rede Página 7 de 7 Capítulo 2: Compartilhamento, DHCP e Proxy Compartilhando a conexão Ativando o compartilhamento
Compartilhar