Bagaimana saya bisa membuka port 80 sehingga proses non-root dapat mengikatnya?

46

Saya ingin menjalankan server web di Mac saya sebagai proses non-root. Biasanya hanya proses root yang dapat mengikat port 80 (atau port apa pun di bawah 1024).

Dapatkah saya membuka port 80 secara khusus sehingga proses non-root dapat mendengarkannya?

Avner
sumber
Terkait: link1 , link2
Nathan Farrington
lebih seperti pertanyaan unix.stackexchange.com , bukan?
Filip Bartuzi
1
mengapa unix jika itu pada sistem macos?
nhed

Jawaban:

28

Ini sulit dilakukan dengan desain, dan kecuali Anda memiliki akses root ke mesin Anda, hal-hal berikut tidak akan bekerja karena mereka memerlukan root untuk mengatur perubahan. Namun, setelah diubah, program userspace akan memiliki akses tanpa harus root.

Ada dua cara umum untuk mencapai ini, dan yang Anda pilih akan bergantung pada mengapa Anda mencoba mengatasi batasan:

Arahkan port 80 ke port lain, seperti 8080

Dengan mengkonfigurasi ulang mesin Anda untuk melewatkan semua lalu lintas port 80 ke port 8080, atau port apa pun yang Anda pilih, maka Anda dapat mengizinkan server ruang pengguna untuk menerima port privilege root di area yang diberi akses.

Prosesnya sangat mudah:

Langkah 1: Lihat aturan firewall saat ini.

sudo ipfw show

Langkah 2: Tambahkan aturan penerusan port (80 hingga 8080)

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

Jika Anda ingin menghapus aturan firewall Anda jalankan:

sudo ipfw flush

( sumber )

Ini adalah perubahan sementara, dan akan kembali setelah Anda memulai ulang, atau menyiram seperti yang ditunjukkan pada baris terakhir.

Anda dapat membuat perubahan itu permanen , atau Anda dapat menambahkan perintah sebagai garis startup sebelum memulai server Anda, yang mungkin lebih aman dari sudut pandang keamanan.

Gunakan Authbind

Authbind dirancang khusus untuk memungkinkan satu akses program ke port level yang lebih rendah tanpa memberikan akses root penuh.

Ada port MacOSX:

https://github.com/Castaglia/MacOSX-authbind

Ini mungkin masih terbatas pada lalu lintas IPv4, jadi Anda mungkin harus melakukan penyelidikan tambahan untuk menemukan apakah itu memenuhi kebutuhan Anda

Adam Davis
sumber
CINTA MacOSX-authbind ... Ini memungkinkan Anda menjalankan, misalnya, server web pada port 80 - sebagai "Administrator biasa". yaitu di launchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
alex grey
13
OS X Yosemite menghapus ipfw. Intisari ini menjelaskan solusi alternatif menggunakan pf.
lyschoening
Perhatikan bahwa mengarahkan lalu lintas ke pelabuhan yang tidak terjangkau dapat menjadi tidak aman jika Anda berada di lingkungan yang dibagikan; proses lain dapat mengikat port tersebut sebelum program Anda melakukannya atau jika program Anda melepaskan ikatan port tersebut bahkan untuk sementara waktu untuk memulai kembali dengan cepat.
Lie Ryan
authbind ist benar-benar solusi hebat, terima kasih!
favo
7

Anda dapat menggunakan ncatuntuk meneruskan lalu lintas dari server web yang berjalan di beberapa port lain:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

Ini akan meneruskan lalu lintas di port 80 ke localhost: 1234. Namun ini sedikit omong kosong, saya tidak akan menggunakannya di mana pun selain pengujian cepat dan jelas tidak dalam produksi.

Perhatikan bahwa ini tidak akan memungkinkan proses non-root untuk mengikatnya, tetapi dengan memilih port proses dapat mengikat, 1234 dalam contoh ini, itu akan terlihat seperti terikat ke port 80. Ini melakukan setara dengan meneruskan port 80 ke port 1234 dengan firewall, tetapi pada basis yang jauh lebih sementara.

Mathew Hall
sumber
2
Ini adalah solusi yang bagus. NB. ncatdatang dengan nmapyang dapat diinstal melalui Mac Ports dengan sudo port install nmap. MacPorts sendiri dapat diinstal dari macports.org/install.php .
William Denniss
Ini hanya memberi saya ikat: alamat sudah digunakan kesalahan.
Matt Joiner
Sama di sini - tidak bekerja. Ini berhasil: unix.stackexchange.com/a/187038
Sebastian J.
2

Anda juga dapat menggunakan ssh untuk melakukan penerusan port. Jadi jika Anda memiliki server yang berjalan pada 8080, Anda dapat meneruskan lalu lintas dari port 80. Berikut ini skrip yang saya gunakan, yang menghentikan apache asli jika berjalan dan meneruskan lalu lintas:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh [email protected] -L 80:127.0.0.1:8080
bdombro
sumber
Penerusan port ssh bisa berkinerja sangat rendah, dan fitur keamanan tidak masuk akal di lingkungan lokal> lokal. Lebih baik menggunakan penerusan port bawaan osx, atau sesuatu seperti ncat.
Shayne
-3

Yang harus Anda lakukan adalah membuka port 80 pada router Anda dan arahkan ke alamat IP lokal dari server web Anda. Kemudian di Mac Anda, aktifkan Berbagi Web dari System Preferences> Berbagi panel preferensi dan arahkan ke direktori yang Anda pilih. Ini telah bekerja untuk saya di masa lalu sampai beralih ke Server 10.6.

Matt Love
sumber
1
Saya mencari ini sebagai solusi untuk mesin dev saya sendiri. Karena saya harus bekerja di tempat-tempat di mana saya tidak memiliki kendali atas router, solusi ini tidak dapat bekerja untuk saya. Saya menduga ini akan berfungsi jika Anda menyiapkan server dan untuk beberapa alasan tidak memiliki akses root.
Avner
Jadi, untuk memperjelas, Anda mencoba mengatur server web di situs klien yang berbeda, tetapi tidak memiliki akses untuk membuka port 80? Bagaimana Anda mendapatkan port terbuka pada router jika Anda tidak memiliki akses? Apakah saya mengerti dengan benar atau saya jauh dari basis?
Matt Love
Saya hanya mencoba menggunakan port 80 pada mesin pengembangan saya sendiri bukan pada server produksi. Saya tetap menggunakan heroku.
Avner