1. 程式人生 > >MacOS X Firewall

MacOS X Firewall

Max前陣子在研究 Mac OS X 上的中間人攻擊(man-in-the-middle attack, MITM),有安裝 SSLsplit – transparent SSL/TLS interception 趁這個機會學習到了很多 Mac OS X 裡的指令,結論是:rdr封包無法轉發,要可以被轉發需要在 Mac OS X 裡插入實體的網路線並啟用wifi 基地臺分享,讓 Mac OS X 變成 gateway 才能收到使用者端送的封包,或是配合mitmproxy的透明代理。

Apple的 MacOS X上沒有iptables,在10.10以後以pf取代ipfw。相比於linux 的 iptables,pf一般使用配置檔案儲存防火牆規則,語法規範上更嚴謹,但是配置也更複雜、規則冗長。本文記錄pf的簡單配置方法。cat /etc/pf.conf,可看到以下已有內容:(已忽略註解部分)

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

anchor可理解為一組規則的集合。預設情況下,這裡的幾行anchor都是蘋果留的place holder,實際上沒有active的規則。
/etc/pf.conf在以後的MacOS X更新中可能會被覆蓋,最好可以另外建立一個自定義的pf.conf。
配置檔案必須按照Macros, Tables, Options, Traffic Normalization, Queueing, Translation, Packet Filtering的順序。

1. 新增一個anchor。修改/etc/pf.conf如下:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
nat-anchor "custom"
rdr-anchor "com.apple/*"
rdr-anchor "custom"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
anchor "custom"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "custom" from "/etc/pf.anchors/custom"

2. 建立anchor規則檔案/etc/pf.anchors/custom,內容為具體規則。

常用的規則:
• 遮蔽IP入站TCP連線並記錄:

block in log proto tcp from 192.168.1.136 to any



• 轉發入站TCP連線到另一本地埠:

rdr inet proto tcp from any to any port 8081 -> 127.0.0.1 port 80



經測試,rdr無法轉發到另一臺外部主機上(man page的示例,只可以轉發到internal network),核心開啟net.inet.ip.forwarding=1也無效。如需轉發到另一個外網IP,需要配合mitmproxy的透明代理。

• NAT,路由vlan12介面上(192.168.168.0/24)的出口包,經由非vlan12的介面轉換到外部地址(204.92.77.111),並允許vlan12之間的互相訪問:

nat on ! vlan12 from 192.168.168.0/24 to any -> 204.92.77.111



3. 使配置檔案生效

pfctl -evf /etc/pf.conf