
QubesOS के लिए न्यूनतम यूनिकर्नल फ़ायरवॉल जो नेटवर्क ट्रैफ़िक को फ़िल्टर करता है, NAT लागू करता है, और Qubes DB तथा qrexec के माध्यम से संचार करता है।
एक यूनिकर्नेल जो QubesOS ProxyVM के रूप में चल सकता है, sys-firewall की जगह लेता है। यह Qubes प्रोटोकॉल को लागू करने के लिए mirage-qubes लाइब्रेरी का उपयोग करता है।
अधिक विवरण के लिए A Unikernel Firewall for QubesOS देखें।
पहले से निर्मित बाइनरी releases page से उपलब्ध हैं। स्थापना निर्देशों के लिए नीचे Deploy अनुभाग देखें।
नोट: बिल्ड करने का सबसे विश्वसनीय तरीका Docker या Podman का उपयोग करना है। Fedora 42 इसके लिए अच्छा काम करता है, Debian 12 भी काम करता है, लेकिन Docker पाने के लिए आपको docker.com पर दिए गए निर्देशों का पालन करना होगा (Debian के संस्करण का उपयोग न करें)।
एक नया Fedora-42 AppVM बनाएं (या मौजूदा का पुन: उपयोग करें)। Qube की Settings (Basic / Disk storage) में, private storage की अधिकतम आकार को डिफ़ॉल्ट 2048 MiB से बढ़ाकर 8192 MiB करें। एक टर्मिनल खोलें।
इस Git रिपॉजिटरी को क्लोन करें और build-with.sh स्क्रिप्ट को docker या podman में से किसी एक तर्क के साथ चलाएँ (नोट: Fedora पर नई SELinux नीतियों के कारण chcon कॉल अनिवार्य है, जो होम डायरेक्टरी में docker इमेज को मानक रूप से रखने की अनुमति नहीं देती हैं):
mkdir /home/user/docker
sudo ln -s /home/user/docker /var/lib/docker
sudo chcon -Rt container_file_t /home/user/docker
sudo dnf install docker
sudo systemctl start docker
git clone https://github.com/mirage/qubes-mirage-firewall.git
cd qubes-mirage-firewall
sudo ./build-with.sh docker
या
sudo systemctl start podman
git clone https://github.com/mirage/qubes-mirage-firewall.git
cd qubes-mirage-firewall
./build-with.sh podman
मेरे लैपटॉप पर इसमें लगभग 15 मिनट लगे (यदि आप इसे दोबारा चलाते हैं तो यह बहुत तेज़ होगा)। शुरुआत में दिया गया symlink चरण आवश्यक नहीं है यदि आपका बिल्ड VM स्टैंडअलोन है। यह Docker को अधिक डिस्क स्थान देता है और Qube को रीबूट करने पर Docker इमेज कैश खोने से बचाता है। Podman के साथ इसकी आवश्यकता नहीं है क्योंकि कंटेनर डिफ़ॉल्ट रूप से आपकी होम डायरेक्टरी में रहते हैं।
नोट: ऑब्जेक्ट फ़ाइलें _build निर्देशिका में संग्रहीत की जाती हैं ताकि वृद्धिशील बिल्ड तेज़ हों। यदि आप निर्भरताएँ बदलते हैं, तो पुनः निर्माण से पहले इस निर्देशिका को हटाना होगा।
यदि आप चाहते हैं कि रीबूट के बाद भी Docker या Podman पैकेज बना रहे, तो उसे टेम्पलेट VM में स्थापित करना ठीक है, लेकिन फ़ायरवॉल का निर्माण स्वयं एक नियमित AppVM में किया जाना चाहिए।
आप उस स्क्रिप्ट के बिना भी, किसी भी सामान्य Mirage यूनिकर्नेल की तरह बिल्ड कर सकते हैं; विवरण के लिए Mirage स्थापना निर्देश देखें।
बिल्ड स्क्रिप्ट अपने द्वारा उपयोग की जाने वाली लाइब्रेरी के संस्करणों को स्थिर करती है, यह सुनिश्चित करते हुए कि आपको वही बाइनरी मिलेगी जो रिलीज़ में है। यदि आप इसके बिना बिल्ड करते हैं, तो यह नवीनतम संस्करणों के विरुद्ध बिल्ड करेगा (और इसलिए हैश शायद मेल नहीं खाएगा)। हालाँकि, यह ठीक से काम करना चाहिए।
यदि आप मैन्युअल रूप से तैनात करना चाहते हैं, तो आपको बस domU में qubes-firewall.xen और qubes-firewall.sha256 डाउनलोड करने की आवश्यकता है और जाँचना होगा कि .xen फ़ाइल का संगत हैशसम है। qubes-firewall.xen स्वयं यूनिकर्नेल है और इसे dom0 में /var/lib/qubes/vm-kernels/mirage-firewall निर्देशिका में vmlinuz पर कॉपी किया जाना चाहिए, उदा. (यदि dev वह AppVM है जहाँ आपने इसे बनाया है):
[tal@dom0 ~]$ mkdir -p /var/lib/qubes/vm-kernels/mirage-firewall/
[tal@dom0 ~]$ cd /var/lib/qubes/vm-kernels/mirage-firewall/
[tal@dom0 mirage-firewall]$ qvm-run -p dev 'cat mirage-firewall/qubes-firewall.xen' > vmlinuz
ऊपर जोड़े गए mirage-firewall कर्नेल का उपयोग करके mirage-firewall VM बनाने के लिए dom0 में यह कमांड चलाएँ:
qvm-create \
--property kernel=mirage-firewall \
--property kernelopts='' \
--property memory=32 \
--property maxmem=32 \
--property netvm=sys-net \
--property provides_network=True \
--property vcpus=1 \
--property virt_mode=pvh \
--property audiovm='' \
--label=green \
--class StandaloneVM \
mirage-firewall
qvm-features mirage-firewall qubes-firewall 1
qvm-features mirage-firewall no-default-kernelopts 1
qvm-features mirage-firewall skip-update 1
यदि आप Qubes में salt states चलाने से परिचित हैं, तो आप अपने Qubes OS में mirage फ़ायरवॉल के नवीनतम संस्करण को स्वचालित रूप से तैनात करने के लिए स्क्रिप्ट SaltScriptToDownloadAndInstallMirageFirewallInQubes.sls का भी उपयोग कर सकते हैं। एक परिचय यहाँ और यहाँ पाया जा सकता है। पूर्व लिंक के निर्देशों का पालन करते हुए, आप dom0 में कमांड sudo qubesctl --show-output state.apply SaltScriptToDownloadAndInstallMirageFirewallInQubes saltenv=user के साथ स्क्रिप्ट चला सकते हैं। स्क्रिप्ट एकीकरण सर्वर से चेकसम की जाँच करती है और github रिलीज़ में दिए गए नवीनतम संस्करण से तुलना करती है। यदि आपके डिफ़ॉल्ट टेम्पलेट में डिफ़ॉल्ट रूप से curl और tar उपकरण स्थापित नहीं हैं, तो स्क्रिप्ट में VM टेम्पलेट को समायोजित करना आवश्यक हो सकता है, जिनका उपयोग mirage यूनिकर्नेल डाउनलोड करने के लिए किया जाता है। यह भी न भूलें कि जिस VM में यूनिकर्नेल का उपयोग किया जाना है उसे बदलें या "Qubes Global Settings" को समायोजित करें।
पिछले रिलीज़ से अपग्रेड करने के लिए, बस /var/lib/qubes/vm-kernels/mirage-firewall/vmlinuz को नए संस्करण से अधिलेखित करें और फ़ायरवॉल VM को पुनः आरंभ करें।
आप अपने मौजूदा sys-firewall के साथ mirage-firewall चला सकते हैं और GUI का उपयोग करके चुन सकते हैं कि कौन से AppVMs किस फ़ायरवॉल का उपयोग करें। किसी AppVM को इसका उपयोग करने के लिए कॉन्फ़िगर करने के लिए, GUI में ऐप VM की सेटिंग्स में जाएँ और उसका NetVM default (sys-firewall) से बदलकर mirage-firewall करें।
आप इसे dom0 में यह कमांड चलाकर भी कॉन्फ़िगर कर सकते हैं (my-app-vm को AppVM के नाम से बदलें):
qvm-prefs --set my-app-vm netvm mirage-firewall
वैकल्पिक रूप से, आप mirage-firewall को अपना डिफ़ॉल्ट फ़ायरवॉल VM बना सकते हैं।
ध्यान दें कि डिफ़ॉल्ट रूप से dom0 अपने "UpdateVM" (अपडेट डाउनलोड करने के लिए एक प्रॉक्सी) के रूप में sys-firewall का उपयोग करता है। mirage-firewall इसके लिए उपयोग नहीं किया जा सकता, लेकिन कोई भी Linux VM ठीक रहेगा। https://www.qubes-os.org/doc/software-update-dom0/ कहता है:
UpdateVM की भूमिका Qubes VM Manager में किसी भी VM को सौंपी जा सकती है, और इस विकल्प में कोई महत्वपूर्ण सुरक्षा निहितार्थ नहीं हैं। डिफ़ॉल्ट रूप से, यह भूमिका firewallvm को सौंपी जाती है।
OpenBSD वर्तमान में netvm के रूप में उपयोग नहीं किया जा सकता है, इसलिए यदि आप अपने sys-net VM के रूप में BSD का उपयोग करना चाहते हैं, तो आपको इसका netvm qubes-mirage-firewall पर सेट करना होगा (अधिक जानकारी के लिए https://github.com/mirage/qubes-mirage-firewall/issues/146 देखें)। इसका मतलब है कि आपके पास AppVMs -> qubes-mirage-firewall <- OpenBSD होगा, जिसमें तीर netvm गुण सेटिंग को दर्शाता है।
उस स्थिति में आपको qubes-mirage-firewall को बताना होगा कि किस AppVM क्लाइंट को अपलिंक के रूप में उपयोग किया जाना चाहिए:
qvm-prefs --set mirage-firewall -- kernelopts '--ipv4=X.X.X.X --ipv4-gw=Y.Y.Y.Y'
जिसमें X.X.X.X mirage-firewall के लिए IP पता है और Y.Y.Y.Y आपके OpenBSD HVM का IP पता है।
यह आरेख मुख्य घटकों को दर्शाता है (प्रत्येक बॉक्स समान नाम वाली स्रोत .ml फ़ाइल से मेल खाता है):
ईथरनेट फ़्रेम क्लाइंट क्यूब्स (जैसे work या personal) या sys-net से आते हैं। इंटरनेट (IP) पैकेट firewall को भेजे जाते हैं, जो पैकेट के साथ क्या करना है यह तय करने के लिए NAT तालिका और QubesDB के नियमों से परामर्श करता है। यदि इसे आगे भेजा जाना चाहिए, तो यह चुने हुए गंतव्य पर भेजने के लिए router का उपयोग करता है। client_net dom0 द्वारा प्रदान किए गए XenStore डेटाबेस को देखता है ताकि पता चल सके कि क्लाइंट को कब जोड़ा या हटाया जाना है।
बूट प्रक्रिया:
config.ml उपयोग की गई लाइब्रेरी और स्थैतिक कॉन्फ़िगरेशन सेटिंग्स (NAT तालिका आकार) का वर्णन करता है। mirage उपकरण इसका उपयोग main.ml उत्पन्न करने के लिए करता है।main.ml config.ml द्वारा चयनित ड्राइवरों को आरंभ करता है और unikernel.ml में start फ़ंक्शन को कॉल करता है।unikernel.ml Qubes एजेंटों को जोड़ता है, नेटवर्किंग घटकों को सेट करता है, और फिर शटडाउन अनुरोध की प्रतीक्षा करता है।विकास के लिए, अपने डेवलपमेंट AppVM से यूनिकर्नेल (qubes-firewall.xen) तैनात करने हेतु test-mirage स्क्रिप्ट का उपयोग करें। पहली बार इसे सेट करने में थोड़ा अधिक समय लगता है, लेकिन उसके बाद यह बहुत तेज़ होगा। उदा.
[user@dev ~]$ test-mirage dist/qubes-firewall.xen mirage-firewall
Waiting for 'Ready'... OK
Uploading 'dist/qubes-firewall.xen' (7454880 bytes) to "mirage-test"
Waiting for 'Booting'... OK
Connecting to mirage-test console...
Solo5: Xen console: port 0x2, ring @0x00000000FEFFF000
| ___|
__| _ \ | _ \ __ \
\__ \ ( | | ( | ) |
____/\___/ _|\___/____/
Solo5: Bindings version v0.7.3
Solo5: Memory map: 32 MB addressable:
Solo5: reserved @ (0x0 - 0xfffff)
Solo5: text @ (0x100000 - 0x319fff)
Solo5: rodata @ (0x31a000 - 0x384fff)
Solo5: data @ (0x385000 - 0x53ffff)
Solo5: heap >= 0x540000 < stack < 0x2000000
2022-08-13 14:55:38 -00:00: INF [qubes.rexec] waiting for client...
2022-08-13 14:55:38 -00:00: INF [qubes.db] connecting to server...
2022-08-13 14:55:38 -00:00: INF [qubes.db] connected
2022-08-13 14:55:38 -00:00: INF [qubes.db] got update: "/mapped-ip/10.137.0.20/visible-ip" = "10.137.0.20"
2022-08-13 14:55:38 -00:00: INF [qubes.db] got update: "/mapped-ip/10.137.0.20/visible-gateway" = "10.137.0.23"
2022-08-13 14:55:38 -00:00: INF [qubes.rexec] client connected, using protocol version 3
2022-08-13 14:55:38 -00:00: INF [unikernel] QubesDB and qrexec agents connected in 0.041 s
2022-08-13 14:55:38 -00:00: INF [dao] Got network configuration from QubesDB:
NetVM IP on uplink network: 10.137.0.4
Our IP on uplink network: 10.137.0.23
Our IP on client networks: 10.137.0.23
DNS resolver: 10.139.1.1
DNS secondary resolver: 10.139.1.2
2022-08-13 14:55:38 -00:00: INF [net-xen frontend] connect 0
2022-08-13 14:55:38 -00:00: INF [net-xen frontend] create: id=0 domid=1
2022-08-13 14:55:38 -00:00: INF [net-xen frontend] sg:true gso_tcpv4:true rx_copy:true rx_flip:false smart_poll:false
2022-08-13 14:55:38 -00:00: INF [net-xen frontend] MAC: 00:16:3e:5e:6c:00
2022-08-13 14:55:38 -00:00: INF [ethernet] Connected Ethernet interface 00:16:3e:5e:6c:00
2022-08-13 14:55:38 -00:00: INF [ARP] Sending gratuitous ARP for 10.137.0.23 (00:16:3e:5e:6c:00)
2022-08-13 14:55:38 -00:00: INF [ARP] Sending gratuitous ARP for 10.137.0.23 (00:16:3e:5e:6c:00)
2022-08-13 14:55:38 -00:00: INF [udp] UDP layer connected on 10.137.0.23
2022-08-13 14:55:38 -00:00: INF [dao] Watching backend/vif
2022-08-13 14:55:38 -00:00: INF [memory_pressure] Writing meminfo: free 20MiB / 27MiB (72.68 %)
फ़ायरवॉल का परीक्षण करने वाला एक यूनिकर्नेल test/ उपनिर्देशिका में उपलब्ध है। इसका उपयोग करने के लिए, test.sh चलाएँ और परीक्षण वातावरण स्थापित करने के निर्देशों का पालन करें।
फ़ायरवॉल को प्रभावित करने वाली सुरक्षा सलाह के लिए issues tagged "security" देखें।
LICENSE.md देखें।