VPN फ़ायरवॉल हुक एक ही नियम दो बार क्यों जोड़ता है
फिर से कनेक्ट होने पर आपका हुक दोबारा चल सकता है, इसलिए वांछित स्थिति के लिए डिज़ाइन करें: अपनी चेन, जोड़ने से पहले एक परीक्षण, एक क्रमबद्ध बदलाव और सीमित टियरडाउन।
हुक पहली बार काम करता है, और तीन बार फिर से कनेक्ट होने के बाद चेन में उसी नियम की तीन प्रतियाँ रहती हैं। कुछ भी ज़ोर से विफल नहीं हुआ; स्क्रिप्ट हर बार चलने पर बस वही करती थी जो उसे बताया गया था। VPN हुक एक कॉन्फ़िगरेशन क्रिया है जो एक से अधिक बार चल सकती है, इसलिए उसे एक मालिक, एक वांछित स्थिति और एक क्रमबद्ध बदलाव चाहिए। उसी क्रम में चलें और दोहराव रुक जाएगा।
कोई नियम लिखने से पहले नियमों को एक मालिक दें
एक भी नियम लिखने से पहले तय करें कि यह एकीकरण किस चेन या टेबल का मालिक है। हुक जो समर्पित चेन बनाता और खाली करता है, वह मालिकाना का सबसे स्पष्ट रूप है, क्योंकि सफ़ाई तब उस चेन को किसी और की नीति छुए बिना हटा सकती है। अगर आपको साझा चेन में नियम जोड़ने ही पड़ें, तो उन्हें टिप्पणी से चिह्नित करें ताकि बाद की खोज ठीक आपके नियम ढूँढ सके। मालिकाना ही टियरडाउन को सुरक्षित बनाता है, और टियरडाउन ही वह हिस्सा है जो चुपचाप विफल होता है।
iptables -N VPN_HOOK 2>/dev/null || true
iptables -C INPUT -j VPN_HOOK 2>/dev/null || iptables -I INPUT -j VPN_HOOK
iptables -S VPN_HOOK
यहाँ टिप्पणी सजावट नहीं है। यह आपके नियम को हटाने और किसी संयोग से मिलते-जुलते नियम को हटाने के बीच का अंतर है, और यह सहेजे गए नियम-समूह में बनी रहती है। टिप्पणी एक बार किसी चर में लिखें और हर उस आदेश में वही स्ट्रिंग इस्तेमाल करें जो जोड़ता, जाँचता या हटाता है।
दोबारा जोड़ने के बजाय वांछित स्थिति की जाँच करें
लिखें कि सुरंग चालू रहने पर क्या मौजूद होना चाहिए: कौन-से इंटरफ़ेस, कौन-सा स्रोत और गंतव्य, कौन-सा प्रोटोकॉल और कौन-सा पोर्ट। फिर हर नियम को एक परीक्षण और उसके बाद जोड़ने के रूप में व्यक्त करें, ताकि दूसरी बार चलने पर नियम मिल जाए और कुछ न हो। नियम मौजूद होने पर जाँच आदेश शून्य के साथ निकलता है, और स्क्रिप्ट को ठीक यही संकेत चाहिए। iptables संदर्भ यहाँ इस्तेमाल किए गए जाँच, जोड़ने और डालने के रूपों का दस्तावेज़ीकरण करता है।
iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
स्थिति के बारे में सावधान रहें। नियम जाँचकर सबसे ऊपर डालना पहले आने वाले जानबूझकर किए गए अस्वीकार से पहले अनुमति को खिसका सकता है, इसलिए दूसरी बार चलने पर कुछ जोड़े बिना भी व्यवहार बदल जाता है। अपनी चेन के अंदर अंत में जोड़ें, और क्रम को उस जगह से नियंत्रित करें जहाँ उस चेन में कूद है। अगर चेन के अंदर क्रम मायने रखता है, तो नियम-दर-नियम पैबंद लगाने के बजाय ज्ञात सूची से चेन फिर से बनाएँ।
अगर ज़रूरी नियम को स्थिर परीक्षण के रूप में व्यक्त नहीं किया जा सकता तो रुकें। आम तौर पर इसका मतलब है कि वांछित स्थिति अभी भी अस्पष्ट है।
टिके रहने की उम्मीद के बजाय बदलाव को क्रमबद्ध करें
हुक के दो आह्वान ओवरलैप हो सकते हैं, और दोनों किसी के जोड़ने से पहले अनुपस्थित नियम देख सकते हैं। xtables का प्रतीक्षा विकल्प आदेश को लॉक की प्रतीक्षा कराता है, लेकिन दो आदेशों में जाँच-फिर-जोड़ क्रम को परमाणु नहीं बनाता। पूरी क्रिया को अपने लॉक से क्रमबद्ध करें, या ऐसा प्रबंधक इस्तेमाल करें जो घोषित बैच को एक लेन-देन के रूप में लागू करे। nftables बाद वाला कर सकता है, और यह उन होस्ट पर इसे प्राथमिकता देने का एक कारण है जहाँ यह उपलब्ध है।
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
आप कोई भी तंत्र चुनें, महत्वपूर्ण खंड छोटा रखें और उसे फिर से प्रवेश योग्य बनाएँ: आधे रास्ते विफल होने वाला हुक दोबारा चलाने के लिए सुरक्षित होना चाहिए। परिणाम लॉग करें ताकि बार-बार चलना नियमों की गिनती से अनुमान लगाने के बजाय जर्नल में दिखे। अगर दो अलग-अलग सुपरवाइज़र हुक को बुला सकते हैं, तो पहले वही ठीक करें; कोई लॉक दो मालिकों को ठीक नहीं करता।
सिर्फ़ अपना ही टियरडाउन करें
टियरडाउन को प्रतिस्थापन कनेक्शन को उस कनेक्शन से अलग पहचानना होगा जिसे उसने सेवानिवृत्त किया, और उसे ऐसी घटना का सामना करना होगा जिसे कभी सौम्य सफ़ाई नहीं मिलती। उन्हीं पहचानकर्ताओं से मिटाएँ जिनसे जोड़ा था, और सफ़ाई आसान बनाने के लिए कभी साझा चेन खाली न करें। कठोर रुकावट के बाद, डाउन हुक चला मान लेने के बजाय अगली शुरुआत में मेल-मिलाप का दौर चलाएँ।
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
इंटरफ़ेस का जीवनकाल भी डिज़ाइन का हिस्सा है। फिर से कनेक्ट होने पर अलग नाम का उपकरण बन सकता है, इसलिए दूसरी सुरंग का नाम कठोरता से तय करने वाला नियम वैध दिखते हुए भी पुराना हो जाता है। कनेक्शन जो पहचान खुद प्रकट करता है उसे प्राथमिकता दें, और हर बार चलाने पर उसे फिर पढ़ें। तीनों घटनाओं को अलग-अलग जाँचें: दोहराया कनेक्शन, प्रतिस्थापन कनेक्शन और शटडाउन। अनुमत ट्रैफ़िक तीनों को बिना दोहराव के पार करे, और असंबंधित सेवाएँ अछूती रहें।
यह चाल तब पूरी होती है जब हुक के पास एक मालिक, हर जोड़े जाने वाले नियम के लिए परीक्षण, एक क्रमबद्ध मार्ग और ऐसा टियरडाउन हो जो सिर्फ़ अपनी स्थिति हटाए। दो बार चलाने के लिए सुरक्षित हुक एक बार चतुर हुक से ज़्यादा मूल्यवान है।