iptables setara untuk mac os x

56

Saya ingin meneruskan permintaan dari 192.168.99.100:80ke 127.0.0.1:8000. Ini adalah bagaimana saya melakukannya di linux menggunakan iptables:

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

Bagaimana saya melakukan hal yang sama di MacOS X? Saya mencoba kombinasi ipfwperintah tanpa banyak keberhasilan:

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

(Sukses bagi saya adalah mengarahkan browser http://192.168.99.100dan mendapatkan respons kembali dari server pengembangan yang telah saya jalankan localhost:8000)

tidak aman
sumber
Apakah kita berbicara OSX Client atau Server?
Scott Pack
1
Ini macan tutul salju.
nafe
Apakah ada alasan mengapa Anda tidak bisa mengonfigurasi server web Anda juga untuk mendengarkan pada 192.168.99.100:80?
Zoredache
1
@Zoredache Mendengarkan port 80 membutuhkan sudo dan beberapa server web tidak menjatuhkan hak akses dengan cukup cepat untuk menjalankannya dengan aman dengan sudo.
Navin

Jawaban:

33

Jadi saya menemukan sebuah cara untuk melakukan ini. Saya tidak yakin apakah itu cara yang disukai tetapi berhasil! Di shell favorit Anda:

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

(Alias lo0tampaknya menjadi bagian yang hilang)

Jika Anda ingin domain (palsu) untuk menunjuk ke alias baru ini maka pastikan / etc / hosts berisi baris:

10.0.0.1 www.your-domain.com
tidak aman
sumber
4
ipfw tidak akan bekerja pada Yosemite (MAC) dan tampaknya agak usang
Vadorequest
25

Saya bisa menjalankan ini menggunakan perintah ifconfigdan pfctlpada Mac 10.10.2. Dengan pendekatan berikut, saya berhasil memetakan 127.0.0.1:3000ke mydomain.comlokal di mesin saya.

Di baris perintah Anda, masukkan dua perintah berikut untuk meneruskan koneksi 127.0.0.1:3000ke 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 -

Kemudian edit /etc/hostsatau /private/etc/hostsfile Anda dan tambahkan baris berikut untuk memetakan domain Anda 10.0.0.1.

10.0.0.1 mydomain.com

Setelah Anda menyimpan file host, siram DNS lokal Anda:

sudo discoveryutil udnsflushcaches

Sekarang buka mydomain.comdi browser dan Anda akan melihat server di-host di port localhost Anda (yaitu 127.0.0.1:3000). Pada dasarnya proses ini memetakan sebuah <ip>:<port>ke yang baru <ip>sehingga Anda dapat memetakan host IP tersebut.

Kevin Leary
sumber
1
Sedikit aneh, tetapi menyelesaikan pekerjaan. Pertunjukan yang bagus.
Joey Carson
6
Terima kasih. Bagaimana Anda membatalkan alias dan penerusan?
Carlos Nuñez
1
Hai sudo discoveryutil udnsflushcachesmemberi saya command not foundtetapi masih cocok dengan entri dengan benar. Tetapi bagaimana saya bisa memetakan port kedua? Saya mencoba melakukan langkah 1 + 2 dengan id: 10.0.0.2dan port lain, tetapi selalu hanya membutuhkan koneksi terakhir. Jadi jika saya melakukan last 10.0.0.1& port 3000forward 3000, jika saya lakukan last 10.0.0.2dan port 4000forward 4000. Dalam tulisan saya, /private/etc/hostssaya menulis kedua entri dengan (menurut) id yang berbeda.
Andi Giga
Berhasil, tetapi saya harus melakukannya lagi ketika saya me-restart OSX .... Ada yang bisa menyimpan ini secara permanen?
Kasper
1
Harap perbarui dengansudo dscacheutil -flushcache
northtree
5

Saya juga harus melakukan hal yang sama baru-baru ini, dan dalam pencarian muncul jawaban ini. Sayangnya, jawaban penggunaan Nafe ipfwyang sekarang sudah usang dan tidak tersedia di OSX; dan jawaban Kevin Leary memang agak sedikit merdu. Jadi saya harus membuat sesuatu yang lebih baik (bersih) dan memutuskan untuk membagikannya di sini untuk anak cucu. Jawaban ini sebagian besar didasarkan pada pendekatan yang disebutkan di intisari ini .

Seperti yang disebutkan OP, mengarahkan browser ke 192.168.99.100 akan mendapat respons dari server di localhost: 8000. Menambahkan alias ke ifconfigtidak benar-benar diperlukan, pfctlsendirian sudah cukup: untuk mencapai ini pf.conffile /etc/pf.confperlu diubah.

Pertama kita buat (dengan sudo) file anchor baru (sebut saja redirection) di: /etc/pf.anchors/redirection. Ini pada dasarnya adalah file teks biasa dan berisi baris berikut (seperti dalam jawaban dari Kevin Leary): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Setelah file anchor baru dibuat, itu perlu direferensikan dalam pf.conffile. Buka pf.conffile dengan sudo dan tambahkan rdr-anchor "redirection"setelah baris rdr-anchor terakhir (yaitu rdr-anchor "com.apple/*") dan tambahkan load anchor "redirection" from "/etc/pf.anchors/redirection"di akhir.

Pada akhirnya, seperti inilah tampilan file 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

Dan hampir seperti itu. Cukup restart pfctldengan mengeluarkan sudo pfctl -duntuk menonaktifkannya terlebih dahulu dan kemudian sudo pfctl -fe /etc/pf.confmemulainya lagi.

Sekarang, jika Anda perlu ini terjadi secara otomatis setelah setiap restart, sedikit pekerjaan yang perlu dilakukan: daemon peluncuran untuk pfctlperlu diperbarui (intisari yang disebutkan menyebutkan bahwa pf diaktifkan secara otomatis saat boot, namun ini tampaknya tidak menjadi kasing dari melihat kode). Buka (dengan sudo) System/Library/LaunchDaemons/com.apple.pfctl.plistdan cari ini:

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

dan tambahkan baris <string>-e</string>untuk membuatnya seperti ini:

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

Itu harus dilakukan.

Peringatan : Apple tidak lagi memungkinkan untuk mengubah file peluncuran iblis begitu saja (tidak dengan sudo, atau chmod, atau apa pun). Satu- satunya cara adalah bermain-main dengan pengaturan Perlindungan Integritas Sistem : boot ke mode pemulihan dan luncurkan terminal. Periksa status SIP dengan csrutil status, umumnya harus diaktifkan. Nonaktifkan dengan csrutil disabledan reboot dalam mode normal dan kemudian lakukan perubahan pada file plist seperti yang dibahas di atas. Setelah selesai, kembali ke mode pemulihan dan aktifkan kembali perlindungan (ada untuk alasan yang baik) dengan menerbitkan csrutil enable.

Penjelasan: Orang dapat memeriksa dengan mengeluarkan ifconfigperintah yang 127.0.0.1sudah alias (default) untuk localhost lo0 - fakta ini digunakan untuk menghindari keharusan menambahkan alias tambahan untuk localhost dan cukup menggunakan alamat default dalam pf.conffile.

UPDATE: Sayangnya, sepertinya memuat file saat startup tidak berfungsi. Saya masih mencoba untuk mendapatkan bantuan untuk mengurutkannya. Sampai saat itu, menjalankan sudo pfctl -f /etc/pf.confsetelah memulai melakukan trik.

Yogesch
sumber
Terima kasih untuk ini, ini bekerja untuk saya di OS X Sierra. Sangat penting bahwa file pengalihan berakhir dengan baris baru.
kadrian
Tampaknya tidak aman untuk menimpa file sistem seperti System/Library/LaunchDaemons/com.apple.pfctl.plist; ini mungkin tidak akan bertahan dari pembaruan OS?
Tom
1

Mulai 10.5 dan seterusnya, OS X hadir dengan firewall baru yang berorientasi pada aplikasi ipfw. Tapi ipfw masih diinstal. Jika Anda memiliki masalah dengan sintaksnya, lihat frontend grafis seperti WaterRoofatau Flying Buttress.

HTH, PEra

PEra
sumber
1

urutan aturan itu penting, pastikan tidak ada "tolak semua" sebelum Anda mengizinkan aturan, atau semacamnya.

monomyth
sumber
Terima kasih atas sarannya tetapi saya rasa saya tidak memiliki masalah khusus (daftar ipfw hanya menunjukkan aturan saya dan 65535 allow ip from any to any).
nafe
1

Perintah Anda tampaknya tidak memiliki nomor aturan; mencoba:

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

(jika Anda tidak menjalankan sebagai root, Anda harus awalan dengan sudo). Hal lain yang perlu diperiksa adalah bahwa firewall diaktifkan:

sysctl net.inet.ip.fw.enable

Jika kembali dengan nilai 0 (mati), hidupkan dengan:

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

... dan kemudian mengaturnya untuk diaktifkan kembali ketika komputer reboot. Cara "tepat" untuk melakukan ini mungkin adalah membuat item launchd ( Lingon membuat ini cukup mudah). Atau cukup gunakan salah satu alat GUI yang disebutkan PEra, dan biarkan mengurus detailnya.

Gordon Davisson
sumber