在MacOS上使用1024以下端口

起因

MacOS和Linux一樣颈墅,需要root權(quán)限使用低于1024以下端口。因此要在Mac機器上監(jiān)聽80端口或443端口缩挑,要么以root用戶啟動應(yīng)用流昏,要么使用端口轉(zhuǎn)發(fā)扎即。

在Linux系統(tǒng)中可以通過sudo setcap cap_net_bind_service=+ep <app name>來讓非root用戶使用1024以下端口(<app name>指要授權(quán)監(jiān)聽端口的程序)吞获。

MacOS沒有setcap命令况凉,所以需要通過端口轉(zhuǎn)發(fā)來達(dá)到目的。新版的MacOS操作系統(tǒng)使用pf(packet filter)設(shè)置端口轉(zhuǎn)發(fā)各拷。

簡單粗暴的解決方式

echo "
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

rdr: The packet is redirected to another destination and possibly a different port.
數(shù)據(jù)包被重定向到另一個目的地刁绒,可能還有一個不同的端口
rdr rules can optionally specify port ranges instead of single ports.
規(guī)則可以選擇指定端口范圍而不是單個端口
rdr ... port 2000:2999 -> ... port 4000 redirects ports 2000 to 2999 (inclusive) to port 4000.
... port 2000:2999 -> ... port 4000 重定向端口2000-2999(包含2999)到端口4000
rdr ... port 2000:2999 -> ... port 4000:* redirects port 2000 to 4000, 2001 to 4001, ..., 2999 to 4999.
... port 2000:2999 -> ... port 4000:* 重定向端口2000到端口4000,端口2001到端口4001烤黍,...知市,端口2999到4999

比較詳盡的管理方式

創(chuàng)建anchor文件

??注意,以下示例端口有重復(fù)速蕊。
示例一:
/etc/pf.anchors/http

rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 4443
rdr pass on en0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass on en0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 4443

示例二:
/etc/pf.anchors/tomcat

rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080

示例三:
/etc/pf.anchors/virtualbox

rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 443 -> 127.0.0.1 port 8443

測試anchor文件

pfctl -vnf /etc/pf.anchors/http
pfctl -vnf /etc/pf.anchors/tomcat
pfctl -vnf /etc/pf.anchors/virtualbox

添加到主配置文件

pf啟動時會自動裝載/etc/pf.conf文件,因此將anchor文件鏈接到/etc/pf.conf,轉(zhuǎn)發(fā)規(guī)則就會自動建立了嫂丙。pf.conf 對指令的順序有嚴(yán)格要求,相同的指令需要放在一起规哲,否則會報錯 Rules must be in order: options, normalization, queueing, translation, filtering.

rdr-anchor "http-forwarding"
load anchor "http-forwarding" from "/etc/pf.anchors/http"

rdr-anchor "tomcat-forwarding"
load anchor "tomcat-forwarding" from "/etc/pf.anchors/tomcat"

rdr-anchor "virtualbox-forwarding"
load anchor "virtualbox-forwarding" from "/etc/pf.anchors/virtualbox"

打開pf

pf默認(rèn)是關(guān)閉的跟啤。可以使用以下命令啟動pf:

sudo pfctl -ef /etc/pf.conf

使用 -e 命令啟用 pf 服務(wù)唉锌。使用 -E 命令強制重啟 pf 服務(wù):

$ sudo pfctl -E

關(guān)閉pf

使用 -d 命令關(guān)閉 pf:

$ sudo pfctl -d

設(shè)置pf自啟動

修改 LaunchDaemons (《了解LaunchDaemons》)來使 pf 開機自動打開

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

添加的為-e參數(shù),即enable隅肥。 有一點一定要注意,-f和etc/pf.conf這兩個參數(shù)不能被打斷,因為-f必須緊跟一個文件參數(shù)袄简,所以說添加-e參數(shù)時不要打斷-f參數(shù)腥放,否則開機不會自動啟動pf,切記绿语。

跨接口轉(zhuǎn)發(fā)

如果需要跨接口轉(zhuǎn)發(fā)秃症,則需設(shè)置系統(tǒng)參數(shù): /etc/sysctl.conf
開機啟動配置,需以 root 身份添加或修改 /etc/sysctl.conf 文件吕粹,加入以下兩行:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

跨接口轉(zhuǎn)發(fā)伍纫,本次開機生效:

  • IPv4 的轉(zhuǎn)發(fā)
$ sudo sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
  • IPv6 的轉(zhuǎn)發(fā)
$ sudo sysctl -w net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1

查看當(dāng)前轉(zhuǎn)發(fā)狀態(tài)

$ sudo sysctl -a | grep forward
net.inet.ip.forwarding: 0
net.inet6.ip6.forwarding: 0

幫助手冊

開啟端口轉(zhuǎn)發(fā)之后,即可配置端口轉(zhuǎn)發(fā)規(guī)則昂芜。你可以跟著手冊來:

$ man pfctl
$ man pf.conf
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莹规,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泌神,更是在濱河造成了極大的恐慌良漱,老刑警劉巖舞虱,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異母市,居然都是意外死亡矾兜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門患久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椅寺,“玉大人,你說我怎么就攤上這事蒋失》蹬粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵篙挽,是天一觀的道長荆萤。 經(jīng)常有香客問我,道長铣卡,這世上最難降的妖魔是什么链韭? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮煮落,結(jié)果婚禮上敞峭,老公的妹妹穿的比我還像新娘。我一直安慰自己蝉仇,他們只是感情好旋讹,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著量淌,像睡著了一般骗村。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呀枢,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天胚股,我揣著相機與錄音,去河邊找鬼裙秋。 笑死琅拌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摘刑。 我是一名探鬼主播进宝,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枷恕!你這毒婦竟也來了党晋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎未玻,沒想到半個月后灾而,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡扳剿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年旁趟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇绽。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锡搜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞧掺,到底是詐尸還是另有隱情耕餐,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布夸盟,位于F島的核電站蛾方,受9級特大地震影響像捶,放射性物質(zhì)發(fā)生泄漏上陕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一拓春、第九天 我趴在偏房一處隱蔽的房頂上張望释簿。 院中可真熱鬧,春花似錦硼莽、人聲如沸庶溶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偏螺。三九已至,卻和暖如春匆光,著一層夾襖步出監(jiān)牢的瞬間套像,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工终息, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夺巩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓周崭,卻偏偏與公主長得像柳譬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子续镇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345