iptables ที่เทียบเท่ากับ mac os x


55

ฉันต้องการที่จะส่งต่อการร้องขอจากไป192.168.99.100:80 127.0.0.1:8000นี่คือวิธีที่ฉันจะทำใน linux โดยใช้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 หรือไม่?
Scott Pack

1
มันเป็นเสือดาวหิมะ
nafe

มีเหตุผลบางอย่างที่คุณไม่สามารถกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณให้รับฟังใน 192.168.99.100:80 หรือไม่
Zoredache

1
@Zoredache การฟังที่พอร์ต 80 ต้องการ sudo และผู้ให้บริการเว็บบางรายไม่ปล่อยสิทธิ์เร็วพอที่จะเรียกใช้ด้วย sudo ได้อย่างปลอดภัย
Navin

คำตอบ:


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ดูเหมือนว่าจะเป็นส่วนที่ขาดหายไป)

หากคุณต้องการโดเมน (ปลอม) ให้ชี้ไปที่นามแฝงใหม่จากนั้นให้แน่ใจว่า / etc / hosts มีบรรทัด:

10.0.0.1 www.your-domain.com

4
ipfw จะไม่ทำงานบน Yosemite (MAC) และดูเหมือนว่าจะเลิกใช้แล้ว
Vadorequest

25

ฉันสามารถใช้งานได้โดยใช้คำสั่งifconfigและpfctlบน Mac 10.10.2 ด้วยวิธีการดังต่อไปนี้ผมประสบความสำเร็จในการทำแผนที่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ไฟล์และเพิ่มบรรทัดต่อไปนี้ map 10.0.0.1โดเมนของคุณ

10.0.0.1 mydomain.com

หลังจากคุณบันทึกไฟล์โฮสต์แล้วให้ล้าง DNS ท้องถิ่นของคุณ:

sudo discoveryutil udnsflushcaches

ตอนนี้เปิดmydomain.comในเบราว์เซอร์และคุณจะเห็นเซิร์ฟเวอร์โฮสต์บนพอร์ต localhost ของคุณ (เช่น127.0.0.1:3000) โดยทั่วไปกระบวนการนี้จะแมป<ip>:<port>ไปที่ใหม่<ip>เพื่อให้คุณสามารถแมปโฮสต์ที่ IP


1
แค่แฮ็กตาด แต่ทำงานเสร็จแล้ว แสดงที่ดี
Joey Carson

6
ขอขอบคุณ. คุณจะยกเลิกนามแฝงและการส่งต่อได้อย่างไร
Carlos Nuñez

1
สวัสดีsudo discoveryutil udnsflushcachesให้ฉันcommand not foundแต่มันยังคงตรงกับรายการอย่างถูกต้อง แต่ฉันจะแมปพอร์ตที่สองได้อย่างไร ฉันพยายามทำขั้นตอนที่ 1 + 2 โดยใช้ id: 10.0.0.2และพอร์ตอื่น แต่ใช้การเชื่อมต่อล่าสุดเท่านั้น ดังนั้นถ้าฉันจะมีอายุการใช้งาน10.0.0.1และport 3000จะส่งต่อ3000ถ้าผมทำที่ผ่านมา10.0.0.2พอร์ตและจะส่งต่อ4000 4000ในฉัน/private/etc/hostsฉันเขียนทั้งสองรายการด้วย id ที่แตกต่างกัน (ตาม)
Andi Giga

ใช้งานได้ แต่ฉันจำเป็นต้องใช้มันอีกครั้งเมื่อฉันรีสตาร์ท OSX .... สิ่งใดที่จะบันทึกสิ่งนี้อย่างถาวร?
Kasper

1
โปรดอัปเดตกับsudo dscacheutil -flushcache
northtree

5

ฉันก็ต้องทำสิ่งที่คล้ายกันเมื่อเร็ว ๆ นี้และในการค้นหามากับคำตอบนี้ น่าเสียดายที่คำตอบของ Nafe ใช้ipfwซึ่งขณะนี้เลิกใช้แล้วและไม่สามารถใช้งานได้ใน OSX และคำตอบของ Kevin Leary ย่อมเป็นเรื่องเล็กน้อย ดังนั้นฉันต้องทำให้ดีขึ้น (สะอาดขึ้น) และตัดสินใจแบ่งปันที่นี่เพื่อลูกหลาน คำตอบนี้ส่วนใหญ่ขึ้นอยู่กับวิธีการที่กล่าวถึงส่วนสำคัญนี้

ตามที่ระบุใน OP การชี้เบราว์เซอร์ที่ 192.168.99.100 ควรได้รับการตอบสนองจากเซิร์ฟเวอร์ที่ localhost: 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เริ่มใหม่อีกครั้ง

ตอนนี้ถ้าคุณต้องการสิ่งนี้เกิดขึ้นโดยอัตโนมัติหลังจากการรีสตาร์ททุกครั้งงานเล็ก ๆ น้อย ๆ ที่ต้องทำคือ: daemon เรียกใช้สำหรับpfctlความต้องการที่จะได้รับการปรับปรุง (ส่วนที่อ้างถึงกล่าวถึงว่า pf ถูกเปิดใช้งานโดยอัตโนมัติ กรณีจากการดูรหัส) เปิด (ด้วย 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>

ที่ควรทำ

Caveat : Apple ไม่อนุญาตให้เปลี่ยนไฟล์อสูรการเรียกใช้เช่นนั้นอีกต่อไป (ไม่ใช่กับ sudo, หรือ chmod หรืออะไรอย่างอื่น) เพียงวิธีที่เป็นคนจรจัดกับระบบความสมบูรณ์ของการป้องกันการตั้งค่า: บูตเข้าสู่โหมดการกู้คืนและสถานีการเปิดตัว ตรวจสอบสถานะ SIP ด้วยcsrutil statusโดยทั่วไปควรเปิดใช้งาน ปิดใช้งานด้วยcsrutil disableและรีบูตในโหมดปกติจากนั้นทำการเปลี่ยนแปลงไฟล์ plist ตามที่กล่าวไว้ข้างต้น เมื่อเสร็จแล้วให้กลับไปที่โหมดการกู้คืนและเปิดใช้งานการป้องกัน (มันในสถานที่สำหรับเหตุผลที่ดี) csrutil enableโดยการออก

คำอธิบาย: หนึ่งสามารถตรวจสอบโดยการออกifconfigคำสั่งที่127.0.0.1มีนามแฝง (ค่าเริ่มต้น) สำหรับ localhost lo0 - ข้อเท็จจริงนี้กำลังถูกใช้เพื่อหลีกเลี่ยงการเพิ่มนามแฝงพิเศษสำหรับ localhost และเพียงแค่ใช้ที่อยู่เริ่มต้นในpf.confไฟล์

อัปเดต: น่าเสียดายดูเหมือนว่าการโหลดไฟล์เมื่อเริ่มต้นไม่ทำงาน ฉันยังคงพยายามขอความช่วยเหลือจากมัน จนกว่าจะถึงตอนนั้นการเรียกใช้sudo pfctl -f /etc/pf.confหลังจากเริ่มต้นขึ้นจะเป็นการหลอกลวง


ขอบคุณสำหรับสิ่งนี้สิ่งนี้ใช้ได้กับฉันใน OS X Sierra เป็นสิ่งสำคัญมากแม้ว่าไฟล์การเปลี่ยนเส้นทางจะจบลงด้วยการขึ้นบรรทัดใหม่
kadrian

ดูเหมือนจะไม่ปลอดภัยที่จะเขียนทับไฟล์ระบบเช่นSystem/Library/LaunchDaemons/com.apple.pfctl.plist; สิ่งนี้อาจไม่รอดจากการอัปเดตระบบปฏิบัติการหรือไม่
Tom

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 ยังคงติดตั้งอยู่ หากคุณมีปัญหากับไวยากรณ์ตรวจสอบ frontends กราฟิกเหมือนหรือWaterRoofFlying Buttress

HTH, PEra


1

ลำดับของกฎเป็นสิ่งสำคัญตรวจสอบให้แน่ใจว่าไม่มี "ปฏิเสธทั้งหมด" ก่อนที่จะอนุญาตให้ใช้กฎหรืออะไรทำนองนั้น


ขอบคุณสำหรับคำแนะนำ แต่ฉันไม่คิดว่าฉันมีปัญหาเฉพาะนั้น (รายการ ipfw แสดงเฉพาะกฎของฉันและ65535 allow ip from any to any)
nafe

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

... จากนั้นจัดให้มันถูกเปิดใช้งานอีกครั้งเมื่อคอมพิวเตอร์รีบูท วิธีที่ "เหมาะสม" ในการทำเช่นนี้น่าจะสร้างไอเท็ม launchd ( Lingonทำให้ง่ายพอสมควร) หรือเพียงแค่ใช้เครื่องมือ GUI อย่างใดอย่างหนึ่งที่ PEra กล่าวถึงและปล่อยให้มันดูแลรายละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.