O iptables é uma ferramenta muito potente e flexivel. No meu caso, uso-o para configurar uma vps, que está exposta a internet, como um router com uma ligação vpn do wireguard. De forma a que a vps seja o ponto de entrada nesta minha rede virtual.
O meu router virtual é uma VPS que corre o Ubuntu Server 22. A maquina tem 2 interfaces de rede.
eth0 - É a interface que a maquina usa pra aceder a internet. Tem o endereço publico dos serviços.
wg0 - É uma interface virtual, é usada para aceder a rede virtual. É implementada pelo wireguard.
Por padrão o linux não rencaminha pacotes entre interfaces. Para tal tem de ser adicionada a seguinte linha ao ficheiro "/etc/sysctl.conf".
net.ipv4.ip_foward=1
De seguida é necessario dizer ao iptables com há de fazer a tradução de endereços.
# reescrever endereco fonte no trafego que entra
-A POSTROUTING -o eth0 -j MASQUERADE
## permitir reencaminhar trafego tcp quando ja aberto
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
## permitir reencaminhar para fora sempre
-A FORWARD -i wg0 -o eth0 -j ACCEPT
## permitir reencaminhar para dentro caso seja uma ligacao já aberta
-A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Com estas configurações o iptables vai permitir que a maquina seja usada como gateway. Mas tambem pertendemos expor alguns servicos à internet.Para cada servico é necessario criar estas regras.
## permitir reencaminhar para esta maquina e porta
-A FORWARD -d 192.168.x.x/32 -p tcp -m tcp --dport 80 -j ACCEPT
## permitir reencaminhar de esta maquina e porta
-A FORWARD -s 192.168.x.x/32 -p tcp -m tcp --sport 80 -j ACCEPT
## reescrever para que o trafego seja correctamente reencaminhado
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.x.x:80
## rescrever para que o hospede remoto reencaminhe o trafego de volta.
-A POSTROUTING -d 192.168.x.x/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.y.y ## <- ip do router
## Redundante caso se use a regra -A POSTROUTING -o eth0 -j MASQUERADE
Com o servico acessivel a partir da internet, é necessario aumentar os limites definidos em "/etc/sysctl.conf". Para aplicar sem reiniciar usa-se "sysctl -p"
## exemplo de limites que devem de ser aumentados.
net.ipv4.ip_local_port_rangeal rout
net.core.somaxconn
net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_tcp_timeout_time_wait
net.netfilter.nf_conntrack_tcp_timeout_close_wait
net.netfilter.nf_conntrack_tcp_timeout_fin_wait
Tendo em conta a politica de segurança de rejeitar por defeito. (:INPUT DROP
) É necessario definir uma excepção na cadeia de input para o daemon de SSH ou VNC para mantermos o accesso a nossa VPS.
Para tornar as nossas regras permanentes pode ser usado o pacote iptables-presistent.
iptables-save > /etc/iptables/rules.v4
A configuração aqui presente é meramente ilustrativa, e deve ser adaptada consoante a situação ou funcionalidade pertendida. Pode ser, por exemplo, configurado um load balancer.