ما هو الفرق من مواد مماثلة؟
- تطبيق OpenWrt النقي
- باستخدام WireGuard
- يتم تنظيم تكوين جهاز التوجيه باستخدام تكوينات OpenWrt ، وليس مجموعة برامج نصية واحدة
- هناك حالات عند إعادة تشغيل الشبكة وإعادة التشغيل
- يستهلك القليل من موارد جهاز التوجيه: الشبكات الفرعية المقفلة موجودة في iptables ، وليس في جداول التوجيه. ما الذي يسمح لك بنشر هذا العمل حتى على الأجهزة الضعيفة
- أتمتة التكوين باستخدام Ansible (لا يلزم وجود بيثون على جهاز التوجيه)
نسخة الفيديو
لماذا OpenWrt و WireGuard؟
يتم تثبيت OpenWrt على العديد من طرازات أجهزة توجيه soho ، يتم تكوينه وتوسيعه حسب رغبة قلبك. الآن العديد من البرامج الثابتة لجهاز التوجيه هي وظائف إضافية على OpenWrt.
يستخدم Wireguard بسبب إعداده السريع والسهل ، وكذلك بسبب سرعة النقل العالية عبر النفق.
قليلا عن WireGuard
في حالتنا ، يكون الخادم VPS خارج ILV ، والعميل هو جهاز توجيه OpenWrt في المنزل. عندما تريد الذهاب إلى pornolab telegram ، سيقوم جهاز التوجيه الخاص بك بتوجيه حركة المرور عبر خادم باستخدام WireGuard.
يقوم WireGuard برفع اتصال من موقع إلى آخر ، أي يحتوي كل من الخادم والعميل على جانب الخادم والعميل من التكوين. إذا لم يكن الأمر واضحًا ، فسيصبح واضحًا عندما ترى التكوين.
لدى الخادم والعميل مفاتيح خاصة وعامة خاصة بهما.
تكوين WireGuard على الخادم
أفعل كل شيء على Ubuntu 18.04 ، ولكن في الوثائق الرسمية ، توجد إرشادات تثبيت لجميع أنظمة التشغيل المعروفة وليس للغاية.
التثبيت
sudo add-apt-repository ppa:wireguard/wireguard
إذا حدث خطأ
sudo: add-apt-repository: command not found
تثبيت البرنامج - الخصائص العامة - توفر الحزمة القدرة على إضافة وإزالة PPA
sudo apt install software-properties-common
sudo apt update sudo apt install wireguard-dkms wireguard-tools
نقوم بإنشاء مفاتيح للخادم. سنقوم بحفظ المفاتيح في دليل WireGuard للراحة.
cd /etc/wireguard/ wg genkey | tee privatekey-server | wg pubkey > publickey-server
وفقًا لذلك ، سيكون هناك مفتاح خاص في ملف خادم المفتاح الخاص ، ومفتاح عام في ملف publickey-server.
نقوم أيضًا بإنشاء مفتاح للعميل على الفور:
wg genkey | tee privatekey-client | wg pubkey > publickey-client

التكوين
يتم تخزين التكوين في /etc/wireguard/wg0.conf. يبدو جانب الخادم كما يلي:
[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
العنوان - عنوان واجهة مجموعة العمل (عنوان داخل النفق)
PrivateKey - المفتاح الخاص (خادم المفتاح الخاص)
ListenPort - المنفذ الذي تنتظر الخدمة الاتصال به
حسنًا ، نقوم بالتنكر ، لأننا سنستخدم هذا الخادم للوصول إلى الإنترنت
يرجى ملاحظة أن اسم الواجهة في قضيتك قد يختلف:
جزء العميل
[Peer] PublicKey = publickey-client AllowedIPs = 192.168.100.3/24
PublicKey - المفتاح العام لجهاز التوجيه لدينا (publickey- العميل)
AllowIPs هي الشبكات الفرعية التي ستكون متاحة من خلال هذا النفق. يحتاج الخادم فقط إلى الوصول إلى عنوان العميل.
يتم تخزين كلا الجزأين في التكوين واحد.
قم بتشغيل تشغيل تلقائي عند إعادة التشغيل:
systemctl enable wg-quick@wg0
نجعل الخادم جهاز توجيه:
sysctl -w net.ipv4.ip_forward=1
تكوين جدار الحماية. لنفترض أن لدينا WireGuard و ssh فقط على خادمنا:
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
حفظ تكوين iptables:
sudo apt-get install iptables-persistent sudo netfilter-persistent save
نرفع واجهة wg لأول مرة يدويًا:
wg-quick up wg0

خادم WireGuard جاهز.
UPD 06/27/19 إذا كان المزود الخاص بك لا يزال يستخدم PPoE ، فأنت بحاجة إلى إضافة قاعدة. شكرا denix123
iptables -t mangle -I POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
إعداد جهاز التوجيه
أنا أستخدم الإصدار 18.06.1 من OpenWrt على Xiaomi mi 3G و Asus RT-N16.
منطق جهاز التوجيه
نقوم بتحميل القوائم ، ووضعها في iptables ، و iptables تحدد جميع العناوين من هذه القوائم بعلامة 0x1. علاوة على ذلك ، فإن جميع الحزم التي تحمل علامة 0x1 تذهب إلى جدول توجيه منفصل ، وجميع الحزم التي تسقط في جدول التوجيه هذا تمر عبر واجهة مجموعة العمل.

حزمة التثبيت
بالنسبة للمساحة المشغولة على الفلاش ، فكل شيء سيحتاج إلى 0.9 ميغابايت تقريبًا. إذا كان لديك مكان سيء للغاية ، فاستبدل curl بـ wget وقد لا تحتاج إلى تثبيت dnscrypt-proxy.
نضع الحزم. في OpenWrt ، من السهل القيام بذلك من خلال مدير حزم opkg:
opkg update opkg install ipset wireguard curl
تحميل القوائم
كل ما يمكن القيام به من خلال الميزات القياسية لـ OpenWrt يتم من خلالهم. كل شيء آخر (باستثناء hotplug) وضعت في برنامج نصي صغير:
يتم الحصول على قوائم الشبكات الفرعية والعناوين المحظورة بواسطة الملفات. بالنسبة لهم نحن إنشاء دليل في / تمة. في / tmp - لأنها ذاكرة الوصول العشوائي ، هذه الميزة من OpenWrt مريحة للغاية. لا يستحق كتابة شيء على ROM لجهاز التوجيه مرة أخرى.
نقوم بضخ القوائم باستخدام antifilter.download curl ، يعني العلم z أن curl سوف يقوم بتنزيل الملف فقط إذا كان الملف البعيد مختلفًا عن الملف المحلي أو إذا لم يكن موجودًا ، كما هو الحال عند تحميل جهاز التوجيه.
subnet.lst - قائمة الشبكات الفرعية المحظورة ؛ لا تتغير كثيرًا.
ipsum.lst هي قائمة بالعناوين المحظورة ، والتي يتم تلخيصها بواسطة القناع. بدلا من 150 ألف سجل نحصل على 15 ألف - مريح.
بعد أن نمتلك الملفات ، نقوم بإعادة تشغيل جدار الحماية ، وهذا ضروري حتى تعمل مجموعة ipset وإضافة قوائم إلى iptables ، سنقوم بتهيئة ipset في / etc / config / firewall.
سيطلق على هذا البرنامج النصي الذي نضيفه في /etc/init.d/ hirkn. اجعلها قابلة للتنفيذ
chmod +x /etc/init.d/hirkn
الآن ليس لدينا نص ، ولكن خدمة كاملة. من أجل أن تبدأ في التمهيد ، نقوم بإنشاء رابط في / etc / rc.d. نحتاج أن نبدأ بعد جميع الخدمات الأخرى ، لذلك نصنع بادئة S99
ln -s /etc/init.d/hirkn /etc/rc.d/S99hirkn
يجب تحديث القوائم من وقت لآخر ، نضيف سجلًا في cron:
crontab -e
0 4 * * * /etc/init.d/hirkn
يبدو كافيًا جدًا لتحديثها مرة واحدة يوميًا. ضع في اعتبارك أنه عند إضافة قوائم إلى مجموعة ipset ، تتوقف الشبكة عن العمل ، وفي حالتي تكون ثانيتان.
محدث : إذا كنت لا تريد فترات راحة ، فاقترح sigo73 و Grayver في التعليقات كيفية القيام بذلك.
قم أيضًا بتشغيل التاج ، ويتم تعطيله افتراضيًا:
/etc/init.d/cron enable /etc/init.d/cron start
تكوين جدول التوجيه
قم بإنشاء جدول توجيه لحركة المرور عبر النفق بإضافة الخط ببساطة:
99 vpn
إلى الملف / etc / iproute2 / rt_tables.
يمكنك إنشاء مسار افتراضي لجدول "vpn" عبر واجهة مجموعة العمل باستخدام الأمر:
ip route add table vpn default dev wg0
ولكن عند إعادة تشغيل الشبكة ، يختفي المسار ، لذلك ننشئ ملف 30 rknroute في دليل /etc/hotplug.d/iface/ بمحتويات بسيطة:
هذا يعني أنه عند تشغيل / إيقاف تشغيل الواجهات ، سيتم إضافة مسارنا. وفقًا لذلك ، سيتم تسجيل هذا المسار دائمًا.
تكوين الشبكة
نحن بحاجة إلى تكوين WireGuard وقاعدة الحزم المسمى 0x1.
يوجد تكوين WireGuard في / etc / config / network
الجزء "الخادم":
config interface 'wg0' option private_key 'privatekey-client' list addresses '192.168.100.3/24' option listen_port '51820' option proto 'wireguard'
private_key هو العميل الخاص الذي أنشأناه عند تهيئة الخادم
قائمة العناوين - عنوان واجهة مجموعة العمل
listen_port - المنفذ الذي يقبل WireGuard الاتصالات به. ولكن الاتصال سيحدث من خلال المنفذ على الخادم ، لذلك هنا لن نفتح المنفذ على جدار الحماية لذلك
proto - حدد البروتوكول بحيث يفهم openwrt أن هذا تكوين WireGuard
جزء "العميل":
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 - publickey-server key
allow_ips - شبكات فرعية يمكن أن تمر فيها حركة المرور عبر النفق ، وفي حالتنا ، لا توجد قيود مطلوبة ، وبالتالي 0.0.0.0/0
route_allowed_ips - علامة تجعل المسار عبر واجهة مجموعة العمل الخاصة بالشبكات المدرجة من المعلمة allow_ips. في حالتنا ، هذا ليس ضروريًا ، iptables يقوم بهذا العمل
endpoint_host - ip / url الخاص بخادم wg الخاص بنا
persistent_keepalive - الفاصل الزمني الزمني الذي يتم بعده إرسال الحزم لدعم الاتصال
endpoint_port - منفذ wireguard على الخادم
سنضيف أيضًا قاعدة لتهيئة الشبكة التي سترسل كل حركة المرور التي تحمل علامة 0x1 إلى جدول التوجيه "vpn":
config rule option priority '100' option lookup 'vpn' option mark '0x1'
تكوين جدار الحماية
نضيف قاعدتين لوضع علامات على الحزم ، وهي لا تتوافق مع بناء جملة UCI لـ openwrt ، لذلك نضيفها "كما هي" إلى /etc/firewall.user.
محدث : اقترح Grayver أنها تتناسب بشكل جيد. وضعناها بعد إعداد ipset
تكوين جدار الحماية في / etc / config / جدار الحماية
إضافة منطقة ل wireguard. في openwrt ، تعتبر المناطق سلاسل مخصصة في iptables. وبالتالي ، يتم إنشاء منطقة مع واحد / عدة واجهات والقواعد معلقة بالفعل على ذلك. تبدو منطقة wg كما يلي:
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'
نحن نسمح فقط لحركة المرور بالخروج من الواجهة وتمكين التنكر.
تحتاج الآن إلى تمكين إعادة التوجيه من منطقة الشبكة المحلية إلى منطقة العمل:
config forwarding option src 'lan' option dest 'wg'
حسنًا ، آخر شيء هو إنشاء قوائم في iptables باستخدام 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 - الملف الذي نأخذ منه القائمة
اسم - اسم لقائمتنا
تخزين ، تطابق - هنا نحدد كيفية تخزين ونوع البيانات. سنقوم بتخزين نوع "الشبكة الفرعية"
UPD : إذا كنت ترغب في استخدام قائمة عناوين IP الفردية ، فأنت بحاجة إلى زيادة حجم قائمة ipset. في التكوين ipset إضافة
option hashsize '1000000' option maxelem '1000000'
وإلا سوف تحصل على خطأ
ipset v6.38: Hash is full, cannot add more elements
UPD : إضافة قاعدتين لوضع العلامات الحزم
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'
تتضمن هذه القواعد أن جميع الحزم التي تذهب إلى الشبكات الفرعية من قوائم vpn_subnets و vpn_ipsum يجب أن تكون علامة 0x1.
بعد ذلك ، نعيد تشغيل الشبكة:
/etc/init.d/network restart

وتشغيل البرنامج النصي:
/etc/init.d/hirkn

بعد العمل على البرنامج النصي ، يجب أن يعمل كل شيء من أجلك. تحقق من المسار على عميل جهاز التوجيه:
mtr/traceroute telegram.org/linkedin.com

مكافأة تكوين DNSCrypt
لماذا؟ يمكن لمزود الخدمة استبدال عنوان IP للمورد المحظور بعناية ، وبالتالي إعادة توجيهك إلى عنوان IP الخاص بك بكعب ، حسناً ، لن يساعد تجاوز IP الخاص بنا في هذه الحالة. بالنسبة للاستبدال ، ليس من الضروري دائمًا استخدام خادم نظام أسماء النطاقات الخاص بالمزود ، يمكن اعتراض طلباتك وسيتم استبدال الردود. حسنًا ، بالمناسبة ، لا يمكن للمزود فقط القيام بذلك.
opkg install dnscrpt-proxy
قم بتكوين / etc / config / dnscrypt-proxy config مثل هذا:
config dnscrypt-proxy ns1 option address '127.0.0.1' option port '5353' option resolver 'cpunks-ru'
لذلك لدينا خدمة dnscrypt على المنفذ 5353 المتاحة على المضيف المحلي.
Resolver هو خادم DNS يدعم التشفير. على جهاز التوجيه ، يحتوي الملف /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv على قائمة بالخوادم المتاحة في وقت إصدار الإصدار المثبت من dnscrypt. وهنا https://dnscrypt.info/public-servers/ بشكل عام جميع خوادم dnscrypt المتاحة. يمكنك اختيار محلل آخر و / أو إضافة خوادم لتحمل الأخطاء. ضع في اعتبارك أنه لكي يعمل DNSCrypt مع المُحلِّل المحدد ، يجب تحديده في dnscrypt-solutionvers.csv.
نحن تكوين dnsmasq للعمل مع dnscrypt. في / etc / config / dhcp ، علق السطر:
option resolvfile '/tmp/resolv.conf.auto'
بحيث لا تشارك خوادم مزود DNS.
وأضف:
list server '/pool.ntp.org/208.67.222.222' list server '127.0.0.1#5353'
يشير الإدخال "domain / ip_dns" لخادم القائمة إلى خادم DNS الذي يجب استخدامه لحل المجال المحدد. وبالتالي ، نحن لا نستخدم dnscrypt لمزامنة ntp - من المهم أن يكون للخدمة dnscrypt الوقت الحالي.
عند تحميل جهاز التوجيه ، يتم تشغيل البرنامج النصي hirkn بشكل أسرع من بدء تشغيل dnscrypt ، وبالتالي لا يتم حل مجال antifilter.download ولا يتم تنزيل القوائم. يمكنك تأخير أو شيء آخر للتوصل إليه ، لكن حتى الآن لا أرى أي سبب.
محدث : تحتاج إلى إضافة خط
START=99
ل hirkn النصي
نتيجة لذلك ، نحصل على مثل هذا الإدراج في التكوين:
محدث : في بعض الأجهزة ، يبدأ DNSCrypt على أي حال بعد البرنامج النصي. أسهل طريقة لإصلاح ذلك هي إضافة الخط إلى / etc / config / dhcp
list server '/antifilter.download/208.67.222.222'
تعطيل استخدام موفر DNS لواجهة الشبكة الواسعة
في / الخ / التكوين / شبكة إضافة السطر
option peerdns '0'
إلى واجهة الشبكة الواسعة.
نحصل على هذا التكوين
config interface 'wan' option ifname 'eth0.2' option proto 'dhcp' option peerdns '0'
أعد تشغيل الشبكة
/etc/init.d/network restart
إضافة إلى بدء التشغيل وبدء dnscrypt:
/etc/init.d/dnscrypt-proxy enable /etc/init.d/dnscrypt-proxy start
أعد تشغيل dnsmasq:
/etc/init.d/dnsmasq restart

شكل توضيحي للعمل دون DNSCrypt ومع DNSCrypt
نشرت تلقائيا مع Ansible
قواعد اللعبة التي تمارسها والقوالب على جيثب . يستخدم وحدة نمطية ، لا يحتاج إلى بيثون على جهاز التوجيه ويوجد دعم لـ uci. حاولت التأكد من أن تكوين OpenWrt الخاص بك ظل على حاله ، ولكن كن حذراً على أي حال.
تثبيت وحدة gekmihesg / ansible-openwrt:
ansible-galaxy install gekmihesg.openwrt
انسخ قواعد اللعبة و tempeyta:
cd /etc/ansible git clone https://github.com/itdoginfo/ansible-openwrt-hirkn mv ansible-openwrt-hirkn/* . rm -rf ansible-openwrt-hirkn
أضف الموجه إلى المضيفين:
[openwrt] 192.168.1.1
استبدل متغيراتك في 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
تأكد من ضبط:
wg_server_address - خادم ip / url
wg_private_key ، wg_public_key - مفتاح خاص للعميل والخادم العام
لا يمكن تغيير الباقي أو تغييره ، اعتمادًا على كيفية تكوين خادم WireGuard
إطلاق قواعد اللعبة التي تمارسها
ansible-playbook playbooks/hirkn.yml
بعد الانتهاء من قواعد اللعبة ، سيبدأ جهاز التوجيه على الفور في تجاوز الأقفال من خلال خادم الحماية.
لماذا لا BGP؟
تحت openwrt هناك نوعان من الأدوات المساعدة التي تنفذ BGP - quagga والطيور. Quagg لم أستطع الوصول إلى جمع البيانات من عامل التصفية. قام Bird بتكوين صداقات مع الخدمة من نصف ركلة ، لكن للأسف لم أفهم كيفية فرض الواجهة الافتراضية لإضافتها إلى الشبكات الفرعية المستلمة. (سأكون سعيدًا لمعرفة كيفية تنفيذ ذلك).
في التعليقات على هذه المقالات ، رأيت أن أجهزة توجيه الأشخاص كانت "مدروسة" لفترة من الوقت ، عندما وضعوا قوائم في جدول التوجيه. من خلال التنفيذ من خلال ipset ، يفكر Xiaomi mi 3G في ثانيتين (Asus rt-n16 لمدة 5 ثوان) ، عندما تطعمه قائمة تضم 15 ألف شبكة فرعية. مع مزيد من العمل ، لم ألاحظ الحمل على المعالج.
جميع المواد ليست دعوة للعمل ويتم تقديمها للتعرف على وظائف نظام التشغيل Linux.