Linux
Roteador Linux - Parte 2 - Rede e Internet
Esta é a segunda parte de uma série de artigos descrevendo como construir seu próprio roteador Linux.
- Parte 1: Configuração Inicial
- Parte 3: Usuários, segurança e Firewall
- Parte 4: Podman e Unbound
- Parte 5: Wifi
- Parte 6: Nextcloud e Jellyfin
Na primeira parte, abordamos a configuração de hardware e instalamos um sistema Linux básico usando NixOS usando o sistema de arquivos ZFS. Nesta parte, vamos configurar VLANs e suas redes, a conexão PPPoE, configurar o servidor DHCP e implementar regras básicas de firewall.
Índice
VLANs
Nesta configuração, estou usando o switch TP-Link TL-SG108E e farei uso de VLANs.
O que é VLAN
Para atribuir corretamente diferentes redes usando uma única NIC, precisamos utilizar VLANs. Mas o que exatamente é uma VLAN?
VLAN ou LAN Virtual, permite criar redes virtuais, semelhantes a NICs virtuais, para dividir sua rede em dois ou mais segmentos. Em um switch gerenciado, você pode criar VLANs e atribuir portas a cada VLAN como tagged (com tag) ou untagged (sem tag).
- Você pode atribuir várias VLANs do tipo tagged a uma única porta.
- Você só pode atribuir uma VLAN untagged a uma porta.
VLANs sem Tag
Em um switch gerenciado, é possível criar duas ou mais VLANs e dividir a rede. Isso é como ter dois switches separados dentro do mesmo hardware físico. Por exemplo, digamos que queremos criar duas redes isoladas que não podem se comunicar entre si. Podemos atribuir VLAN 1
às portas 1 a 4 e VLAN 2
às portas 5 a 8. Qualquer tráfego vindo da porta 1 poderá alcançar as portas 2, 3 e 4, mas não poderá alcançar nenhum dispositivo conectado às portas 5, 6, 7 ou 8.
VLANs com Tag
Da mesma forma, você pode configurar uma porta usando tags de VLAN. Isso permite que uma única porta manipule o tráfego de várias VLANs, desde que o o host conectado a porta esteja devidamente configurado. Na prática, isso é como ter dois adaptadores de rede distintos conectados a dois switches de rede distintos, mas compartilhando a mesma interface de rede física, cabo e porta do switch.
Por exemplo:
- Porta 1 está tagged com
VLAN 1
eVLAN 2
. - Portas 2 a 4 estão untagged para
VLAN 1
, e portas 5 a 8 estão untagged para VLAN 2.
Qualquer tráfego vindo da porta 1 tagged como VLAN 1
alcançará dispositivos nas portas 2 a 4, mas não aqueles nas portas 5 a 8. Da mesma forma, o tráfego tagged como VLAN 2
alcançará dispositivos nas portas 5 a 8, mas não aqueles nas portas 2 a 4.
Misturando VLANs com e sem Tag
Alguns switches permitem que você misture tráfego tagged e untagged na mesma porta. Isso é útil quando você deseja compartilhar uma porta entre duas ou mais redes. Embora possa parecer complicado, é bastante simples na prática.
Por exemplo, suponha que você tenha uma rede corporativa para tráfego privado e queira permitir que visitantes usem o Wi-Fi da empresa sem acessar a rede privada. No seu gateway, você pode configurar duas LANs virtuais compartilhando a mesma NIC: uma LAN Privada (untagged) e uma LAN de Convidados (tagged como VLAN 2
). Você também pode configurar seus pontos de acesso (APs) com duas LANs virtuais vinculadas a duas redes sem fio: Privada (untagged) e Convidados (tagged como VLAN 2).
A configuração do switch seria:
- VLAN 1 (untagged) em todas as portas.
- VLAN 2 (tagged) nas portas 1 e 2.
Nesta configuração:
O gateway está conectado à porta 1.
O AP está conectado à porta 2.
Qualquer tráfego untagged da porta 1 se comunicará com dispositivos nas portas 1 a 8 sem problemas. No entanto, o tráfego tagged como VLAN 2
da porta 1 só alcançará a porta 2, e o dispositivo na porta 2 só verá o tráfego da VLAN 2
se estiver configurado para lidar com tráfego etiquetado como VLAN 2
. Se você conectar um dispositivo à porta 2 sem configurar a VLAN 2
, ele não receberá nenhum tráfego etiquetado como VLAN 2
, rejeitando o mesmo.
Vantagens
- Custo-benefício: Você pode compartilhar uma NIC, um cabo e uma porta de switch entre várias redes.
Desvantagens
- Largura de banda compartilhada: O tráfego físico e a velocidade são compartilhados entre as VLANs.
- Complexidade: Você precisa tomar nota de quais portas estão atribuídas a quais VLANs.
- Configuração do host: Dispositivos conectados a portas tagged devem ser configurados trabalhar com tráfego VLAN.
No Mac Mini, vamos configurar três redes na mesma interface. Isso significa que o tráfego das redes LAN, GUEST e PPPoE WAN compartilharão o mesmo cabo físico, efetivamente compartilhando a largura de banda. Por exemplo, se você estiver transmitindo um filme, o tráfego será duplicado, pois o Mac Mini lidará tanto com o tráfego vindo da internet quanto com o tráfego enviado para o dispositivo na sua rede.
A minha conexão de internet tem 600 Mbps de download e 150 Mbps de upload, não notei nenhum impacto no desempenho. Isso porque, enquanto o Mac Mini está baixando conteúdo da WAN, ele está simultaneamente enviando-o para a LAN, efetivamente se comportando como uma conexão "half-duplex". Como muitas conexões de internet, incluindo fibra, já são half-duplex, essa configuração não introduz problemas de desempenho significativos. No entanto, tenha em mente que, se você saturar a conexão com mais tráfego, alguma degradação de desempenho por saturação de rede pode ocorrer.
Topologia de Rede
Teremos as seguintes redes:
Network | Interface | VLAN |
---|---|---|
10.1.78.0/24 | Lan | untagged |
10.30.17.0/24 | GUEST | 30 |
10.90.85.0/24 | IoT | 90 |
PPPoE | PPP0 | 2 |
Por hora vamos configurar apenas IPv4. Posteriormente endereçamos IPv6.
- O Switch tem 8 portas.
- VLAN 1: Ports 1, 3 à 8 são untagged.
- VLAN 2: Ports 1 e 2 são tagged.
- VLAN 30: Port 1 e 3 são tagged.
- VLAN 90: Port 1 e 3 são tagged.
┌─────────────► Mac Mini
│ ┌─────────► WAN PPPoE
│ │ ┌─────► AP Unifi U6 Lite
│ │ │ ┌─► Rede Local
│ │ │ │ ▲ ▲ ▲ ▲
┌───┴───┴───┴───┴───┴───┴───┴───┴───┐
| ┌───┬───┬───┬───┬───┬───┬───┬───┐ |
| │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ |
| └───┴───┴───┴───┴───┴───┴───┴───┘ |
└───┬───┬───┬───┬───────────────────┘
│ │ │ └─► 4-8 Untagged VLAN 144
│ │ └─────► Untagged VLAN 1, Tagged VLAN 30, 90
│ └─────────► Untagged VLAN 2
└─────────────► Untagged VLAN 1, Tagged VLAN 2, 30, 90
Mac Mini
Como este Mac Mini só tem uma porta Ethernet, as demais redes serão configuradas via VLAN.
Redes
10.1.78.0/24
é uma bridge vinculada à placa de rede. No meu caso,enp4s0f0
. Essa será untagged para facilitar o acesso do computador pela rede sem a necessidade de configurar uma VLAN em outro host.10.30.17.0/24
éenp4s0f0.30
(VLAN 30) como redeguest
.10.90.85.0/24
éenp4s0f0.90
(VLAN 90) como redeiot
.PPPoE
éenp4s0f0.2
como redewan
para conexões PPPoE.
Configuração do NixOS
Algumas partes eu tirei do Blog do Francis.
Vamos configurar nosso servidor editando os arquivos .nix
conforme necessário. Para manter a organização, vamos criar arquivos separados para suas seções:
/etc/nixos
├── configuration.nix
└── modules/
├── networking.nix # Configurações de rede/ habilita NFTables
├── pppoe.nix # Configuração da conexão PPPoE
├── services.nix # Outros serviços
├── nftables.nft # Configuração de Firewall com NFTables
└── dhcp_server.kea # Configuração do servidor DHCP
1. Arquivos e pastas de configuração
Crie todos as pastas e arquivos necessários:
mkdir -p /etc/nixos/modules
touch /etc/nixos/modules/{{networking,pppoe,services}.nix,nftables.nft,dhcp_server.kea}
2. Configuração básica
Dividiremos nosso configuration.nix
em módulos separados para manter a organização e facilitar a manutenção.
Não substitua o arquivo todo, mas apenas insira as partes destacadas.
/etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
...
boot = {
...
kernel.sysctl = {
"net.ipv4.conf.all.forwarding" = true;
"net.ipv6.conf.all.forwarding" = false;
};
};
...
imports = [
./modules/networking.nix
./modules/services.nix
./modules/pppoe.nix
];
environment.systemPackages = with pkgs; [
bind
conntrack-tools
ethtool
htop
ppp
openssl
tcpdump
vim
];
...
}
3. Rede
Nossa configuração de rede será no modules/networking.nix
.
Como mencionado antes, como esse Mac Mini só tem uma placa de rede, esta configuração se baseará em VLANs para que que essa interface sirva as redes pretendidas: VLANs 1, 30 e 90.
No exemplo, utilizo o adaptador de rede do Macmini enp4s0f0
. Verifique o nome correto do seu adaptador de rede com o comando:
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether c4:2c:90:65:50:13 brd ff:ff:ff:ff:ff:ff
3: wlp3s0b1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 60:34:4c:13:41:f0 brd ff:ff:ff:ff:ff:ff
/etc/nixos/modules/networking.nix
{ config, pkgs, ... }:
let nic = "enp4s0f0"; # Seu adaptador de rede
in
{
networking = {
useDHCP = false;
hostName = "macmini";
nameservers = [ "8.8.8.8" "8.8.4.4" ];
# Define VLANS
vlans = {
wan = { id = 2; interface = "${nic}"; };
guest = { id = 30; interface = "${nic}"; };
iot = { id = 90; interface = "${nic}"; };
};
#Lan will be a bridge to the main adapter.
bridges = {
"lan" = { interfaces = [ "${nic}" ]; };
};
interfaces = {
"${nic}".useDHCP = false;
# Handle VLANs
wan.useDHCP = false;
lan = { ipv4.addresses = [{ address = "10.1.78.1"; prefixLength = 24; } ]; };
guest = { ipv4.addresses = [{ address = "10.30.17.1"; prefixLength = 24; }]; };
iot = { ipv4.addresses = [{ address = "10.90.85.1"; prefixLength = 24; } ]; };
};
firewall.enable = false;
nftables = {
enable = true;
rulesetFile = ./nftables.nft;
flattenRulesetFile = true;
preCheckRuleset = "sed 's/.*devices.*/devices = { lo }/g' -i ruleset.conf";
};
};
}
5. Conexão PPPoE
Configuraremos a conexão PPPoE (protocolo de conexão ponto a ponto pela Ethernet) para acecsso à internet. Essa configuração está no arquivo modules/pppoe.nix
.
/etc/nixos/modules/pppoe.nix
{ config, pkgs, ... }: {
services.pppd = {
enable = true;
peers = {
meuprovedor = {
# Iniciar automaticamente a sessão PPPoE na inicialização
autostart = true;
enable = true;
config = ''
plugin pppoe.so
nic-wan
user "testuser"
password "password"
noipdefault
defaultroute
lcp-echo-interval 5
lcp-echo-failure 3
noauth
persist
noaccomp
default-asyncmap
'';
};
};
};
}
5. Firewall
A configuração do Firewall é feita com nftables
. Inicialmente será uma configuração básica, mas segura, no arquivo nftables.nft
. Esta configuração não permitirá novas conexões vindas da internet, bem como das redes guest
e iot
, enquanto permitirá a entrada de conexões na rede lan
.
A regra flow offloading
, que tem o objetivo de melhorar o desempenho da ligação entre as redes e a internet não funcionou a contento no meu caso. Deixei comentado para caso você queira experimentar. Maiores detalhes aqui.:
/etc/nixos/modules/nftables.nft
table inet filter {
# Flow offloading para melhor performace. Remova se tiver problemas gerar o build.
flowtable ftable {
hook ingress priority 0
devices = { "lan" "ppp0" }
}
chain input {
type filter hook input priority filter; policy drop;
# Permite todo o tráfego na rede local
iifname "lan" counter accept
# Permite conexões de retorno e bloqueia todo o resto
iifname "ppp0" ct state { established, related } counter accept
iifname "ppp0" drop
}
chain output {
type filter hook output priority 100; policy accept;
}
chain forward {
type filter hook forward priority filter; policy drop;
# flow offloading para melhor performace
ip protocol { tcp, udp } flow offload @ftable
# Permite acesso a rede local a intenret
iifname "lan" oifname "ppp0" counter accept comment "Allow trusted LAN to WAN"
# Permite conexões de retorno da wan
iifname "ppp0" oifname {"lan",} ct state established,related counter accept comment "Allow established back to LANs"
# https://samuel.kadolph.com/2015/02/mtu-and-tcp-mss-when-using-pppoe-2/
# Clamp MSS to PMTU for TCP SYN packets
oifname "ppp0" tcp flags syn tcp option maxseg size set 1452
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority filter; policy accept;
}
# Masquerade de pacotes enviados para a internet
chain postrouting {
type nat hook postrouting priority filter; policy accept;
oifname "ppp0" masquerade
}
}
7. Servidor DHCP
A configuração do serviço DHCP será feita pelo kea.dhcp4
.
/etc/nixos/modules/dhcp_server.kea
{
"Dhcp4": {
"valid-lifetime": 4000,
"renew-timer" : 1000,
"rebind-timer": 200,
"interfaces-config" : {
"interfaces": [ "lan", "guest", "iot" ]
},
"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/dhcp4.leases"
},
"subnet4" : [
{
"id": 1,
"interface" : "lan",
"subnet": "10.1.78.0/24",
"pools": [ { "pool": "10.1.78.100 - 10.1.78.200" } ],
"option-data": [
{ "name": "routers", "data": "10.1.78.1" },
{ "name": "domain-name-servers", "data": "8.8.8.8" },
{ "name": "domain-search", "data": "example.com" }
]
},
{
"id": 2,
"interface" : "guest",
"subnet": "10.30.17.0/24",
"pools": [ { "pool": "10.30.17.100 - 10.30.17.200" } ],
"option-data": [
{ "name": "routers", "data": "10.30.17.1" },
{ "name": "domain-name-servers", "data": "8.8.8.8" },
]
},
{
"id": 3,
"interface" : "iot",
"subnet": "10.90.85.0/24",
"pools": [ { "pool": "10.90.85.100 - 10.90.85.200" } ],
"option-data": [
{ "name": "routers", "data": "10.90.85.1" },
{ "name": "domain-name-servers", "data": "8.8.8.8" },
]
}
]
}
}
8. Serviços
Remova services
do configuration.nix
e coloque em services.nix
encontraremos os principais serviços necessários para o funcionamento do sistema. Vamos habilitar o serviço SSH e também o Servidor DHCP do Kea.
Como uma medida temporária, permitiremos o acesso do usuário root
via SSH usando autenticação por senha.
/etc/nixos/modules/services.nix
{ config, pkgs, ... }:
{
services = {
envfs.enable = true;
# Habilitar serviço SSH
openssh = {
enable = true;
settings.PermitRootLogin = "yes"; # Permitir login root (opcional, por razões de segurança você pode querer desativar isso)
settings.PasswordAuthentication = true; # Habilita autenticação por senha
};
kea.dhcp4.enable = true;
kea.dhcp4.configFile = ./dhcp_server.kea;
};
}
9. Aplicar mudanças
Para as mudanças surtirem efeito, é necessário aplica-las com o comando:
nixos-rebuild switch
Conclusão
Isso é tudo por enquanto! Na próxima parte, vamos focar em melhorar a segurança desativando o login da conta root, habilitando o acesso SSH via autenticação por chave e reforçando ainda mais o firewall com regras e permissões mais granulares.
- Parte 3: Usuários, segurança e Firewall
keywords: macmini • roteador • linux • nixos • pppoe • unifi • ubiquiti • apple • vlan • tl-sg108e