Página destinada a criação de um proxy Linux
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
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.

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)
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:
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
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
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.
Configurando / fazendo acontecer
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
Antes de configurar o DHCP server é necessário definir 3 coisas:
Qual o IP da sua rede local
Qual será o range de IP’s que o servidor irá atribuir
Qual será o DNS Server e o Gateway da rede
Após instalar o isc-dhcp-server devemos editar alguns arquivos com o objetivo de fazer as coisas funcionarem.
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
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
É 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
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
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
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
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.