मैक ओएस एक्स पर pf.conf का उपयोग करके OpenVPN कनेक्शन सक्रिय होने तक आउटगोइंग ट्रैफ़िक को रोकें


19

जब तक मेरा OpenVPN कनेक्शन pf.conf का उपयोग कर सक्रिय नहीं होता है तब तक मैं बाहरी नेटवर्क के सभी कनेक्शनों को अस्वीकार करने में सक्षम हूं। हालाँकि, यदि लैपटॉप का ढक्कन बंद करने और खोलने या वाई-फाई बंद करने और फिर से चालू करने से कनेक्शन टूट जाता है, तो मैं वाई-फाई कनेक्टिविटी खो देता हूं।

  • मैं मैक ओएस 10.8.1 पर हूं।
  • मैं वाई-फाई (सार्वजनिक वाई-फाई सहित अलग-अलग स्थानों से) के माध्यम से वेब से जुड़ता हूं।
  • OpenVPN कनेक्शन को चिपचिपाहट के साथ स्थापित किया गया है।

मेरे पास निम्नलिखित पैकेट फ़िल्टर नियम स्थापित हैं /etc/pf.conf

# Deny all packets unless they pass through the OpenVPN connection
wifi=en1
vpn=tun0

block all

set skip on lo
pass on $wifi proto udp to [OpenVPN server IP address] port 443
pass on $vpn

मैं पैकेट फ़िल्टर सेवा शुरू करता हूं sudo pfctl -eऔर नए नियमों को लोड करता हूं sudo pfctl -f /etc/pf.conf

मैंने संपादन करने के /System/Library/LaunchDaemons/com.apple.pfctl.plistलिए लाइन <string>-f</string>को भी संपादित और बदल दिया है <string>-ef</string>ताकि पैकेट फिल्टर सिस्टम स्टार्टअप पर लॉन्च हो।

यह सब पहली बार में बहुत अच्छा लगता है: यदि ओपनवीपीएन कनेक्शन सक्रिय है तो एप्लिकेशन केवल वेब से जुड़ सकते हैं, इसलिए मैं असुरक्षित कनेक्शन पर डेटा लीक नहीं कर रहा हूं।

लेकिन, अगर मैं अपने लैपटॉप के ढक्कन को बंद और फिर से खोल देता हूं या वाई-फाई को बंद कर देता हूं और फिर से वाई-फाई कनेक्शन खो जाता है, और मुझे स्टेटस बार में वाई-फाई आइकन में एक विस्मयादिबोधक चिह्न दिखाई देता है। वाई-फाई आइकन पर क्लिक करने से "अलर्ट: इंटरनेट कनेक्शन नहीं" संदेश दिखाई देता है:

कोई इंटरनेट कनेक्शन संदेश नहीं

कनेक्शन पुनः प्राप्त करने के लिए, मुझे "अलर्ट: नो इंटरनेट कनेक्शन" संदेश गायब होने से पहले वाई-फाई को कभी-कभी पांच या छह बार डिस्कनेक्ट और फिर से कनेक्ट करना पड़ता है, और मैं फिर से वीपीएन कनेक्शन को खोलने में सक्षम हूं। दूसरी बार, वाई-फाई अलर्ट अपने आप ही गायब हो जाता है, विस्मयादिबोधक चिह्न साफ ​​हो जाता है, और मैं फिर से कनेक्ट करने में सक्षम हूं। किसी भी तरह से, फिर से कनेक्शन प्राप्त करने में पांच मिनट या उससे अधिक समय लग सकता है, जिससे निराशा हो सकती है।

लाइन block allको हटाने से समस्या का समाधान हो जाता है (लेकिन असुरक्षित कनेक्शन की अनुमति देता है), इसलिए ऐसा लगता है कि मैं एक ऐसी सेवा कर रहा हूं जिसे अवरुद्ध करने और वाई-फाई कनेक्शन की पुष्टि करने के लिए Apple को आवश्यकता है। मैंने कोशिश की है:

  • pass on $wifi proto icmp allPf.conf में जोड़कर icmp को सक्षम करना
  • जोड़कर DNS रिज़ॉल्यूशन को सक्षम करना pass on $wifi proto udp from $wifi to any port 53
  • प्रवेश अवरुद्ध अधिक से (बदलकर पैकेट जानने की कोशिश कर block allके लिए block log all,), लेकिन क्योंकि कर प्रवेश ओएस एक्स के तहत अक्षम है sudo tcpdump -n -e -ttt -i pflog0में लॉग परिणाम देखने के लिए "tcpdump: pflog0: ऐसी कोई युक्ति से मौजूद है"।

इसमें से कोई भी तेजी से वाई-फाई कनेक्शन को फिर से स्थापित करने में मदद नहीं करता है।

वाई-फाई कनेक्टिविटी को पुनः प्राप्त करने के लिए मुझे क्या सेवा उपलब्ध कराने की आवश्यकता है, यह निर्धारित करने के लिए मुझे और क्या करना चाहिए, वाई-फाई के और अधिक विश्वसनीय बनाने के लिए मुझे pf.conf में क्या नियम जोड़ना चाहिए?


1
इसके बाद आने वालों के लिए यह प्रासंगिक हो सकता है: sparklabs.com/support/preventing_network_and_dns_traffic_leaks
ptim

जवाबों:


14

लिटिल स्निच का उपयोग करके नेटवर्क कनेक्शन की निगरानी करके, मैंने पाया है कि ऐप्पल वाई-फाई कनेक्शन उपलब्ध है या नहीं, यह जांचने के लिए पृष्ठभूमि में mDNSResponder ऐप का उपयोग करता है। mDNSResponder कनेक्टिविटी के लिए और आईपी के लिए होस्टनामों को हल करने के लिए नेमसर्वर्स को यूडीपी पैकेट भेजता है।

UDP नियम को बदलने से पहले मैंने वाई-फाई पर सभी UDP पैकेट को अनुमति देने के लिए mDNSResponder को कनेक्ट करने की अनुमति दी थी , जिसका अर्थ है कि वाई-फाई अब डिस्कनेक्ट होने के बाद पहली बार फिर से जुड़ता है। यदि यह भविष्य में दूसरों की मदद करता है, तो मेरा अंतिम pf.conf जिसमें माउंटेन लायन के लिए Apple के डिफ़ॉल्ट नियम शामिल हैं:

#
# com.apple anchor point
#
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"as
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

#
# Allow connection via Viscosity only
#
wifi=en1 #change this to en0 on MacBook Airs and other Macs without ethernet ports
vpn=tun0
vpn2=tap0

block all

set skip on lo          # allow local traffic

pass on p2p0            #allow AirDrop
pass on p2p1            #allow AirDrop
pass on p2p2            #allow AirDrop
pass quick proto tcp to any port 631    #allow AirPrint

pass on $wifi proto udp # allow only UDP packets over unprotected Wi-Fi
pass on $vpn            # allow everything else through the VPN (tun interface)
pass on $vpn2           # allow everything else through the VPN (tap interface)

इसका मतलब यह है कि यूडीपी प्रोटोकॉल का उपयोग करने वाले अनुप्रयोगों की छोटी संख्या द्वारा वाई-फाई पर डेटा को लीक किया जा सकता है, दुर्भाग्य से, जैसे कि एनटीपीपी (समय सिंक्रनाइज़ेशन के लिए) और mDNSResponder। लेकिन यह अभी भी टीसीपी पर असुरक्षित यात्रा करने की अनुमति देने से बेहतर है, जो कि अधिकांश एप्लिकेशन उपयोग करते हैं। यदि किसी के पास इस सेटअप में सुधार के लिए कोई सुझाव है, तो टिप्पणी या आगे के जवाबों का स्वागत है।


यह कुछ ऐसा है जिसे मैं लापरवाही से कर रहा हूं, आपके परिणामों को देखकर मुझे घर जाने और इसे आजमाने के लिए प्रेरित किया गया है! धन्यवाद!
22

@SixSlayer यह बहुत अच्छी तरह से काम करने लगता है! मेरे पास स्टार्टअप पर और गिराए गए कनेक्शनों पर ऑटोकनेक्ट करने के लिए विस्कोसिटी है, जो पूरी चीज को बहुत सहज बनाता है। ध्यान देने वाली मुख्य बात यह है कि pf.conf और com.apple.pfctl.plist ओएस अपडेट के बाद डिफ़ॉल्ट रूप से रीसेट हो जाते हैं, जाहिर है, इसलिए यह दोनों का बैकअप रखने के लायक है।
निक

IMHO UDP चीज एक प्रकार का बुमेर है। मैं एक नेटवर्क आदमी नहीं हूं, लेकिन इस तरह की चीज मुझे सीखने में मदद करती है, और मुझे इस प्रकार के विवरणों पर नियंत्रण रखने का आकर्षण है। मैं कुछ समय के आसपास एक काम की तलाश में बिताऊंगा, लेकिन अगर कोई मुझे इसके लिए धड़कता है, तो भी।
1

यह बहुत बढ़िया है - बिल्कुल वही, जिसकी मुझे तलाश थी। धन्यवाद!
कीओ

क्या आप संभवत: एक ही समय में कई ओपनवीपीएन कनेक्शन खोल चुके हैं और समानांतर में उनके माध्यम से रूटिंग कर रहे हैं? (बैंडविड्थ हासिल करने और जोड़ने के लिए)
keo

11

आपको सभी UDP को अनुमति देने की आवश्यकता नहीं है । MDNS में 'm' का अर्थ 'मल्टीकास्ट' है, और यह एक विशिष्ट मल्टीकास्ट गंतव्य आईपी पते का उपयोग करता है जिसे "लिंक लोकल मल्टीकास्ट एड्रेस" कहा जाता है और एक UDPपोर्ट नंबर 5353

इसका मतलब है कि ऊपर दिए गए समाधान में, आप अनावश्यक रूप से सभी 65535 यूडीपी बंदरगाहों को अपने वीपीएन को बायपास करने के लिए दुनिया के सभी 3.7 बिलियन रूबल आईपी पते पर यातायात की अनुमति दे रहे हैं। आपको आश्चर्य होगा कि कितने अनुप्रयोग यूडीपी का उपयोग करते हैं, इसलिए आप वीपीएन डाउन होने पर आउटगोइंग ट्रैफ़िक को रोकने के लिए अपने मूल विचार के उद्देश्य को महत्वपूर्ण रूप से हरा रहे हैं।

इसके बजाय इस नियम का उपयोग क्यों न करें:

pass on $wifi proto udp to 224.0.0.251 port 5353

फ़ायरवॉल कॉन्फ़िगरेशन के साथ अंगूठे का एक बहुत ही महत्वपूर्ण नियम - अपने फ़ायरवॉल के माध्यम से अपवाद बनाते समय, हमेशा सबसे विशिष्ट नियम का उपयोग करने का प्रयास करें। विशिष्टता कभी-कभी सुविधा और उपयोग में आसानी के खर्च पर आती है, यानी आप तब पा सकते हैं कि कुछ अन्य लिंक-स्थानीय प्रोटोकॉल हैं जिनके माध्यम से जाने की आवश्यकता है, और अभी तक एक और विशिष्ट नियम जोड़ें।

यदि आप उपरोक्त नियम में स्वैप करते हैं और पाते हैं कि मूल वाईफ़ाई समस्या वापस आती है, तो आपका पीएफ डीएचसीपी को अवरुद्ध कर सकता है, जो प्रोटोकॉल आपके नेटवर्क उपकरणों के आईपी पते को ऑटोकैनफिगर करने के लिए उपयोग किया जाता है। (एक होम नेटवर्क में, आमतौर पर आपका ब्रॉडबैंड राउटर आपका डीएचसीपी सर्वर होगा)। नियम आपको डीएचसीपी की अनुमति देने की आवश्यकता होगी, यह होगा:

pass on $wifi proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67

* ध्यान दें: आप स्थानापन्न करना पड़ सकता है 0.0.0.0के लिए anyDHCPREQUESTआपके कंप्यूटर को जो पैकेट पहले भेजा जाता है, उसका स्रोत पता होता है 0.0.0.0क्योंकि उस अवस्था में, आपके कंप्यूटर में अभी तक आईपी पता नहीं है।
ईमानदार होने के लिए, मैं उपयोग करने की ओर अधिक झुकाव होगा any। एक अन्य विकल्प किसी भी स्रोत विनिर्देश को समाप्त करना है pass on $wifi proto udp to 255.255.255.255 port 67, लेकिन इसका मतलब है कि हम नियम के स्रोत-बंदरगाह भाग को खो देते हैं, और जितना संभव हो उतना विशिष्ट होना हमेशा सबसे सुरक्षित विकल्प होता है।

उम्मीद है की वो मदद करदे। यहां कुछ उपयोगी लिंक दिए गए हैं:

mDNS: http://en.wikipedia.org/wiki/Multicast_DNS#Packet_structure

DHSP: http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_discovery


1

इससे मुझे बड़ी छलांग लगाने और pf.conf का उपयोग करने के लिए पर्याप्त पृष्ठभूमि जानकारी मिली। वीपीएन कनेक्शन ड्रॉप होने के बाद इसे फिर से जोड़ने के लिए मैं अपने 10.8 पर उपयोग करता हूं:

(मैं केवल ईथरनेट का उपयोग करता हूं लेकिन आप $ wifi के लिए $ lan बदल सकते हैं और यह काम करना चाहिए)

lan=en0
wifi=en1
vpn=tun0
block all
set skip on lo
pass on $lan proto { udp,tcp } to 8.8.8.8
pass on $lan proto tcp to vpn.btguard.com port 1194
pass on $vpn

1

पीएफ नियमों को "आसान" तरीके से बनाने के उद्देश्य से , वर्तमान सक्रिय इंटरफेस की पहचान करना, जिसमें वर्तमान (वीपीएन) इंटरफेस शामिल हैं, इस छोटे से हत्या के कार्यक्रम का उपयोग किया जा सकता है:

अभी भी प्रगति पर है, लेकिन फ़ायरवॉल नियमों को ठीक से बनाने के लिए बाहरी आईपी, और सक्रिय इंटरफेस की पहचान के लिए एक अच्छी शुरुआत हो सकती है।

उदाहरण -i(सूचना) विकल्प का उपयोग कर आउटपुट :

$ killswitch -i
Interface  MAC address         IP
en1        bc:57:36:d1:82:ba   192.168.1.7
ppp0                           10.10.1.3

public IP address: 93.117.82.123

सर्वर आईपी पास करना -ip:

# --------------------------------------------------------------
# Sat, 19 Nov 2016 12:37:24 +0100
# sudo pfctl -Fa -f ~/.killswitch.pf.conf -e
# --------------------------------------------------------------
int_en1 = "en1"
vpn_ppp0 = "ppp0"
vpn_ip = "93.117.82.123"
set block-policy drop
set ruleset-optimization basic
set skip on lo0
block all
pass on $int_en1 proto udp to 224.0.0.251 port 5353
pass on $int_en1 proto udp from any port 67 to any port 68
pass on $int_en1 inet proto icmp all icmp-type 8 code 0
pass on $int_en1 proto {tcp, udp} from any to $vpn_ip
pass on $vpn_ppp0 all

सही से दूर है, लेकिन काम चल रहा है अधिक जानकारी / कोड यहां पाया जा सकता है: https://github.com/vpn-kill-switch/killswitch


0

- जैसे -

आप इस पंक्ति को जोड़ना चाह सकते हैं:

pass on $wifi inet6 proto udp from any to FF02:0000:0000:0000:0000:0000:0000:00FB port 5353

IPv6 पर संचालित करने के लिए mDNS के लिए अनुमति देने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.