Qual é a diferença de materiais semelhantes?
- Implementação pura do OpenWrt
- Usando o WireGuard
- A configuração do roteador é organizada usando configurações OpenWrt, e não um monte em um script
- Existem situações ao reiniciar a rede e reiniciar
- Consome poucos recursos do roteador: sub-redes bloqueadas estão contidas nas tabelas de ip e não nas tabelas de roteamento. O que permite que você implante esse negócio, mesmo em dispositivos fracos
- Automatize a configuração usando o Ansible (nenhum python é necessário no roteador)
Versão em vídeo
Por que OpenWrt e WireGuard?
O OpenWrt é instalado em tantos modelos de roteadores soho, é configurado e expandido conforme seu coração deseja. Agora, muitos firmwares de roteador são complementos pelo OpenWrt.
O Wireguard é usado devido à sua configuração rápida e fácil e também devido à alta velocidade de transmissão através do túnel.
Um pouco sobre o WireGuard
No nosso caso, o servidor é um VPS fora do ILV, o cliente é um roteador OpenWrt em casa. Quando você quer ir para pornolab telegrama, seu roteador direcionará o tráfego através de um servidor com o WireGuard.
O WireGuard gera uma conexão site a site, ou seja, o servidor e o cliente têm o lado servidor e cliente da configuração. Se não estiver claro, ficará claro quando você ver a configuração.
O servidor e o cliente têm suas próprias chaves públicas e privadas.
Configurando o WireGuard no servidor
Estou fazendo tudo no Ubuntu 18.04, mas na documentação oficial há instruções de instalação para todos os SO conhecidos e não muito.
Instalação
sudo add-apt-repository ppa:wireguard/wireguard
Se ocorrer um erro
sudo: add-apt-repository: command not found
Instalar software-properties-common - o pacote oferece a capacidade de adicionar e remover PPA
sudo apt install software-properties-common
sudo apt update sudo apt install wireguard-dkms wireguard-tools
Geramos chaves para o servidor. Salvaremos as chaves no diretório WireGuard por conveniência.
cd /etc/wireguard/ wg genkey | tee privatekey-server | wg pubkey > publickey-server
Consequentemente, haverá uma chave privada no arquivo privatekey-server e uma chave pública no publickey-server.
Também geramos imediatamente uma chave para o cliente:
wg genkey | tee privatekey-client | wg pubkey > publickey-client

Configuração
A configuração é armazenada em /etc/wireguard/wg0.conf. O lado do servidor fica assim:
[Interface] Address = 192.168.100.1 PrivateKey = privatekey-server ListenPort = 51820 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
Endereço - endereço da interface wg (endereço dentro do túnel)
PrivateKey - Chave privada (privatekey-server)
ListenPort - a porta na qual o serviço está aguardando a conexão
Bem, nós fazemos disfarces, porque usaremos este servidor para acessar a Internet
Observe que o nome da interface no seu caso pode ser diferente:
Parte do cliente
[Peer] PublicKey = publickey-client AllowedIPs = 192.168.100.3/24
PublicKey - a chave pública do nosso roteador (publickey-client)
IPs permitidos são as sub-redes que estarão disponíveis nesse túnel. O servidor precisa apenas acessar o endereço do cliente.
Ambas as partes são armazenadas em uma configuração.
Ative a inicialização automática na reinicialização:
systemctl enable wg-quick@wg0
Tornamos o servidor um roteador:
sysctl -w net.ipv4.ip_forward=1
Configure o firewall. Suponha que apenas tenha WireGuard e ssh em nosso servidor:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A INPUT -p icmp -j ACCEPT sudo iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -j DROP
Salve a configuração do iptables:
sudo apt-get install iptables-persistent sudo netfilter-persistent save
Aumentamos a interface wg pela primeira vez manualmente:
wg-quick up wg0

O servidor WireGuard está pronto.
UPD 27/06/19 Se o seu provedor ainda usa PPoE, você precisa adicionar uma regra. Obrigado denix123
iptables -t mangle -I POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Configuração do roteador
Estou usando o OpenWrt versão 18.06.1 no Xiaomi mi 3G e no Asus RT-N16.
A lógica do roteador
Carregamos as listas, colocamos em iptables, iptables marca todos os endereços dessas listas com um marcador 0x1. Além disso, todos os pacotes marcados com 0x1 vão para uma tabela de roteamento separada, todos os pacotes que caem nessa tabela de roteamento passam pela interface wg.

Instalação do pacote
Quanto ao espaço ocupado no flash, tudo precisará de aproximadamente 0,9 MB. Se você tiver um péssimo lugar, substitua curl pelo wget e talvez não seja necessário instalar o dnscrypt-proxy.
Nós colocamos pacotes. No OpenWrt, isso é fácil através do gerenciador de pacotes opkg:
opkg update opkg install ipset wireguard curl
Listas de downloads
Tudo o que pode ser feito através dos recursos padrão do OpenWrt é feito através deles. Tudo o resto (exceto hotplug) eu coloquei em um pequeno script:
As listas de sub-redes e endereços proibidos são obtidas por arquivos. Para eles, criamos um diretório em / tmp. Em / tmp - por ser RAM, esse recurso do OpenWrt é bastante conveniente. Não vale a pena escrever algo na ROM do roteador novamente.
Distribuímos as listas com o antifilter.download curl, o sinalizador z significa que o curl baixará o arquivo apenas se o arquivo remoto for diferente do local ou se não, como, por exemplo, ao carregar um roteador.
subnet.lst - uma lista de sub-redes bloqueadas, que não muda frequentemente.
ipsum.lst é uma lista de endereços bloqueados, resumidos pela máscara. Em vez de 150 mil registros, obtemos 15 mil - convenientemente.
Depois que tivermos os arquivos, reiniciarmos o firewall, isso é necessário para o ipset funcionar e adicionar listas ao iptables, configuraremos o ipset em / etc / config / firewall.
Este script que adicionamos no /etc/init.d/ será chamado hirkn. Torne executável
chmod +x /etc/init.d/hirkn
Agora, não temos apenas um script, mas um serviço completo. Para iniciar na inicialização, criamos um link simbólico em /etc/rc.d. Precisamos que ele inicie após todos os outros serviços, portanto criamos o prefixo S99
ln -s /etc/init.d/hirkn /etc/rc.d/S99hirkn
As listas precisam ser atualizadas periodicamente; adicionamos registro no cron:
crontab -e
0 4 * * * /etc/init.d/hirkn
Parece bastante suficiente atualizá-los uma vez por dia. Lembre-se de que, ao adicionar listas ao ipset, a rede cai; no meu caso, são 2 segundos.
UPD : Se você não quer quebras, então sigo73 e Grayver sugeriram nos comentários como fazer isso.
Ligue também a coroa, por padrão ela está desativada:
/etc/init.d/cron enable /etc/init.d/cron start
Configuração da tabela de roteamento
Crie uma tabela de roteamento para o tráfego através do túnel, simplesmente adicionando a linha:
99 vpn
para o arquivo / etc / iproute2 / rt_tables.
Você pode criar uma rota padrão para a tabela "vpn" através da interface wg com o comando:
ip route add table vpn default dev wg0
Porém, quando você reinicia a rede, a rota desaparece, e criamos o arquivo 30-rknroute no diretório /etc/hotplug.d/iface/ com conteúdo simples:
Isso significa que, quando você liga / desliga as interfaces, nossa rota será adicionada. E, portanto, essa rota será sempre registrada.
Configuração de rede
Precisamos configurar o WireGuard e a regra para pacotes rotulados como 0x1.
A configuração do WireGuard está localizada em / etc / config / network
A parte "servidor":
config interface 'wg0' option private_key 'privatekey-client' list addresses '192.168.100.3/24' option listen_port '51820' option proto 'wireguard'
private_key é o privatekey-client que geramos ao configurar o servidor
listar endereços - endereço da interface wg
listen_port - a porta na qual o WireGuard aceita conexões. Mas a conexão ocorrerá através da porta no servidor, portanto, aqui não abriremos a porta no firewall para ela
proto - especifique o protocolo para que o openwrt entenda que esta é uma configuração do WireGuard
Parte "Cliente":
config wireguard_wg0 option public_key 'publickey-server' option allowed_ips '0.0.0.0/0' option route_allowed_ips '0' option endpoint_host 'wg-server-ip' option persistent_keepalive '25' option endpoint_port '51820'
public_key - chave publickey-server
allowed_ips - sub-redes nas quais o tráfego pode passar pelo túnel; no nosso caso, não são necessárias restrições; portanto, 0.0.0.0/0
route_allowed_ips - um sinalizador que faz uma rota através da interface wg para as redes listadas a partir do parâmetro allowed_ips. No nosso caso, isso não é necessário, o iptables faz este trabalho
endpoint_host - ip / url do nosso servidor wg
persistent_keepalive - intervalo de tempo após o qual os pacotes são enviados para suportar a conexão
endpoint_port - porta wireguard no servidor
Também adicionaremos uma regra à configuração da rede que enviará todo o tráfego marcado como 0x1 para a tabela de roteamento "vpn":
config rule option priority '100' option lookup 'vpn' option mark '0x1'
Configuração de firewall
Nós adicionamos duas regras para marcar pacotes, que não se encaixam na sintaxe UCI openwrt, portanto as adicionamos "como estão" ao /etc/firewall.user.
UPD : Grayver sugeriu que eles se encaixassem muito bem. Nós os definimos depois de configurar o ipset
A configuração do firewall está em / etc / config / firewall
Adicione uma zona para wireguard. No openwrt, as zonas são cadeias personalizadas no iptables. Assim, uma zona com uma / várias interfaces é criada e as regras já estão penduradas nela. A zona para wg fica assim:
config zone option name 'wg' option family 'ipv4' option masq '1' option output 'ACCEPT' option forward 'REJECT' option input 'REJECT' option mtu_fix '1' option network 'wg0'
Permitimos apenas que o tráfego saia da interface e habilitemos o mascaramento.
Agora você precisa habilitar o encaminhamento da zona lan para a zona wg:
config forwarding option src 'lan' option dest 'wg'
Bem, a última coisa é criar listas no iptables usando o ipset:
config ipset option name 'vpn_subnets' option storage 'hash' option loadfile '/tmp/lst/subnet.lst' option match 'dst_net' config ipset option name 'vpn_ipsum' option storage 'hash' option loadfile '/tmp/lst/ipsum.lst' option match 'dst_net'
loadfile - o arquivo do qual tiramos a lista
nome - nome da nossa lista
armazenamento , correspondência - aqui especificamos como armazenar e que tipo de dados. Vamos armazenar o tipo "sub-rede"
UPD : Se você quiser usar a lista de endereços IP individuais, precisará aumentar o tamanho da lista de ipsets. No ipset de configuração, adicione
option hashsize '1000000' option maxelem '1000000'
Caso contrário, você receberá um erro
ipset v6.38: Hash is full, cannot add more elements
UPD : adicione duas regras para rotular pacotes
config rule option name 'mark_subnet' option src 'lan' option proto 'all' option ipset 'vpn_subnets' option set_mark '0x1' option target 'MARK' config rule option name 'mark_ipsum' option src 'lan' option proto 'all' option ipset 'vpn_ipsum' option set_mark '0x1' option target 'MARK'
Essas regras implicam que todos os pacotes que vão para as sub-redes das listas vpn_subnets e vpn_ipsum devem ser marcados com 0x1.
Depois disso, reiniciaremos a rede:
/etc/init.d/network restart

e execute o script:
/etc/init.d/hirkn

Depois de elaborar o script, tudo deve funcionar para você. Verifique a rota no cliente do roteador:
mtr/traceroute telegram.org/linkedin.com

Bônus de configuração do DNSCrypt
Porque Seu provedor pode substituir cuidadosamente o endereço IP do recurso bloqueado, redirecionando você para seu IP com um stub. Bem, nosso desvio de IP não ajudará nesse caso. Para substituição, nem sempre é necessário usar o servidor DNS do provedor, suas solicitações podem ser interceptadas e as respostas serão substituídas. Bem, a propósito, não apenas o provedor pode fazer isso.
opkg install dnscrpt-proxy
Configure a configuração / etc / config / dnscrypt-proxy da seguinte maneira:
config dnscrypt-proxy ns1 option address '127.0.0.1' option port '5353' option resolver 'cpunks-ru'
Portanto, temos o serviço dnscrypt na porta 5353 disponível no host local.
Resolver é um servidor DNS que suporta criptografia. No roteador, o arquivo /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv contém uma lista de servidores disponíveis no momento do lançamento da versão instalada do dnscrypt. E aqui está https://dnscrypt.info/public-servers/ em geral todos os servidores dnscrypt disponíveis. Você pode escolher outro resolvedor e / ou adicionar servidores para tolerância a falhas. Lembre-se de que, para o DNSCrypt funcionar com o resolvedor selecionado, ele deve ser especificado em dnscrypt-resolvers.csv.
Configuramos o dnsmasq para funcionar com o dnscrypt. Em / etc / config / dhcp, comente a linha:
option resolvfile '/tmp/resolv.conf.auto'
para que os servidores DNS do provedor não estejam envolvidos.
E adicione:
list server '/pool.ntp.org/208.67.222.222' list server '127.0.0.1#5353'
A entrada 'domain / ip_dns' do servidor de lista indica qual servidor DNS usar para resolver o domínio especificado. Portanto, não usamos dnscrypt para sincronização ntp - é importante que o serviço dnscrypt tenha a hora atual.
Quando o roteador é carregado, o script hirkn é executado mais rapidamente do que o dnscrypt inicia, para que o domínio antifilter.download não seja resolvido e as listas não sejam baixadas. Você pode adiar ou algo mais, mas até agora não vejo razão.
UPD : precisa adicionar uma linha
START=99
script hirkn
Como resultado, obtemos essa inserção na configuração:
UPD : Em alguns dispositivos, o DNSCrypt é iniciado assim mesmo após o script. A maneira mais fácil de corrigir isso é adicionar a linha em / etc / config / dhcp
list server '/antifilter.download/208.67.222.222'
Desabilitar o uso do DNS do provedor para a interface wan
Em / etc / config / network, adicione a linha
option peerdns '0'
para a interface wan.
Temos essa configuração
config interface 'wan' option ifname 'eth0.2' option proto 'dhcp' option peerdns '0'
Reinicie a rede
/etc/init.d/network restart
Adicione à inicialização e inicie o dnscrypt:
/etc/init.d/dnscrypt-proxy enable /etc/init.d/dnscrypt-proxy start
Reinicie o dnsmasq:
/etc/init.d/dnsmasq restart

Ilustração do trabalho sem DNSCrypt e com DNSCrypt
Implantado automaticamente com o Ansible
Playbook e modelos estão no github . Ele usa um módulo , não precisa de python no roteador e há suporte para uci. Tentei garantir que sua configuração do OpenWrt permanecesse intocada, mas tome cuidado de qualquer maneira.
Instale o módulo gekmihesg / ansible-openwrt:
ansible-galaxy install gekmihesg.openwrt
Copie o playbook e tempeyta:
cd /etc/ansible git clone https://github.com/itdoginfo/ansible-openwrt-hirkn mv ansible-openwrt-hirkn/* . rm -rf ansible-openwrt-hirkn
Adicione seu roteador aos hosts:
[openwrt] 192.168.1.1
Substitua suas variáveis em hirkn.yml:
vars: ansible_template_dir: /etc/ansible/templates/ wg_server_address: wg_server_ip/url wg_private_key: privatekey-client wg_public_key: publickey-server wg_listen_port: 51820 wg_client_port: 51820 wg_client_address: 192.168.100.3/24
Certifique-se de definir:
wg_server_address - servidor de wireguard de ip / url
wg_private_key , wg_public_key - chave privada do cliente e servidor público
O restante não pode ser alterado ou alterado, dependendo de como o servidor WireGuard está configurado
Iniciar playbook
ansible-playbook playbooks/hirkn.yml
Depois de concluir o manual, o roteador começará imediatamente a ignorar os bloqueios através do servidor wireguard.
Por que não BGP?
No openwrt, existem dois utilitários que implementam o BGP - quagga e bird. Quagg Não consegui coletar dados do anti-filtro. Bird fez amizade com o serviço a meio chute, mas, infelizmente, não entendi como forçar a interface padrão a ser adicionada às sub-redes recebidas. (Ficarei feliz em saber como isso pode ser implementado).
Nos comentários sobre esses artigos, vi que os roteadores das pessoas estavam "pensativos" por um tempo, quando colocaram listas na tabela de roteamento. Com a implementação por ipset, meu Xiaomi mi 3G pensa por 2 segundos (Asus rt-n16 por 5 segundos), quando você o alimenta com uma lista de 15 mil sub-redes. Com mais trabalho, não notei a carga no processador.
Todos os materiais não são um plano de ação e são apresentados para familiarização com a funcionalidade do sistema operacional Linux.