對比Mac OS上的PF與iptables

2021-09-21 05:08:55 字數 2509 閱讀 9962

昨天同事問我怎麼在mac上配置策略路由,其實我也不知道!由於自己的實際需求,一直以來都想玩mac網路功能,可是目光總被它炫爛的外表炫暈!今日同事這麼一問我,頓時產生一種研究其究竟的慾望,還好,家裡的電腦都是mac系統(我非果粉,但老婆是),週末帶女兒上完早教課,終於可以閒下來玩一番了...

其實,macos絢爛的外表下面,是一輛坦克,其核心是具有學院派高貴血統的bsd unix,而我們知道,unix網路的強大,tcp/ip和unix的關係,不禁覺得mac的偉大,將unix放在時尚ol的雙膝上內窺外瞟,而這是多麼偉大的一項征服!

我的實驗拓撲如下:

imac模擬一台終端,wifi關閉,macbook模擬路由器,wifi開啟,兩台電腦之間用一根網線相連線。

首先,我希望在macbook上配置nat,將作為內網的imac發來的資料報做源位址轉換,此時希望的nat是動態nat或者類似linux的maquerade的那種。macbook上的wifi介面連線我家的路由器,因此需要將從wifi口en1出去的資料報做snat,類似linux的

-o en1 -j masquerade

nat on en1 from 172.16.4.0/24 to any -> en1

其中,172.16.4.0/24是imac所在段的位址,作為內網,而en1上則是所謂的外網位址192.168.1.108。實際上en1和位址段可以寫成變數的形式,這裡為了簡單就直接寫了,至於可以寫成變數的形式,一會兒我要用這個和iptables和cisco系統做對比。然後執行pfctl -e -f /etc/pf.conf就可以了!此時從imac來ping 192.168.1.1路由器,就通了,然而從路由器卻無法ping內網,這明顯就是乙個單向的轉換,如果要做成雙向的轉換,那麼就需要乙個一一對應的轉換了,在bsd中,這是通過binat實現的,主要在命令中,它加上了bi字首,和bat區分開來,我們來看一下binat的配置:

binat on en1 from 172.16.4.10 to any -> 172.16.4.30

ifconfig enx $ip/$mask alias

即可,關鍵字是alias!

到了本文最關鍵的時候了。pf的配置和iptables的配置哪個更加好呢?這當然不是仁者見仁智者見智的問題,可以毫不猶豫的說,iptables完敗了!寫過iptables規則控制指令碼的人都很頭疼,就是你得為你的每乙個點子寫一條rule,然後噩夢就來了,你時刻要注意在什麼情況下要刪除這個rule,還要確保刪除乾淨...複雜的業務邏輯往往使這一點很難得到保證,於是你就只能將業務邏輯簡單化以遷就iptables...這到底是為什麼??

其根本原因就是iptables在每條規則層面上沒有做到機制與策略分離,沒有做到策略的可配置話,整條iptables規則的操作原子就是該條規則本身,比如你無法將乙個match引數化,無法將乙個target引數化,舉以下例子:

iptables -a forward -s 1.1.1.1 -d 2.2.2.2 -p tcp -j drop

一旦這條規則設定了,如果有一天你控制的目標不再是2.2.2.2了,變成了3.3.3.3,那麼你必須把這條規則刪掉,然後再新增一條新的規則,你無法針對match對增刪改操作。我們知道,一條規則蘊含的是乙個判斷邏輯,而具體的動作一定是要引數化的,這樣才靈活,針對以上的例子規則,它蘊含的邏輯是,起始於某地到達某地的tcp包需要被丟棄!僅此而已,至於說陳述中的「某地」到底是什麼,需要是可配置的。

bsd的pf做到了這一點,它支援變數,巨集等引數化配置概念。諸如最開始的nat配置,像裡面的ip位址這類配置,就可以像寫bash指令碼一樣定義。iptables的規則操作平面的缺失,確實是其硬傷,然而不能一棒子把它打死,我們知道ipset正是彌補這一缺失的努力成果之一,把匹配ip集合的定義移交給了ipset程式。我們期望見到的是很多的set,比如protoset,portset,stateset...在這方面,cisco的nat配置我們也可以看到類似的思想,cisco剝離了acl和nat,acl只負責match。

但是並不是說pf就沒有任何缺點,配置太龐雜了,比如配置策略路由:從哪個網口進來的訪問包還從哪個網口出去。pf的實現方式是引入一系列硬配置route-to/reply,照這個邏輯,每一類的配置都需要引入乙個配置引數咯,此法不妥啊,相反,linux做的很好,通過mark的機制來實現策略路由,基於流的nf-mark可以標記乙個流,很容易通過ip rule的fwmark來配置策略路由,策略路由本身並不是iptables負責的一塊,iptables只管打mark,至於這個mark怎麼用,它不管,策略路由在linux中是單獨實現的一塊,和netfilter沒有任何關係。而pf則不同咯,其實它也有類似mark的tag機制,我覺得為了路由引入配置引數的方式不好。縱貫pf,它除了支援match引數化之外,其它的好像真的很亂,幾乎所有的一切都可以用pf實現,nat只是和pass,block平行的乙個action而已,另外,像什麼**之類的,統統都有相應的配置引數,我覺得這些都可以通過tag分出去的。

如何在Windows上重現macOS上的取證技巧

啟動工具包 首先,即使你以管理員身份登入系統,也必須以管理員許可權啟動工具包。奇熱這個過程非常簡單 只需在資源管理器中找到主程式指令碼 toolkit.cmd 右鍵單擊它,然後選擇 以管理員身份執行 插入工具包中提供的usb加密狗,將開啟新的控制台視窗。此時,你會看到如下結果 在此螢幕上按enter...

分享Macos上一款檔案對比合併同步工具

araxis merge mac版是macos上一款檔案對比合併同步工具,能夠對資源 網頁 xml和具有本地應用程式效能的其它文字文件進行比較和歸整,可以很好的配合軟體工程師和web開發人員工作使用,是一款非常方便的軟體!araxis merge pro for mac 檔案對比合併同步工具 ara...

Mac OS上安裝PostgreSQL的教程

如有侵犯,請來信oiken qq.com 今天我們來看在mac os上安裝postgresql的教程,這裡我們通過brew包管理器來安裝,所以首先我們會講解brew的安裝配置 容我開頭囉嗦一下。一直以來,我和 mysql 這位久經考驗的老朋友合作愉快。但自從了解了一點 postgresql 後,對其...