मैक ओएस एक्स के लिए iptables बराबर


55

मैं से अनुरोध अग्रेषित करना चाहते 192.168.99.100:80करने के लिए 127.0.0.1:8000। इस तरह से मैं इसे लिनक्स में प्रयोग करूँगा iptables:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000

मैं MacOS X में कैसे काम करता हूं? मैंने ipfwबहुत सफलता के बिना आदेशों के संयोजन की कोशिश की :

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(मेरे लिए सफलता एक ब्राउज़र को इंगित कर http://192.168.99.100रही है और एक विकास सर्वर से प्रतिक्रिया प्राप्त कर रही है जिसे मैंने चलाया है localhost:8000)


क्या हम OSX क्लाइंट या सर्वर से बात कर रहे हैं?
स्कॉट पैक

1
यह हिम तेंदुआ है।
21

क्या कोई कारण है कि आप अपने वेब सर्वर को 192.168.99.100:80 पर भी सुन सकते हैं?
Zoredache

1
@Zoredache पोर्ट 80 पर सुनना सुडो की जरूरत है और कुछ webservers विशेषाधिकारों को तेजी से नहीं छोड़ते हैं ताकि वे सूडो के साथ सुरक्षित रूप से भाग सकें।
नवीन

जवाबों:


33

तो मुझे ऐसा करने का एक तरीका मिल गया । मुझे यकीन नहीं है कि यह पसंदीदा तरीका है लेकिन यह काम करता है! आपके पसंदीदा शेल में:

sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80

(उर्फ lo0लापता हिस्सा लगता है)

यदि आप इस नए उपनाम को इंगित करने के लिए एक (नकली) डोमेन चाहते हैं तो सुनिश्चित करें कि / आदि / मेजबानों में लाइन है:

10.0.0.1 www.your-domain.com

4
IPfw Yosemite (MAC) पर काम नहीं करेगा और थोड़े
घटाव

25

मैं मैक 10.10.2 पर कमांड ifconfigऔर pfctlकमांड का उपयोग कर इसे प्राप्त करने में सक्षम था । निम्नलिखित दृष्टिकोण से मैं अपनी मशीन पर स्थानीय रूप 127.0.0.1:3000से सफलतापूर्वक मैप कर रहा हूं mydomain.com

अपने आदेश पंक्ति में निम्नलिखित दो के लिए कनेक्शन को अग्रेषित करने के आदेशों में प्रवेश 127.0.0.1:3000करने के लिए 10.0.0.1:

sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -

फिर अपना /etc/hostsया /private/etc/hostsफ़ाइल संपादित करें और अपने डोमेन को मैप करने के लिए निम्न पंक्ति जोड़ें 10.0.0.1

10.0.0.1 mydomain.com

अपने होस्ट फ़ाइल को सहेजने के बाद अपने स्थानीय DNS को फ्लश करें:

sudo discoveryutil udnsflushcaches

अब mydomain.comएक ब्राउज़र में खोलें और आप अपने लोकलहोस्ट पोर्ट (यानी 127.0.0.1:3000) पर होस्ट किए गए सर्वर को देखेंगे । मूल रूप से यह प्रक्रिया <ip>:<port>एक नए से <ip>मैप करती है ताकि आप फिर उस होस्ट को मैप कर सकें जो आई.पी.


1
बस एक टैडी हैकी, लेकिन काम हो जाता है। अच्छा प्रदर्शन।
जॉय कार्सन

6
धन्यवाद। आप उपनाम और अग्रेषण को कैसे पूर्ववत करेंगे?
कार्लोस नुनेज़

1
हाय sudo discoveryutil udnsflushcachesमुझे देता है command not foundलेकिन यह अभी भी प्रविष्टि को सही ढंग से मेल खाता है। लेकिन मैं दूसरे पोर्ट को कैसे मैप कर सकता हूं? मैंने आईडी के साथ चरण 1 + 2 करने की कोशिश की: 10.0.0.2और एक अन्य पोर्ट, लेकिन यह हमेशा केवल अंतिम कनेक्शन लेता है। तो अगर मैं पिछले है 10.0.0.1और port 3000यह आगे 3000, अगर मैं पिछले करना 10.0.0.2और बंदरगाह 4000यह आगे 4000। अपने में /private/etc/hostsमैंने (अलग) अलग आईडी के साथ दोनों प्रविष्टियाँ लिखी हैं।
एंडी गीगा

काम करता है, लेकिन जब मैं OSX को पुनरारंभ करता हूं, तो मुझे फिर से इसकी आवश्यकता होती है .... इसे स्थायी रूप से बचाने के लिए कोई भी चीज?
कास्पर

1
कृपया अपडेट करेंsudo dscacheutil -flushcache
नॉर्थट्री

5

मुझे भी हाल ही में इसी तरह का काम करना था, और खोज में इस उत्तर पर आया। दुर्भाग्य से, Nafe उपयोग का उत्तर ipfwजो अब OSX में पदावनत और अनुपलब्ध है; और केविन लेरी का जवाब वास्तव में थोड़ा हैकिश है। इसलिए मुझे कुछ बेहतर (क्लीनर) बनाना पड़ा और इसे पोस्ट करने के लिए यहाँ साझा करने का फैसला किया। यह उत्तर काफी हद तक इस जिस्ट में उल्लिखित दृष्टिकोण पर आधारित है ।

ओपी का उल्लेख है, 192.168.99.100 पर एक ब्राउज़र को इंगित करते हुए स्थानीयहोस्ट पर सर्वर से प्रतिक्रिया मिलनी चाहिए: 8000। ifconfigवास्तव में आवश्यक नहीं होने के लिए एक उपनाम जोड़ना , pfctlअकेले पर्याप्त है: इस pf.confफाइल को प्राप्त /etc/pf.confकरने के लिए इसे संशोधित करने की आवश्यकता है।

पहले हम (sudo के साथ) एक नई एंकर फ़ाइल बनाते हैं (इसे कॉल करते हैं redirection) /etc/pf.anchors/redirection:। यह मूल रूप से एक नियमित पाठ फ़ाइल है और इसमें निम्न पंक्ति शामिल है (जैसे केविन लेरी के उत्तर में) rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000:। एक बार नई एंकर फ़ाइल बन जाने के बाद, इसे pf.confफ़ाइल के भीतर संदर्भित किया जाना चाहिए । pf.confफ़ाइल को sudo के साथ खोलें और rdr-anchor "redirection"अंतिम rdr-anchor लाइन (जो है rdr-anchor "com.apple/*") के बाद जोड़ें और load anchor "redirection" from "/etc/pf.anchors/redirection"अंत में जोड़ें ।

अंततः, यह वही है जो pf.conf फ़ाइल को दिखना चाहिए:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection"  #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection"  #added for redirection/port forwarding

और लगभग यही है। बस इसे पहले अक्षम pfctlकरने sudo pfctl -dऔर फिर sudo pfctl -fe /etc/pf.confइसे फिर से शुरू करने के लिए जारी करके पुनः आरंभ करें।

अब, यदि आपको प्रत्येक पुनरारंभ के बाद स्वचालित रूप से ऐसा करने की आवश्यकता है, तो एक और छोटा सा काम करने की आवश्यकता है: लॉन्च डेमॉन pfctlको अपडेट करने की आवश्यकता है (संदर्भित जिक्र में उल्लेख है कि पीएफ बूट पर स्वचालित रूप से सक्षम है, हालांकि ऐसा प्रतीत नहीं होता है कोड को देखने से मामला)। खोलें (sudo के साथ) System/Library/LaunchDaemons/com.apple.pfctl.plistऔर इसके लिए देखें:

<array>
          <string>pfctl</string>
          <string>-f</string>
          <string>/etc/pf.conf</string>
</array>

और <string>-e</string>अंततः इस तरह से बनाने के लिए लाइन जोड़ें :

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>

इससे हो जाना चाहिए।

कैविएट : ऐप्पल अब लॉन्च दानव फ़ाइलों को बस उसी तरह बदलने की अनुमति नहीं देता है (सूडो के साथ नहीं, न ही चामॉड, और न ही कुछ और)। केवल जिस तरह से साथ टिंकर करने के लिए है सिस्टम वफ़ादारी संरक्षण पुनर्प्राप्ति मोड और प्रक्षेपण के टर्मिनल में बूट: सेटिंग्स। एसआईपी स्थिति की जांच करें csrutil status, इसे आम तौर पर सक्षम होना चाहिए। इसे csrutil disableसामान्य मोड में रीबूट और रीबूट करें और फिर ऊपर बताए अनुसार प्लिस्ट फाइल में बदलाव करें। एक बार हो जाने के बाद, पुनर्प्राप्ति मोड पर वापस जाएं और जारी करके सुरक्षा को फिर से सक्षम करें (यह अच्छे कारण के लिए है) csrutil enable

स्पष्टीकरण: एक जारी करके जाँच कर सकते हैं ifconfigआदेश है कि 127.0.0.1पहले से ही स्थानीय होस्ट lo0 के लिए (डिफ़ॉल्ट) अन्य नाम है - इस तथ्य को स्थानीय होस्ट के लिए एक अतिरिक्त उपनाम जोड़ना होने से बचने के लिए इस्तेमाल किया जा रहा है और बस में डिफ़ॉल्ट पते का उपयोग करना pf.confफ़ाइल।

अद्यतन: दुर्भाग्य से, ऐसा लगता है जैसे स्टार्टअप पर फ़ाइल लोड करने से काम नहीं चलता है। मैं अभी भी इसे हल करने के लिए मदद लेने की कोशिश कर रहा हूं। तब तक, sudo pfctl -f /etc/pf.confशुरू करने के बाद दौड़ने की कोशिश करता है।


इसके लिए धन्यवाद, इसने मेरे लिए OS X Sierra में काम किया। यह बहुत महत्वपूर्ण है, हालांकि पुनर्निर्देशन फ़ाइल एक नई पंक्ति के साथ समाप्त होती है।
काड्रियन

यह सिस्टम फ़ाइलों को अधिलेखित करने के लिए सुरक्षित नहीं लगता है System/Library/LaunchDaemons/com.apple.pfctl.plist; यह शायद एक OS अद्यतन नहीं बच जाएगा?
टॉम

4

इसने मेरे लिए अच्छा काम किया:

  • सिस्टम प्राथमिकता के माध्यम से फ़ायरवॉल सक्षम करें
  • यहाँ वर्णित के रूप में ipfw स्टार्टअप फ़ाइल बनाएँ: https://serverfault.com/a/235124/94860
  • निम्न पंक्ति को स्टार्टअप फाइल में जोड़ें, जैसा कि यहाँ वर्णित है: http://xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/

    add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in


1

10.5 पर, OS X के बजाय एक नया, अनुप्रयोग-उन्मुख फ़ायरवॉल आता है ipfw। लेकिन ipfw अभी भी स्थापित है। यदि आपको इसके सिंटैक्स से परेशानी है, तो जैसे WaterRoofया चित्रमय दृश्य देखें Flying Buttress

HTH, PEra


1

नियमों का क्रम महत्वपूर्ण है, सुनिश्चित करें कि आपके अनुमति नियमों, या ऐसा कुछ होने से पहले कोई "इनकार सभी" नहीं है।


सलाह के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि मुझे वह विशेष समस्या है (ipfw सूची केवल मेरा नियम और 65535 allow ip from any to any) दिखाती है ।
रात्रि

1

आपकी आज्ञा से नियम संख्या याद आ रही है; प्रयत्न, कोशिश:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(यदि आप रूट के रूप में नहीं चल रहे हैं, तो आपको इसे sudo के साथ उपसर्ग करना होगा)। जाँच करने के लिए एक और बात यह है कि फ़ायरवॉल सक्षम है:

sysctl net.inet.ip.fw.enable

यदि यह मान 0 (बंद) के साथ वापस आता है, तो इसे इसके साथ चालू करें:

sysctl -w sysctl net.inet.ip.fw.enable=1

... और फिर कंप्यूटर रिबूट होने पर इसे फिर से चालू करने की व्यवस्था करें। ऐसा करने का "उचित" तरीका संभवतः एक लॉन्च आइटम बनाना है ( लिंगोन इसे काफी आसान बनाता है)। या केवल GUI के एक उपकरण का उपयोग करें जिसका उल्लेख पेरा है, और इसे विवरणों का ध्यान रखें।

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