Tentukan pemblokiran PKH pada router OpenWrt dengan WireGuard dan DNSCrypt

Apa perbedaan dari bahan serupa?


  • Implementasi OpenWrt murni
  • Menggunakan WireGuard
  • Konfigurasi router diatur menggunakan konfigurasi OpenWrt, dan tidak banyak dalam satu skrip
  • Ada beberapa situasi ketika me-restart jaringan dan me-reboot
  • Mengkonsumsi sedikit sumber daya router: subnet yang dikunci terkandung dalam iptables, dan tidak dalam tabel routing. Apa yang memungkinkan Anda untuk menggunakan bisnis ini bahkan di perangkat yang lemah
  • Konfigurasi otomatis menggunakan Ansible (tidak diperlukan python di router)

Versi video



Mengapa OpenWrt dan WireGuard?


OpenWrt diinstal pada banyak model router soho, dikonfigurasi dan diperluas sesuai keinginan hati Anda. Sekarang banyak firmware router add-on di atas OpenWrt.


Wireguard digunakan karena pengaturannya yang cepat dan mudah, dan juga karena kecepatan transmisi yang tinggi melalui terowongan.


Sedikit tentang WireGuard


Dalam kasus kami, server adalah VPS di luar ILV, klien adalah router OpenWrt di rumah. Ketika Anda ingin pergi ke pornolab telegram, router Anda akan mengarahkan lalu lintas melalui server dengan WireGuard.
WireGuard memunculkan koneksi situs ke situs, mis. baik server dan klien memiliki server dan sisi klien dari konfigurasi. Jika tidak jelas, akan menjadi jelas ketika Anda melihat konfigurasi.


Server dan klien memiliki kunci privat dan publik mereka sendiri.


Mengkonfigurasi WireGuard di server


Saya melakukan semuanya di Ubuntu 18.04, tetapi dalam dokumentasi resmi ada instruksi instalasi untuk semua OS yang dikenal dan tidak terlalu.


Instalasi


sudo add-apt-repository ppa:wireguard/wireguard 

Jika terjadi kesalahan
 sudo: add-apt-repository: command not found 


Instal perangkat lunak-properties-common - paket menyediakan kemampuan untuk menambah dan menghapus PPA
 sudo apt install software-properties-common 


 sudo apt update sudo apt install wireguard-dkms wireguard-tools 

Kami membuat kunci untuk server. Kami akan menyimpan kunci di direktori WireGuard untuk kenyamanan.


 cd /etc/wireguard/ wg genkey | tee privatekey-server | wg pubkey > publickey-server 

Dengan demikian, akan ada kunci pribadi dalam file server privatekey, dan kunci publik di file server publickey.
Kami juga segera menghasilkan kunci untuk klien:


 wg genkey | tee privatekey-client | wg pubkey > publickey-client 


Konfigurasi


Konfigurasi disimpan di /etc/wireguard/wg0.conf. Sisi server terlihat seperti ini:


 [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 

Alamat - alamat untuk antarmuka wg (alamat di dalam terowongan)
PrivateKey - Kunci pribadi (privatekey-server)
ListenPort - Port tempat layanan menunggu untuk terhubung


Ya, kami memang menyamar, karena kami akan menggunakan server ini untuk mengakses Internet
Harap perhatikan bahwa nama antarmuka dalam kasing Anda mungkin berbeda:


Bagian klien


 [Peer] PublicKey = publickey-client AllowedIPs = 192.168.100.3/24 

PublicKey - kunci publik dari router kami (publickey-client)
IP yang diizinkan adalah subnet yang akan tersedia melalui terowongan ini. Server hanya perlu akses ke alamat klien.


Kedua bagian disimpan dalam satu konfigurasi.


Nyalakan autostart saat reboot:


 systemctl enable wg-quick@wg0 

Kami menjadikan server sebagai router:


 sysctl -w net.ipv4.ip_forward=1 

Konfigurasikan firewall. Misalkan kita hanya memiliki WireGuard dan ssh di server kami:


 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 

Simpan konfigurasi iptables:


 sudo apt-get install iptables-persistent sudo netfilter-persistent save 

Kami meningkatkan antarmuka wg untuk pertama kalinya secara manual:


 wg-quick up wg0 


Server WireGuard sudah siap.


UPD 06/27/19 Jika penyedia Anda masih menggunakan PPoE, maka Anda perlu menambahkan aturan. Terima kasih denix123


 iptables -t mangle -I POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 

Pengaturan router


Saya menggunakan OpenWrt versi 18.06.1 pada Xiaomi mi 3G dan Asus RT-N16.


Logika dari router


Kami memuat daftar, menempatkannya di iptables, iptables menandai semua alamat dari daftar ini dengan penanda 0x1. Selanjutnya, semua paket yang ditandai dengan 0x1 pergi ke tabel routing terpisah, semua paket yang masuk ke tabel routing ini pergi melalui antarmuka wg.



Instalasi Paket


Adapun ruang yang ditempati pada flash, semuanya akan membutuhkan sekitar 0,9MB. Jika Anda memiliki tempat yang sangat buruk, ganti curl dengan wget dan Anda mungkin tidak perlu menginstal dnscrypt-proxy.


Kami menaruh paket. Di OpenWrt, ini mudah dilakukan melalui manajer paket opkg:


 opkg update opkg install ipset wireguard curl 

Daftar unduhan


Segala sesuatu yang dapat dilakukan melalui fitur standar OpenWrt dilakukan melalui mereka. Segala sesuatu yang lain (kecuali hotplug) saya masukkan ke dalam skrip kecil:


 #!/bin/sh START=99 dir=/tmp/lst mkdir -p $dir echo "Run download lists" curl -z $dir/subnet.lst https://antifilter.download/list/subnet.lst --output $dir/subnet.lst curl -z $dir/ipsum.lst https://antifilter.download/list/ipsum.lst --output $dir/ipsum.lst echo "Firewall restart" /etc/init.d/firewall restart 

Daftar subnet dan alamat terlarang diperoleh melalui file. Bagi mereka, kita membuat direktori di / tmp. Di / tmp - karena RAM, fitur OpenWrt seperti itu cukup nyaman. Tidak ada gunanya menulis sesuatu di ROM router lagi.


Kami memompa daftar dengan antifilter.download curl, z flag berarti bahwa curl akan mengunduh file hanya jika file jarak jauh berbeda dari file lokal atau jika tidak ada, seperti halnya saat memuat router.


subnet.lst - daftar subnet yang diblokir, tidak sering berubah.
ipsum.lst adalah daftar alamat yang diblokir, yang dirangkum oleh mask. Alih-alih 150 ribu catatan, kami mendapatkan 15 ribu - dengan mudah.


Setelah kita memiliki file, kita me-restart firewall, ini diperlukan agar ipset berfungsi dan menambahkan daftar ke iptables, kita akan mengkonfigurasi ipset di /etc/config / firewall.


Script ini kita tambahkan di /etc/init.d/ akan disebut hirkn. Jadikan itu dapat dieksekusi


 chmod +x /etc/init.d/hirkn 

Sekarang kami tidak hanya memiliki skrip, tetapi seluruh layanan. Agar dapat mulai saat boot, kami membuat symlink di /etc/rc.d. Kami membutuhkannya untuk memulai setelah semua layanan lain, jadi kami membuat awalan S99


 ln -s /etc/init.d/hirkn /etc/rc.d/S99hirkn 

Daftar perlu diperbarui dari waktu ke waktu, kami menambahkan catatan di cron:


 crontab -e 

 0 4 * * * /etc/init.d/hirkn 

Tampaknya cukup memadai untuk memperbaruinya sekali sehari. Perlu diingat bahwa ketika menambahkan daftar ke ipset, jaringan jatuh, dalam kasus saya ini 2 detik.
UPD : Jika Anda tidak ingin istirahat, maka sigo73 dan Grayver menyarankan dalam komentar bagaimana melakukan ini.


Aktifkan juga mahkota, secara default dinonaktifkan:


 /etc/init.d/cron enable /etc/init.d/cron start 

Konfigurasi tabel perutean


Buat tabel routing untuk lalu lintas melalui terowongan dengan hanya menambahkan baris:


 99 vpn 

ke file / etc / iproute2 / rt_tables.


Anda dapat membuat rute default untuk tabel "vpn" melalui antarmuka wg dengan perintah:


 ip route add table vpn default dev wg0 

Tetapi ketika Anda me-restart jaringan, rute menghilang, jadi kami membuat file 30-rknroute di direktori /etc/hotplug.d/iface/ dengan konten sederhana:


 #!/bin/sh ip route add table vpn default dev wg0 

Ini berarti bahwa ketika Anda menghidupkan / mematikan antarmuka, rute kami akan ditambahkan. Dan karenanya, rute ini akan selalu terdaftar.


Konfigurasi jaringan


Kita perlu mengkonfigurasi WireGuard dan aturan untuk paket berlabel 0x1.


Konfigurasi WireGuard terletak di / etc / config / network


Bagian "server":


 config interface 'wg0' option private_key 'privatekey-client' list addresses '192.168.100.3/24' option listen_port '51820' option proto 'wireguard' 

private_key adalah privatekey-client yang kami hasilkan saat mengonfigurasi server
daftar alamat - alamat antarmuka wg
listen_port - port tempat WireGuard menerima koneksi. Tetapi koneksi akan terjadi melalui port di server, jadi di sini kita tidak akan membuka port di firewall untuk itu
proto - tentukan protokolnya sehingga openwrt akan mengerti bahwa ini adalah konfigurasi WireGuard


Bagian "Klien":


 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 - kunci publickey-server
allow_ips - subnet di mana lalu lintas dapat melewati terowongan, dalam kasus kami tidak ada batasan yang diperlukan, oleh karena itu 0.0.0.0/0
route_allowed_ips - flag yang membuat rute melalui antarmuka wg untuk jaringan yang terdaftar dari parameter allow_ips. Dalam kasus kami, ini tidak perlu, iptables berfungsi
endpoint_host - ip / url dari server wg kami
persistent_keepalive - interval waktu setelah paket dikirim untuk mendukung koneksi
endpoint_port - port wireguard di server


Kami juga akan menambahkan aturan ke konfigurasi jaringan yang akan mengirim semua lalu lintas bertanda 0x1 ke tabel routing "vpn":


 config rule option priority '100' option lookup 'vpn' option mark '0x1' 

Konfigurasi firewall


Kami menambahkan dua aturan untuk menandai paket, mereka tidak cocok dengan sintaks UCI openwrt, jadi kami menambahkannya "sebagaimana adanya" ke /etc/firewall.user.
UPD : Grayver menyarankan agar mereka cocok. Kami mengaturnya setelah mengatur ipset


Konfigurasi firewall ada di / etc / config / firewall


Tambahkan zona untuk penyadapan. Di openwrt, zona adalah rantai khusus di iptables. Dengan demikian, zona dengan satu / beberapa antarmuka dibuat dan aturan sudah digantung padanya. Zona untuk wg terlihat seperti ini:


 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' 

Kami hanya mengizinkan lalu lintas untuk keluar dari antarmuka dan mengaktifkan penyamaran.


Sekarang Anda perlu mengaktifkan penerusan dari zona lan ke zona wg:


 config forwarding option src 'lan' option dest 'wg' 

Nah, hal terakhir adalah membuat daftar di iptables menggunakan 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 - file dari mana kita mengambil daftar
nama - nama untuk daftar kami
penyimpanan , cocok - di sini kami menentukan cara menyimpan dan jenis data apa. Kami akan menyimpan jenis "subnet"


UPD : Jika Anda ingin menggunakan daftar masing-masing alamat IP, maka Anda perlu menambah ukuran daftar ipset. Dalam config ipset add


  option hashsize '1000000' option maxelem '1000000' 

Kalau tidak, Anda akan mendapatkan kesalahan


 ipset v6.38: Hash is full, cannot add more elements 

UPD : Tambahkan dua aturan untuk paket pelabelan


 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' 

Aturan-aturan ini menyiratkan bahwa semua paket pergi ke subnet dari vpn_subnets dan daftar vpn_ipsum harus ditandai dengan 0x1.


Setelah itu, kami me-restart jaringan:


 /etc/init.d/network restart 


dan jalankan skrip:


 /etc/init.d/hirkn 


Setelah mengerjakan skrip, semuanya akan bekerja untuk Anda. Periksa rute pada klien router:


 mtr/traceroute telegram.org/linkedin.com 


Bonus mengkonfigurasi DNSCrypt


Mengapa Penyedia Anda dapat dengan hati-hati mengganti alamat ip dari sumber daya yang diblokir, sehingga mengarahkan Anda ke ip Anda dengan sebuah rintisan, yah, bypass IP kami tidak akan membantu dalam kasus ini. Untuk substitusi, tidak selalu perlu menggunakan server dns penyedia, permintaan Anda dapat dicegat dan balasan akan diganti. Omong-omong, bukan hanya penyedia yang bisa melakukan ini.


 opkg install dnscrpt-proxy 

Konfigurasikan konfigurasi / etc / config / dnscrypt-proxy seperti ini:


 config dnscrypt-proxy ns1 option address '127.0.0.1' option port '5353' option resolver 'cpunks-ru' 

Jadi kami memiliki layanan dnscrypt pada port 5353 yang tersedia di localhost.


Resolver adalah server yang mendukung enkripsi dns. Pada router, file /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv berisi daftar server yang tersedia pada saat rilis versi dnscrypt yang diinstal. Dan di sini adalah https://dnscrypt.info/public-servers/ secara umum semua server dnscrypt yang tersedia. Anda dapat memilih resolver lain dan / atau menambah server untuk toleransi kesalahan. Perlu diingat bahwa agar DNSCrypt dapat bekerja dengan resolver yang dipilih, itu harus ditentukan dalam dnscrypt-resolvers.csv.


Kami mengkonfigurasi dnsmasq agar berfungsi dengan dnscrypt. Di / etc / config / dhcp, beri komentar di baris:


 option resolvfile '/tmp/resolv.conf.auto' 

sehingga penyedia server dns tidak terlibat.


Dan tambahkan:


  list server '/pool.ntp.org/208.67.222.222' list server '127.0.0.1#5353' 

Entri daftar server 'domain / ip_dns' menunjukkan server dns mana yang digunakan untuk menyelesaikan domain yang ditentukan. Dengan demikian, kami tidak menggunakan dnscrypt untuk sinkronisasi ntp - penting bagi layanan dnscrypt untuk memiliki waktu saat ini.


Ketika router memuat, skrip hirkn berjalan lebih cepat daripada dnscrypt dimulai, sehingga domain antifilter.download tidak menyelesaikan dan daftar tidak diunduh. Anda dapat membuat penundaan atau hal lain untuk muncul, tetapi sejauh ini saya tidak melihat alasan.
UPD : perlu menambahkan baris


 START=99 

ke skrip hirkn


Akibatnya, kami mendapatkan sisipan seperti itu di konfigurasi:


  #option resolvfile '/tmp/resolv.conf.auto' list server '/pool.ntp.org/208.67.222.222' list server '127.0.0.1#5353' 

UPD : Pada beberapa perangkat, DNSCrypt tetap dimulai setelah skrip. Cara termudah untuk memperbaikinya adalah dengan menambahkan baris ke / etc / config / dhcp


  list server '/antifilter.download/208.67.222.222' 

Nonaktifkan penggunaan DNS penyedia untuk antarmuka yang lemah
Di / etc / config / network tambahkan baris


 option peerdns '0' 

ke antarmuka yang lemah.
Kami mendapatkan konfigurasi ini


 config interface 'wan' option ifname 'eth0.2' option proto 'dhcp' option peerdns '0' 

Mulai ulang jaringan


 /etc/init.d/network restart 

Tambahkan ke startup dan mulai dnscrypt:


 /etc/init.d/dnscrypt-proxy enable /etc/init.d/dnscrypt-proxy start 

Mulai ulang dnsmasq:


 /etc/init.d/dnsmasq restart 


Ilustrasi pekerjaan tanpa DNSCrypt dan dengan DNSCrypt


Diterapkan secara otomatis dengan Ansible


Playbook dan templat ada di github . Ini menggunakan modul , tidak perlu python di router dan ada dukungan untuk uci. Saya mencoba memastikan bahwa konfigurasi OpenWrt Anda tetap tidak tersentuh, tetapi berhati-hatilah.


Instal modul gekmihesg / ansible-openwrt:


 ansible-galaxy install gekmihesg.openwrt 

Salin playbook dan tempeyta:


 cd /etc/ansible git clone https://github.com/itdoginfo/ansible-openwrt-hirkn mv ansible-openwrt-hirkn/* . rm -rf ansible-openwrt-hirkn 

Tambahkan router Anda ke host:


 [openwrt] 192.168.1.1 

Ganti variabel Anda di 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 

Pastikan untuk mengatur:


wg_server_address - server wireguard ip / url
wg_private_key , wg_public_key - kunci pribadi dari klien dan server publik
Sisanya tidak dapat diubah atau diubah, tergantung pada bagaimana server WireGuard dikonfigurasi


Luncurkan buku pedoman


 ansible-playbook playbooks/hirkn.yml 

Setelah menyelesaikan buku pedoman, router akan segera mulai memotong kunci melalui server wireguard Anda.


Kenapa tidak BGP?


Di bawah openwrt ada dua utilitas yang mengimplementasikan BGP - quagga dan burung. Quagg saya tidak bisa mengumpulkan data dari antifilter. Bird berteman dengan layanan dari setengah tendangan, tapi sayangnya saya tidak mengerti bagaimana cara memaksa antarmuka default untuk ditambahkan ke subnet yang diterima. (Saya akan senang mengetahui bagaimana ini dapat diterapkan).


Dalam komentar pada artikel seperti itu, saya melihat bahwa router orang β€œbijaksana” untuk sementara waktu, ketika mereka memasukkan daftar ke tabel routing. Dengan implementasi melalui ipset, Xiaomi mi 3G saya berpikir selama 2 detik (Asus rt-n16 selama 5 detik), ketika Anda memberinya daftar 15 ribu subnet. Dengan pekerjaan lebih lanjut, saya tidak melihat beban pada prosesor.


Semua materi bukan ajakan untuk bertindak dan disajikan untuk pengenalan fungsi dari OS Linux.

Source: https://habr.com/ru/post/id440030/


All Articles