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:
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:
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:
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.