1. 程式人生 > >Mac下使用PF進行端口轉發和防火墻配置(類似Linux的iptables)

Mac下使用PF進行端口轉發和防火墻配置(類似Linux的iptables)

火墻 get 端口 生效 proto 保護 功能 net inet6

在Mac沒有iptables這些,替代的軟件為PF,命令為pfctl。在早些版本用ipfw(<=10.10),後面改為PF。還有一些可以使用OpenBsd,不過這個不太好用。

網上關於pfctl的參數估計不太全,建議直接使用man pfctl去查看。

下面是收集的一些用法:

用PF做端口轉發:

首先我們要開啟系統的端口轉發功能。

本次開機生效:

# IPv4 的轉發
$ sudo sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

# IPv6 的轉發
$ sudo sysctl -w
net.inet6.ip6.forwarding=1 net.inet6.ip6.forwarding: 0 -> 1

開機啟動配置,需以 root 身份添加或修改 /etc/sysctl.conf 文件,加入以下兩行:

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

查看當前端口轉發功能狀態:

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

開啟端口轉發之後,即可配置端口轉發規則。你可以跟著手冊來:

$ man pfctl
$ man pf.conf

或者跟著下文手動新建文件。如/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

檢查其正確性:

$ sudo pfctl -vnf /etc/pf.anchors/http

修改PF的主配置文件/etc/pf.conf開啟我們添加的錨點http

pf.conf對指令的順序有嚴格要求,相同的指令需要放在一起,否則會報錯 Rules must be in order: options, normalization, queueing, translation, filtering.

# 在 rdr-anchor "com.apple/*" 下添加
rdr-anchor "http-forwarding"

# 在 load anchor "com.apple" from "/etc/pf.anchors/com.apple" 下添加
load anchor "http-forwarding" from "/etc/pf.anchors/http"

最後導入並允許運行:

$ sudo pfctl -ef /etc/pf.conf

使用-e命令啟用pf服務。使用-E命令強制重啟PF服務:

$ sudo pfctl -E

使用-d命令關閉PF:

$ sudo pfctl -d

從Mavericks起PF服務不再默認開機自啟。如需開機啟動PF服務,請往下看。

新版Mac OS 10.11 EI Captian加入了系統完整性保護機制,需重啟到安全模式執行下述命令關閉文件系統保護。

$ csrutil enable --without fs

然後才能修改/System/Library/LaunchDaemons/com.apple.pfctl.plist文件實現開機自啟用配置。

向plist文件中添加-e行,如下所示:

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

參考:

https://www.v2ex.com/t/191810

http://man.linuxde.net/pfctl

http://www.jianshu.com/p/6052831a8e91(以上內容部分轉自此篇文章)

http://www.jianshu.com/p/427337c95a4a

Mac下使用PF進行端口轉發和防火墻配置(類似Linux的iptables)