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