Linuxネットワーク処理の概要
自分の検証計画のために Linux Network Stackの用語の繋がりの今の理解(当て推量)をまとめた
FreeBSD(netmap, VALE)も面白そうだけどここじゃない。いつか。
TODO
パケット処理をコンポーネントごとの利用例資料に分離していく
汎用設定資料は更新して別に作ってリンクしておく
ここを元に(わからんこと・予想がついてること)の検証リストを作る
そして stacktrace/code reading
概要はここに詳しい
https://linux-kernel-labs.github.io/refs/heads/master/_images/ditaa-528948c80a3fd78b89fb6f7bd69503a58b93a4ae.png
上の図もたぶん正確じゃない
でも、この図の routing に rules, vrf, netfilter がいると思っておけば使うだけなら大外れはしなそう: 要検証
これ参考
他の資料
書籍::Understanding Linux Network Internals
Linux Networking Subsystem
上には書かれてないけど各オブジェクト(インタフェース・arpテーブルなど)は namespace で分離されてる
サーバーの設定は Debian NetworkConfigurationから辿る
ルーティング(Routing)
Virtual Routing and Forwarding(VRF)
L3機能を持つデバイス
テーブルに対応する
ネットワークデバイスのマスターに指定できる
通常はデフォルトVRF(main)がマスターになっている
default なるのもいる
bridgeデバイス(L2)をマスターに指定できる
ソケットもVRFに所属する
通常はデフォルトVRFに所属する
パケット送信は所属VRFから
実際にはその前にRulesを使ったポリシーベースルーティングが行われる
モケット受信は所属VRFに所属するインタフェース経由
カーネルパラメータで全てのVRFに所属するインタフェース経由で受信させられる
net.ipv4.tcp_l3mdev_accept=1
net.ipv4.udp_l3mdev_accept=1
net.ipv4.raw_l3mdev_accept=1
Rules: routing policy database
宛先以外でルーティングする
source address, IP protocol, transport protocol ports or even packet payload
ソケットから出ていく時は最初(namespaceの次)に判断されてそう: 要確認
Netfilterとの関わりはどうなるか理解できてない: 要確認
フィルタリング
Netfilter(wikipedia, official wiki)
パケット処理の各フェーズに処理を挟むフレームワーク
https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Netfilter-components.svg/2560px-Netfilter-components.svg.png
en.m.wikipedia
フックポイントは下の図
https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Netfilter-packet-flow.svg/2560px-Netfilter-packet-flow.svg.png
en.m.wikipedia
Firewall, NAT, QoS, 監視 などの実装に使われる
フロントエンドに nftables, iptables (古い) がある
ufw とかは nftables/iptables 経由でNetfilterを利用している
解説記事
https://qiita.com/bashaway/items/e405d59d92670fbc5341
https://knowledge.sakura.ad.jp/22636/
Neighbor table(arp table)
IP -> mac の変換やってるやつ
namespaceに所属しているっぽい: 要検証
プロトコル層にいる
たしかにフックが登録されていた
L3で受信できる必要があるはず
vrf/namespace のどちらかに所属
bridgeに所属するインタフェースでは対応不可
bridgeについたアドレスだと arp 動く?: 要検証
ネットワークデバイス
RX/TX のリングバッファを持つ
received/sent で割り込み(IRQ)を行う
カーネル内でインタフェースにTraffic Controlを設定できる
仮想インタフェース
TUN/TAP(wikipedia)
L2, L3インタフェース
Tx/Rxパケット・フレームをユーザープロセスで処理できる
いろいろ
vlan, macvlan, bridge, bonded interface, team device, vxlan, ipvlan, macvtap, ipvtap, veth, nlmon, dummy, netdevsim
日本語まとめ記事がある
bridge
使い方
中の紹介
bridgeをmasterに指定したインタフェースはL3機能を失うらしい
arp対応、IPアドレス割り当てなどやらなくなる
bridgeインタフェースは例外らしい(L3機能を持つ?): 要検証
FDBを持っていそう(net/bridgeで実装、net/ipv4/nexthop.cで使われてそう): 要検証
Traffic Control
ネットワークデバイスに設定されるトラフィックコントローラ
tcコマンドで操作する
スケジューラ(qdisc)でQoSなど実現できる
tc-actions(8)はいろいろ
L3スイッチエミュレーションに使ったり
MLAG風インタフェースを実現できる
ネットワークスタック・ネットワークデバイスの制御(Netlink)
ネットワークスタック全般でNetlinkが使われる
カーネル内ネットワーク(AF_NETLINK)経由でいろいろ制御する
仕様はRFC3549(Information)
使い方は通信先ごとにある
Netfilter についてのLWN nfnetlinkなど
iproute2で利用してる
libnlライブラリが提供されいている
Netlink Library (libnl)とかも参考になる
linux foundation generic netlink howto
ソケット
基本的にプロセスはソケット経由で通信を扱う
ここまでに例外ばかり出てきたけど
インターネットでは AF_INET, AF_INET6 などを使う
man socket(2)
man raw(7)
AF_INET ではネットワークレイヤを直接扱える
イーサフレームとかは見えない
AF_PACKETだとイーサフレームがみえる
example
tutorial
Linux Network Stackの拡張や外側
いろんな目的で拡張したり置き換えられたり連携したりがある
柔軟なネットワーク制御
高速なパケット処理
ハードウェア・オフロード
Linux Network Stackオーバーヘッド削減
仮想化オーバーヘッド削減
実用的な並列化
ユーザープログラムの利用 in/as ネットワークスタック
目的や効果
柔軟なネットワーク制御
高速なパケット処理
ハードウェア・オフロード
Linux Network Stackオーバーヘッド削減
eBPF/XDP
eBPF プログラムをNIC, device driver, network stack の先頭で実行することで高速処理
対象外のパケットを Linux Network stack に委譲できる (XDP_PASS)
コードは小さくなる
カーネル内VMで実行
安全のため評価器を通過する
制限がいくつかある
e.g. ループ数固定、配列要素アクセス前検査コード必須、関数は inline or tail call、命令数制限など
AF_XDP を使うとアプリケーションに渡せる like SOCK_RAW
DPDK
ドライバは polling してるユーザープロセスに直接通信を見せる
Linux Network stack を経由しないので全てを実装しないとならない
Overviewはこれ
ぜんぜん理解してない
いろいろなところで使われている
ecosystem(official)
解説記事があった
mbufまわりの記事
ハードウェアとの連携
並列処理
Scaling in the Linux Networking Stackが鉄板
RSS
みんな読んでる
読んでないのは俺だけ
デバイスで受け取ったパケットを分散させる
処理するCPU/コア/ソフトウェアが偏るとスケールしない
正しく分散させないとセッションを壊したり不都合が生じる
XPSという送信サイドの話もある
ほかに
Network Performance in the Linux Kernel
ゆううきさんの記事を読む
Linux Network Scaling: Receiving Packetsが図付きでありがたい
仮想化のオーバーヘッド削減
SR-IOV
PCI expressの拡張仕様
複数の仮想マシンでIOデバイスを共有できる
ハードウェア・オフロード
最近のNICは賢いだけでなくCPU積んでたりもするんだって
switchdevなどswitch機能を外に出せるらしい
XDPも対応NICなら外に出せる
セグメンテーション処理のオフロード
TSO: TCP Segmentaiton Offload(TXサイド)
LRO(RSC): Large Receive Offload (Receive Side Coalescing)(RXサイド)
Linux Network Stackの外側・連携
通信はデータプレーン、コントロールプレーンがある
データプレーンなモジュール・ミドルウェア
DPDK利用高速パケット処理
VPP
パケット処理にベクトル処理(SIMD命令)を使う高速ネットワーク実装らしい
F-Stack
FreeBSDをポートしたTCP/IPスタック
Open vSwitch
いろんなところで使われている仮想スイッチ
この上で仮想ネットワークを作るOVNなどもある
コントロールプレーンなミドルウェア
有名実装
BIRD
FRR
データプレーンはLinux
VPPも追加されたらしい
VyOSが使っている