Proxy Linux


Página destinada a criação de um proxy Linux

Pré requisitos

Nem todos os pre req serão obrigatórios, porém para fazer um servidor completo é necessário seguilos. Embora as soluções aqui descritas podem ser segmentadas em dispositivos diferentes, porém nosso servidor de proxy linux será um servidor completo com os seguintes recursos

  • DNS Server
  • DHCP Server
  • Firewall
  • Proxy

Para funcionar dessa maneira, vamos imaginar uma topologia como a da imagem abaixo, o Linux é o gateway da rede de computadores, o roteador (por exemplo: Modem ADSL) será o gateway do Linux, portanto Linux chega a internet através do roteador.

DHCP Server

Para que computadores troquem informações de aplicação (HTTP, FTP, SSH, HTTPS, Email - Acessar a internet) é necessário que eles sejam configurados com um endereço de IP (internet protocol).

Normalmente em uma rede o administrador não atribui endereços ips em cada computador de maneira estática, isto é: Configurar computador por computador para ter um endereço IPv4 Fixo (ou v6, mas para esse exemplo será o v4). O DHCP (Dynamic Host Configuration Protocol) tem a função de atribuir endereço IP para quem pedir (ou seja, quem nao tem IP)

O servidor DHCP que será usado nesta página será o isc-dhcp-server (dhcpd)

DNS Server

Domain Name Server (DNS) é o serviço / servidor responsável por traduzir nomes em IP/IPs. Quando você acessa http://estudo.ragazzid.com.br na verdade o seu computador faz uma consulta HTML no IP 192.254.189.33 (02/10/2013) e podemos concordar que é muito mais fácil salvar, na memória, nome do site do que o número IP de cada site que você acessa.

Existem servidores na internet que resolvem os sites da internet, por exemplo:

  • 4.2.2.2 => Open DNS
  • 8.8.8.8 => Google DNS
  • 8.8.4.4 => Google DNS

No entanto, esses servidores funcionam apenas para a internet, se você quiser dar o nome do seu computador de CasaArquivos e quiser acessar ele para pegar músicas, arquivos ou até mesmo achar um computador na rede para jogar algum jogo, é necessário ter um DNS local.

Essa etapa não é necessária, porém ela será incluída nos procedimentos!

O servidor DNS que será usado nesta página será o bind

Firewall

Para que o tráfego possa passar pelo seu gateway (nesse caso, o servidor Linux) é necessário que algumas regras sejam adicionas com o intuito de permitir que o mesmo possa ser encaminhado de uma interface a outra, devemos ainda levar em conta o fato que a rede da internet não terá rota para chegar a nossa rede local (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 - RFC 1918), portanto uma regra de tradução também deve ser criada.

Nesse caso, levaremos em conta que já possuímos uma comunicação com a internet e a interface que já consegue acesso a internet é a eth0 (poderia ser qualquer outra, mas nesse caso será a eth0).

O firewall que será usado nesta página será o iptables

Proxy

Basicamente o proxy vai ser o filtro de internet que irá bloquear sites indevidos ou sites configurados como indevidos. Mas qual seria a diferença entre o nosso firewall (iptables) e o proxy? Embora o iptables também consiga bloquear urls ou sites ele não tem a mesma robustez que um proxy para URLs, como por exemplo verificar categoria de sites, pedir usuário e senha antes de permitir um acesso a internet (não obrigatório), etc.

O proxy que iremos utilizar será o squid.

Mãos a Obra

Configurando / fazendo acontecer

DHCP Server

Sabendo que: O Linux irá atuar como servidor DHCP para a rede local, a interface conectada com a mesma deve ser escolhida como interface que irá agir como DHCP server, ou seja essa interface irá estar aptada a receber broadcast na porta 67 e negociar com IP irá atrabuir a aquele dispositivo (computador, celular, televisão, telefoneIP). Para esse exemplo será utilizada a interface eth2

Preparativos

Antes de configurar o DHCP server é necessário definir 3 coisas:

  1. Qual o IP da sua rede local

    1. Para o exemplo, será: IP: 192.168.0 Máscara 255.255.255.0
  2. Qual será o range de IP’s que o servidor irá atribuir

    1. Para o exemplo: Os dispositivos irão receber ips entre o interface 192.168.0.20 até 192.168.0.40
  3. Qual será o DNS Server e o Gateway da rede

    1. Gateway e DNS server será o próprio Linux

Mãos a Obra

Após instalar o isc-dhcp-server devemos editar alguns arquivos com o objetivo de fazer as coisas funcionarem.

Interface

Primeiramente vamos por endereço estático a nossa interface, precisamos alterar o arquivo /etc/network/interfaces – Na verdade não precisa alterar o arquivo, porém se o seu objetivo é que quando o servidor reinicie você ele mantenha o IP estático, siga o procedimento abaixo:

Adicione as seguintes linhas ao final do arquivo

#config para eth2
auto eth2
iface eth2 inet static
address 192.168.0.1   #ip da interface
netmask 255.255.255.0 #mascara de rede
dns-server 127.0.0.1  #servidor dns, nesse caso, o proprio servidor
Configuração do DHCP

Para escolher qual interface irá aceitar pacotes de solicitação DHCP, edite o arquivo: /etc/default/isc-dhcp-server

Basta adicionar a interface na única linha não comentada, sua alteração deve ficar assim:

INTERFACES="eth2"

Agora, a parte mais “chata”, precisamos configurar o pool para que o servidor consiga endereçar os dispositivos que pedirem IP para ele, para isso devemos alterar o arquivo /etc/dhcp/dhcpd.conf, porem antes de mudar esse arquivo, por que não fazer um backup?

Digite o comando abaixo para fazer um backup do arquivo de configuração do ISC

cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.back

Agora, podemos editar, na verdade para ficar mais fácil, vamos apagar o arquivo e escrever um do 0, assim fica mais fácil de entender o que estamos adicionando, para apagar digite

rm /etc/dhcp/dhcpd.conf

Para criar o mesmo arquivo, porém vazio, digite

touch /etc/dhcp/dhcpd.conf

Hora de escrever no arquivo de configuração de DHCP com os comandos abaixo:

authoritative; #unico server DHCP

default-lease-time 600;
max-lease-time 7200;

option domain-name "ragazzid.com.br"; #mude para seu dominio
option domain-name-servers linux.ragazzid.com.br; #mude para o nome do seu servidor

#definindo nosso pool
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.20 192.168.0.40;
    option domain-name-servers 192.168.0.1; #servidor DNS
    option domain-name linux.ragazzid.com.br;
    option routers 192.168.0.1; #gateway padrao
    option broadcast-address 192.168.0.255; 
}

Salve o arquivo e inicialize o serviço! Se estiver no debian, digite:

service isc-server-dhcp start

Firewall

É necessário permitir que o Linux permita que o tráfego de uma interface chegue na outra, baseando-se na sua tabela de roteamento. Para isso utilize o comando:

echo 1 > /proc/sys/net/ipv4/ip_forward

Você também pode abrir o arquivo ip_forward com o nano ou vi e alterar seu valor para 1, dá na mesma!

Sabendo que a outra rede será a internet e o endereço da sua rede local não é reconhecido pela mesma, precisamos criar uma regra de tradução para que a sua rede interna saia com o seu IP público. Seja a interface eth0 a conectada com a internet, digite o seguinte comando:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Dica Ninja

Se após ter digitado todos os comandos citados sua conexão com a internet ainda não funciona, tente:

ping 4.2.2.2
ping 8.8.8.8

Se receber timeout, digite esses comandos para zerar as configurações do seu iptables: 1. Zerar nossas regras

iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -F POSTROUTING -t nat
  1. Adicionar as políticas - (Os comandos abaixo irão mudar a política das cadeidas para negar todo o tráfego, assim permitindo apenas o que iremos definir a seguir, caso seu foco não seja segurança, digite ACCEPT ao invés de drop, pois se estiver usando uma conexão SSH / Telnet você será desconectado)

    iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP

  2. Permitir a rede interna de acessar a internet

    iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 80 -j ACCEPT #HTTP iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 443 -j ACCEPT #HTTPS iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 110 -j ACCEPT #POP iptables -A INPUT -p udp -s 169.254.0.0/24 –dport 53 -j ACCEPT #DNS iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 22 -j ACCEPT #SSH iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 21 -j ACCEPT #FTP iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 20 -j ACCEPT #FTP iptables -A INPUT -p tcp -s 169.254.0.0/24 –dport 23 -j ACCEPT #Telnet

  3. Tradução pra o endereço público, a mesma já usada antes!

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Protinho, para ver seu trabalho concluído digite

root@debian:/home/ragazzid# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:http
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:https
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:pop3
ACCEPT     udp  --  link-local/24        anywhere             udp dpt:domain
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:ftp
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:ftp-data
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:telnet
ACCEPT     tcp  --  link-local/24        anywhere             tcp dpt:ssh
ACCEPT     icmp --  link-local/24        anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  link-local/24        anywhere
ACCEPT     udp  --  link-local/24        anywhere
ACCEPT     icmp --  link-local/24        anywhere

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  192.168.150.0/24     anywhere

root@debian:/home/ragazzid# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  link-local/24        anywhere

Mas cade as regras para o OUTPUT? As regras do OUPUT servem para permitir que dispositivos acessem o seu servidor ou que a conexão se inicie fora da rede local, no nosso caso não precisamos disso, porém você pode encontar algo sobre isso em Redes DMZ.