IPsec通信をFasttrackに載せるには

Blog

Twitterを確認していたところ、気になったTweetがあったのでご紹介。

RouterOSの機能の特徴の一つに、Fasttrackと呼ばれる機能があります。これはRouterOS 6.29から実装されました。

こちらの機能については簡単に言うと、Linux kernelでの処理をBypass転送することで、CPU負荷を減少させ、また副産物としてスループットの向上が挙げられます。

前説

こちらについてはwikiの以下の項目を参照してください。

有効前有効後
360Mbps890Mbps
CPU使用率 100%CPU使用率 86%
上記のうちFirewallが44%消費上記のうちFirewallが6%消費

劇的な性能改善が見込めるものの、いくつか制約があります。

サポートハードウェアは以下のもののみ。

RB6xx seriesether1,2
RB7xx seriesall ports
RB800ether1,2
RB9xx seriesall ports
RB1000all ports
RB1100, RB1000AHx2ether1-11
RB1000AHx2all ports
RB2011 seriesall ports
RB3011 seriesall ports
RB4011 seriesall ports
CRS series routersall ports except management interface (if the device has one)
CCR series routersall ports except management interface (if the device has one)
All deviceswireless interfaces, if wireless-fp, wireless-cm2, wireless-rep or wireless (starting from 6.37) package used

また機能的にはいくつかの機能がFasttrackよりも遅い(内部)経路を通過するときがあります。

FastTracked packets bypass firewall, connection tracking, simple queues, queue tree with parent=global, ip traffic-flow(restriction removed in 6.33), IP accounting, IPSec, hotspot universal client, VRF assignment, so it is up to administrator to make sure FastTrack does not interfere with other configuration;

https://wiki.mikrotik.com/wiki/Manual:IP/Fasttrack#Description

最近ではMikrotikの開発も頑張っており、いくつか改善してきますが、特に用途の多いものと思われるIPsecについてはFasttrackの恩恵を受けることがまだ出来ないでいます。(しかし2017頃からのいくつかの製品については、CPU側でのハードウェアオフロードが実装されてきており、CPU負荷の低減は図られてきています)

本題

しかし、フィルタでのパケット判定をうまく使用することでIPsec接続において、Fasttrackへパケット処理を流すということを出来るようです。

具体的には以下のWebサイト。

設定例

具体的には以下のコマンドを設定し、入出力のipsecを”ipsec”としてmark-connectionします。

/ip firewall mangle add action=mark-connection chain=forward \
	comment="mark ipsec connections" ipsec-policy=out,ipsec \
	new-connection-mark=ipsec
/ip firewall mangle add action=mark-connection chain=forward \
	comment="mark ipsec connections" ipsec-policy=in,ipsec \
	new-connection-mark=ipsec

次に上記でmarkするようにしたipsecを避けるようにFasttrackの設定を追加します。このあたりは通常のFasttrackと同じように見えますが、2行目最後のconnection-mark=!ipsecがあるように、ipsecとmarkされたもの以外をFasttrack接続に投入するようにします。

/ip firewall filter add chain=forward action=fasttrack-connection \
	connection-state=established,related connection-mark=!ipsec
/ip firewall filter add chain=forward action=accept \
	connection-state=established,related

最後にAmazing!と書かれているように、 IPsec site-to-siteトンネルによる通信では驚くような性能改善が出来ているようです。

筆者の手元の環境ではちょっとIPSecなS2S通信の環境を用意できていないので、こちらは追試とさせてください。

最後に

これであるならばある程度でもhEX S(やRB4011)などを使用しても、複数本のIPsecトンネルを張るような事になっても設定前よりは負荷を減らすことが出来る or トンネルの収容増加も可能になるのではないかと思います。

Thanks for the good information, @jozevolf .

参考情報:

NAT and Fasttrack Bypass

At this point if you try to send traffic over the IPsec tunnel, it will not work, packets will be lost. This is because both routers have NAT rules (masquerade) that is changing source address before packet is encrypted. Router is unable to encrypt the packet, because source address do not match address specified in policy configuration. For more information see IPsec packet flow example.
To fix this we need to set up IP/Firewall/NAT bypass rule.

https://wiki.mikrotik.com/wiki/Manual:IP/IPsec#NAT_and_Fasttrack_Bypass