ããã«ã¡ã¯ï¼id:hanazukiã§ãï¼æ¾å±±ã§éå¬ãããRubyKaigi 2025ã«ä½äººãã®KMCé¨å¡ã¨ã¨ãã«åå ãï¼Wi-Fiã®æ§ç¯ã»éç¨ããã£ã¦ãã¾ããï¼KMCæ´»åããã°ã«è¨äºãæ¸ãã®ã¯2023å¹´ã®DNSãªã¾ã«ãã®è¨äºã¶ãã§ãï¼
ç¾å°ã§ãåããã¦ãã¾ã£ã¦ããããã§ããï¼ä»å¹´ã®RubyKaigiã§ã¯15人ããNOCã¡ã³ãã¼ã®éåæ°ã伿ä¸ã«ä½èª¿ä¸è¯ã§ãã¦ã³ããã¤ã³ã·ãã³ãã«è¦èããã¦ãã¾ãã¾ããï¼ç§ã¯ã©ããã風éªã¨é£ä¸æ¯ãæéå·®ã§ããã£ãããã§ï¼RubyKaigiæ¬ç·¨ãNOCã®æ´»åãæºè¶³ã«åå ã§ããï¼ããã¸ãæ®å¿µã§ããï¼æåªã§è²·ã£ã¦ããã¿ããã1é±éãããé£ã¹ç¶ãã¦ããã快復ãã¾ããï¼
ãã¦ï¼RubyKaigi 2025ã§ã¯ï¼ä»å¹´ããã®æ°ãã試ã¿ã¨ãã¦IPv6-mostlyãããã¯ã¼ã¯ãæä¾ãã¦ãã¾ããï¼IPv6-mostlyã¨ã¯ï¼464XLATã¨å¼ã°ããIPv6ç§»è¡æè¡ã対å¿ã¯ã©ã¤ã¢ã³ãã¸é¸æçã«å±éãããã¨ã§ï¼æ¼¸é²çã«IPv4ã®å©ç¨ã忏ãã¦ããæ¹å¼ã®ãã¨ã§ãï¼464XLATã¯ï¼IPv4ã¢ããªã±ã¼ã·ã§ã³ã¨IPv4ã®ãµã¼ãéã®éä¿¡ã®ä¸éé¨åãIPv6ã§ä»£æ¿ããæè¡ã§ãï¼ãã®ããã«å¿ è¦ãªNAT64ï¼IPv6ããIPv4ã¸ã®NAPTï¼ã®å®è£ ã¨ãã¦ï¼OSSã§ã¯Joolã¨ããLinuxã«ã¼ãã«ã¢ã¸ã¥ã¼ã«ãããå©ç¨ããã¦ãã¾ããï¼ä»åã®RubyKaigiã§ã¯NAT64ã®Rubyã«ãã代æ¿å®è£ ãéçºãããã¨ãç®çã®ä¸ã¤ã¨ãã¦ï¼IPv6-mostlyãããã¯ã¼ã¯ã®å®è£ å®é¨ãè¡ãã¾ããï¼
å æ¥ã®æ±äº¬Rubyä¼è°12ã§ã®çºè¡¨ã§ãç´¹ä»ããããã«ï¼1ã¶æã»ã©åããèªå® ã®æ¤è¨¼ç°å¢ã§ç¨®ã ã®ã¯ã©ã¤ã¢ã³ãã¨ã®IPv6-mostlyã®ç¸äºéç¨è©¦é¨ããã¦æ¬çªã«æãã ã®ã§ããï¼æ¾å±±ã§ã¯ãã¾ãå®å®ç¨¼åããããã¾ããã§ããï¼ããå®¶ã®æ¤è¨¼ç°å¢ã¯ç§ç©ã®ãããã¯ã¼ã¯æ©æã®ä½ãç©ã§çµãã§ããé½åã§ï¼æ¬çªã§å©ç¨ãã¦ããCisco WLCï¼ç¡ç·LANã³ã³ããã¼ã©ï¼ã§ã¯ãªãCisco Mobility Expressã使ã£ã¦ããã¨ããï¼ã©ãããWLCï¼ãããã¯RubyKaigiã§ä½¿ã£ã¦ããWLCã®è¨å®ï¼ã¨macOSã®IPv6-mostlyå®è£ ã«ç¸æ§ã®åé¡ããã£ãããã§ãï¼æ¥æ¬Rubyã®ä¼ã«äºåæ©æã¨ãã¦ååã®WLCã1å°è¿½å 調éãã¦ããã£ãã®ã§ï¼ããã使ã£ã¦åå ç©¶æããæ¬¡åã¸åãã¦èª¿æ´ãããã¨æã£ã¦ãã¾ãï¼
RubyKaigiã®IPv6-mostlyãããã¯ã¼ã¯ã®å ¨è²ã«ã¤ãã¦ã¯ãã¼ã ã¡ã¤ãã®id:sora_hã«è²ããã¨ã«ãã¦ï¼æ¬ç¨¿ã§ã¯ä»åã®RubyKaigiã§ä½¿ç¨ããããã«æ°ããéçºããã½ããã¦ã§ã¢ã¨ãã®éã®å·¥å¤«ï¼ãããã¯å°ãã¿ï¼ãç´¹ä»ãã¾ãï¼ãã¡ãããããã®ã½ããã¦ã§ã¢ã®ä¸»è¦é¨åã¯Rubyã§æ¸ããã¦ãã¾ãï¼RubyKaigiãªã®ã§ï¼
Xlat: SIITã®Rubyå®è£
ä»åRubyKaigiã«IPv6-mostlyãå°å ¥ããã«ããã£ã¦ï¼sora_hã¨hanazukiã§SIITã®å®è£ ãRubyã§æ¸ãã¾ããï¼ãããXlatã¨å¼ãã§ãã¾ãï¼
SIIT (Stateless IP/ICMP Translation)ã¯ï¼IPv4ãã¼ã¿ã°ã©ã ã¨IPv6ãã¼ã¿ã°ã©ã ã®ç¸äºå¤æãããã¢ã«ã´ãªãºã ã§ï¼RFC 7915ã§å®ç¾©ããã¦ãã¾ãï¼IPv4ã¨IPv6ã§ã¯ãããã®å½¢å¼ãç°ãªãã®ã§ï¼SIITã¯ç¿»è¨³å ã®ãã¼ã¸ã§ã³ã®IPããããã§ããã ãè¾»è¤ãããããå½¢ã§çæãï¼IPv4ãããã¯ã¼ã¯ã¨IPv6ãããã¯ã¼ã¯ã®éã§ç¸äºã«IPãã¼ã¿ã°ã©ã ã®ããã¨ããã§ããããã«ãã¾ãï¼
ã¾ãï¼IPv4ã¨IPv6ã§ã¯ã¢ãã¬ã¹ä½ç³»ãç°ãªãã®ã§ï¼IPv4ãã¼ã¿ã°ã©ã ãIPv6ãã¼ã¿ã°ã©ã ã«ç¿»è¨³ããã¨ãã«ã¯ï¼éä¿¡å ã¨å®å ã®IPã¢ãã¬ã¹ãé©å½ã«æ¸ãæãã¦ããå¿ è¦ãããã¾ãï¼IPv6-mostlyã§ã¯ï¼IPv4ã®ä¸çã表ãIPv6ãã¬ãã£ã¯ã¹ãä¸ã¤é¸ãã§ï¼ãããPref64::/nã¨å¼ã³ã¾ãï¼ï¼IPv4ã¢ãã¬ã¹ãPref64::/nã®æ«å°¾ã«åãè¾¼ããã¨ã§ã¢ãã¬ã¹ã®å¯¾å¿ä»ããè¡ãã¾ãï¼è©³ç´°ã¯RFC 6052ãåç §ï¼ï¼ä¾ãã°ï¼RubyKaigiã§ã¯Pref64::/nã¨ãã¦2001:df0:8500:ca64:a9:8200::/96ã使ãã¾ããï¼ãã®ã¨ã192.50.220.162ã¯2001:df0:8500:ca64:a9:8200:c032:dca2ã«å¯¾å¿ä»ãããã¾ãï¼
ãã®Pref64::/nã¯16 bitåä½ã§ã®1ã®è£æ°åã0ã«ãªãããã«é¸ãã§ããã¾ã(0x2001+0x0df0+0x8500+0xca64+0x00a9+0x8200=0xffff=0)ï¼ãã®ãããªãã¬ãã£ã¯ã¹ã®ãã¨ãããã§ãã¯ãµã ä¸ç« (checksum-neutral)ãã§ããã¨è¨ãã¾ãï¼TCPãUDPã®ãã§ãã¯ãµã ã¯1ã®è£æ°åã§è¨ç®ãããã®ã§ï¼ãã®é¨åããã§ãã¯ãµã ã®å¤ã«å½±é¿ãä¸ããªãã¨ãããã¨ã§ãï¼ãã§ãã¯ãµã ä¸ç«ãªPref64::/nãé¸ã¶ã¨ï¼ç¿»è¨³æã«L4ãããã®ãã§ãã¯ãµã ãæ´æ°ããå¿ è¦ããªãå°ãã ãå¹ççã«ãªãã¡ãªãããããã¾ãï¼
IPv6ã§ã®NAPTã§ããNAPTv6ï¼ãã¬ãã£ã¯ã¹ãåãæ¿ããNPTv6ã¨ã¯ç°ãªãã®ã§æ³¨æï¼ã¨SIITï¼IPv6ããIPv4ã¸ã®å¤æï¼ã颿°åæããã¨ï¼NAT64ï¼IPv6ããIPv4ã¸ã®NAPTï¼ãä½ãã¾ãï¼Linuxã«ã¼ãã«ã®NetfilterãNAPTv6ã®æ©è½ãæã£ã¦ããã®ã§ï¼ããã¨ã¦ã¼ã¶ã©ã³ãã®Xlatãçµã¿åããããã¨ã§NAT64ãå®ç¾ã§ãã寸æ³ã§ãï¼
RubyKaigiã§ã¯ï¼çæ°æåä¼é¤¨ã®æ¥½å±å»ä¸ã§2å°ã®N100ããPCã«ã¤ã³ã¹ãã¼ã«ãããXlatãï¼ã¿ãªããã®MacBookã»iPhoneã»Androidãªã©IPv6-mostly対å¿ã¯ã©ã¤ã¢ã³ãããã®ãã©ãã£ãã¯ãNAT64ãã¦ãã¾ããï¼ã¡ããªã¯ã¹ãè¦ãã¨ï¼NAT64ã«ã¯ãã¼ã¯ã§200 Mbpsãããæµãã¦ããããã§ãï¼äºåã®æ¤è¨¼ã§ã¯1500 Bã®ãã³ã°ãã±ããã§1å°ããã1 Gbpsï¼ã¤ã¾ãï¼NICã®éçï¼ã¾ã§ã¯æãããã¨ã確èªãã¦ããã®ã§ï¼ããã©ã¼ãã³ã¹é¢ã§ã¯ååãªä½è£ãããã¾ããï¼
ãªãã¸ã§ã¯ãå²å½ã®åæ¸
ä»å¹´ã®RubyKaigiã§Class#newãé
ãã®ã ã¨ããçºè¡¨ãããã¾ãããï¼ç§ã¯è£çªçµãè¦ã¦ãã¾ããï¼ï¼Xlatã®åæã®å®è£
ã§ããªãã¸ã§ã¯ããä½ãããã¦ãã¦é
ãã¨ããåé¡ãè¸ãã§ãã¦ï¼ã§ããã ããªãã¸ã§ã¯ãã使ãåããããã«APIã夿´ããä¿®æ£ãè¡ãã¾ããï¼
Xlatã®ããã©ã¼ãã³ã¹ã®åé¡ã調ã¹ãã®ã«ï¼NOCã¡ã³ãã¼ã§ãããã¡ã¤ã©è·äººã®osyoyu (id:tomo_ari)ãéçºãã¦ããPf2ã¨ãããããã¡ã¤ã©ã使ããã¦ãããã¾ããï¼Pf2ã¯ã©ã®Rubyã¡ã½ãããã©ã®C颿°ãå¼ã³åºãã¦ããã®ãå¯è¦åã§ãããããã¡ã¤ã©ã§ãï¼Pf2ã使ãã¨ã©ã®ã¡ã½ããã§ãªãã¸ã§ã¯ãã®å²å½ãè¡ããã¦ãããä¸ç®çç¶ã«ãªãã®ã§ä¾¿å©ã§ããï¼ãã¨ãã°ï¼ãã¼ãµãæ¹åããåã¨å°ãæ¹åããå¾ã®ãã¬ã¼ã ã°ã©ããæ¯è¼ããã¨Xlat::Protocols::Ip#parseã®é¨åã®çãä¸ãããæ¸ã£ã¦ããã®ãè¦ã¦ã¨ãã¾ãï¼ææ°çã§ã¯ããå°ãæ¹åãã¦ãã¾ãï¼
ãªãã¸ã§ã¯ãã®å²å½ãããã©ã¼ãã³ã¹ãæªåãããã®ã¯ï¼Class#newãé
ãã ãã§ã¯ãªãï¼ä»éçã«ã¬ã¼ãã¸ã³ã¬ã¯ã·ã§ã³(GC)ãå®è¡ããããã¨ãè¦å ã«ãªã£ã¦ãã¾ãï¼TCPã®è¼»è¼³å¶å¾¡ã¢ã«ã´ãªãºã ã¯ãããã¯ã¼ã¯ã®RTTãäºæ¸¬ãã¦é©æ£ãªæµéã§ãã±ãããæµãã¾ãï¼GCãèµ°ãã¨ãã±ããã®å¦çæéã«ãããï¼ã¸ãã¿ã¼ï¼ãçºçãããã¨ã«ãªãï¼ããã¯TCPã®ããã©ã¼ãã³ã¹ã«æªå½±é¿ãåã¼ãã¾ãï¼ãããã£ã¦ï¼ãªãã¸ã§ã¯ãã®å²å½ã¯ã§ããã ãæ¸ããã®ãæã¾ããã§ãï¼
IO::Bufferã¨ãã¯ã¿IOã®å©ç¨
IPv4ã¨IPv6ã§ã¯ãããã®é·ããç°ãªãã¾ãï¼IPv4ã§ã¯20 Bãã60 Bã®å¯å¤é·ï¼IPv6ã§ã¯40 Bã®åºå®é·ãããã«ãã¾ãã¾ãªæ¡å¼µããããä»ä¸ã§ãã¦é·ãã«ä¸éãããã¾ããï¼ãããã£ã¦ï¼IPv4ã¨IPv6ã®éã§ãã¼ã¿ã°ã©ã ã翻訳ããã¨ï¼ã»ã¨ãã©ã®å ´åï¼é·ããå¤ããã¾ãï¼
MRIã§ã¯ï¼Stringã®é¨åæååãåã£ããï¼Stringå士ãé£çµãããããã¨ï¼æååã®ãã¤ãåãã³ãã¼ãããã¨ã«ãªãã¾ã*1ï¼ããããï¼SIITã®ããã«é·ãã®å¤ãããã¤ãåã®æä½ãStringã§å®è£
ããã¨ï¼ã©ããã¦ããã¼ã¿ã®ã³ãã¼åæ°ãå¤ããªãéå¹çã§ãï¼
Xlatã§ã¯ï¼ãã¤ãåãIO::Bufferã使ã£ã¦ä¿æãï¼Linuxã®ãã¯ã¿IO (writev(2))ã使ã£ã¦åºåãããã¨ã§ï¼Rubyããã»ã¹å
ã§ã®ãã¼ãã³ãã¼ããå®ç¾ãã¦ãã¾ãï¼ä¾ãã°ãããã¨ãã¤ãã¼ããããããIO::Bufferã¨ãã¦æã£ã¦ããã¨ãã«ï¼ãããã1åã®writev(2)ã·ã¹ãã ã³ã¼ã«ã§ã¾ã¨ãã¦åºåãããã¨ã§ï¼1ã¤ã®IPãã¼ã¿ã°ã©ã ã¨ãã¦åºåããã¨ããå
·åã§ãï¼IO::Bufferã§ãã¯ã¿IOã使ãAPIãä»ã®Rubyã«ã¯ç¡ãã®ã§ï¼ãã®é¨åã ãæ¡å¼µã¨ãã¦å®è£
ãã¦ãã¾ãï¼
IO::Bufferã®é¨åãã¤ãåï¼ã¹ã©ã¤ã¹ï¼ãæãåºã#sliceã¡ã½ããã¯ï¼ãã¤ãåã®ã³ãã¼ããããªããã®ã®ï¼IO::Bufferã®ã¤ã³ã¹ã¿ã³ã¹ãæ°ããå²ãå½ã¦ã¦ãã¾ãåé¡ãããã¾ãï¼C++ã®std::span<T>ãRustã®&[T]ã®ãããªãã¡ãããã¤ã³ã¿ï¼ãã¤ã³ã¿ã®é·ãã®å¯¾ï¼ã®ã¤ããã§ä½¿ãã¨GCã®ã³ã¹ããä¹ã£ã¦ãã¦çãç®ãè¦ãã¨ãããã¨ã§ãï¼ããã®åé¿çã¯ç°¡åã§ï¼ã¹ã©ã¤ã¹ãä½ã代ããã«(buffer, offset, length)ã®3ã¤çµãæã¡åã£ã¦ï¼ã©ããã¦ãå¿
è¦ãªæã¾ã§IO::Buffer#sliceã®å¼ã³åºããé
å»¶ããããã¨ã§ãï¼
YJITã¨Ractor
YJITãæå¹ã«ããã¨åæã«ããã°ã©ã ãéããªãï¼ããã¸ãå大ã§ããï¼å
·ä½çã«ã¯ï¼1ã¹ã¬ããã®Xlatã§1ã¹ããªã¼ã ã®TCPãå¦çããå ´åã®ã¹ã«ã¼ãããã240 Mbpsãã430 Mbpsã«æ¹åãããããã®å¹æãããã¾ããï¼ã¡ã½ããããã¾ãç´°ããåããªãã³ã¼ãã£ã³ã°ã¹ã¿ã¤ã«ãå¹ãã¦ããã®ã§ã¯ãªããã¨æ³åãã¦ãã¾ããï¼å®éã®ã¨ããã¯è©³ããè¨ã£ã¦ãã¾ããï¼IO::Bufferã¯Stringãªã©ã¨æ¯ã¹ã¦ã¾ã ãã¾ãYJITã§æé©åããã¦ããªãã®ã§ï¼ãã¨ãã°IO::Buffer#get_valueãªã©ãã¤ã³ã©ã¤ã³åã§ããããã«ãªãã¨å¬ããã®ã§ã¯ãªããï¼ãªã©å¦çç³»ã®æ¹ãããæ´ãªãæ¹åã®ä½å°ã¯ããããã«èãã¦ãã¾ãï¼
ã¾ãï¼SIITã®Sãâstatelessâã®é æåã§ãããã¨ãããããããã«ï¼SIITã¯ç¶æ ãæããªãã¢ã«ã´ãªãºã ã«ãªã£ã¦ãã¾ãï¼ããªãã¡ï¼ããä¸ã¤ã®ãã¼ã¿ã°ã©ã ã翻訳ããéã«ï¼ãã®ãã¼ã¿ã°ã©ã ã®åå¾ã®ãã¼ã¿ã°ã©ã ã®æ å ±ãå¿ è¦ã¨ãã¾ããï¼ããã¯ç°ãªãRactorã¤ã³ã¹ã¿ã³ã¹éã§ç¶æ ãå ±æã§ããªãã¨ããRactorã®å¶ç´ã«å¯¾ãã¦é常ã«é½åãããæ§è³ªã§ãï¼ç¿»è¨³ã¯ã¼ã«ã¼ãããããåå¥ã®Ractorã¨ãã¦èµ·åãããã¨ã§ï¼ãã«ãã³ã¢ãæ´»ããã¦CPUå¦çã並ååã§ãã¾ãï¼Ractorã®âactorâã®é¨åã¯ä½ã使ã£ã¦ãã¾ãããï¼GVLãRactoræ¯ã«åå²ãããã®ãå¹ãã¦ããäºä¾ã§ããï¼
RubyKaigiã§ã¯Ractorãã¼ã«ã«GCã®çºè¡¨ãèããã³ãã¦ãã¾ã£ãã®ã§ããï¼Ractorãã¼ã«ã«GCãå®ç¾ããå ´åï¼GCä¸ã®ã¯ã¼ã«ã¼ã«ã¯ã¿ã¹ã¯ã渡ããªãããã«å¶å¾¡ãããã¨ã§ï¼ã¿ã¹ã¯ã®å¦çãGCã«ãã忢ã®å½±é¿ããããªãããã«ã§ããã®ã§ã¯ãªããã¨èãã¾ããï¼ãªãã¸ã§ã¯ãå²å½ãç®ã®æµã«ããªãã¦ãããªãã°å¬ããï¼æ°ã«ãªã£ã¦ãã¾ãï¼
ãã¡ã¸ã³ã°
SIITã¸ã®å ¥åã¯ãã¹ã¦ã¦ã¼ã¶ç«¯æ«ãã¤ã³ã¿ã¼ãããããä¸ãããããã®ã§ï¼ãã¼ã¿ã°ã©ã ãæ£ããå½¢å¼ã«å¾ã£ã¦ããä¿è¨¼ã¯ããã¾ããï¼Rubyã¹ã¯ãªããã¨ãã¦æ¸ãã¦ãã以ä¸ï¼ç¯å²å¤åç §ã§ã¡ã¢ãªãå£ãããããªæ·±å»ãªäºæ ã«ã¯é¥ãã¾ãããï¼å£ãããã¼ã¿ã°ã©ã ãé£ã¹ããããã¦ä¾å¤ãä¸ãã¦ãã¾ãã®ã¯é²ãããã§ãï¼ããã§Ruzzyã¨ããã©ã¤ãã©ãªã使ã£ã¦ãã¼ãµã¨SIITå®è£ ã®ãã¡ã¸ã³ã°ãè¡ã£ã¦ãã¾ããï¼
Ruzzyã¯å
é¨çã«LLVMã®libFuzzerã使ã£ã¦ãã¦ï¼ã³ã¼ãã«ãã¬ãã¸ãæ¡å¤§ããããã«ã©ã³ãã ãªå
¥åãçæãç¶ããä»çµã¿ã«ãªã£ã¦ãã¾ãï¼Rubyã¹ã¯ãªããããã¡ã¸ã³ã°ããå ´åã¯ï¼Integerã®æ¯è¼ãããã¯ãããã¨ã§åå²ãã©ã¡ãã«é²ãã ããè¨é²ãã¦ããããã§ãï¼ãããã£ã¦ï¼ä¾ãã°IO::Buffer#<=>ã®ãããªCã§å®è£
ãããæ¯è¼ã¡ã½ãããRubyã¹ã¯ãªããä¸ã§å岿¡ä»¶ã«ä½¿ã£ã¦ããå ´åï¼ãããIntegerã®æ¯è¼ã使ãããã«Rubyã§å®è£
ãç´ããã¨ã«ãã£ã¦ï¼Rubyã¤ã³ã¿ããªã¿èªä½ãè¨è£
ã®ããã«ãªãã«ããããã¨ãªããã¡ã¸ã³ã°ãè¡ãã¾ãï¼
ç¯å²å¤åç §ãå¢çã¨ã©ã¼ã®ãããªãããã¡ãªãã°ãçºè¦ãã¦ãããã®ã¿ãªããï¼æãããããªããããªç°å¸¸ãªãã±ãããæ¬¡ã ã«çæãã¦ããã¦å¤§ãã«ãããã°ã®å©ãã«ãªãã¾ããï¼
ããã®ãã
伿ã¾ã§ã«å®æãããããªãã£ããã¨ãããããããï¼æ¥å¹´åº¦ã«ããã¦ç£¨ãã¦ããããã¨æã£ã¦ãã¾ãï¼TCPã¨UDPã®ãã±ããã®ç¿»è¨³ããããã¹ã«é¢ãã¦ã¯ï¼ãªãã¸ã§ã¯ãã®å²å½ãããªãæ¸ãããã®ã§ããï¼ICMPãæ±ãé¨åã§ã¾ã éå¹çãªé¨åãæ®ã£ã¦ããã®ãæ¹åãããã¨ããã®ããã®ä¸ã¤ã§ãï¼
ãã¯ã¿IOãè¡ãé¨åã¯æ¡å¼µã¨ãã¦å®è£
ããã®ã§ããï¼ç¾ç¶IO::Bufferã®é
åã弿°ã¨ãã¦åãã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ãªã£ã¦ãã¾ãï¼ã¤ã¾ãå¼ã³åºãå´ã§IO::Bufferã®åºåã«å¿
è¦ãªç¯å²ã®ã¹ã©ã¤ã¹ãã¨ãåæã§ãï¼ããã§ã¯å
è¿°ã®IO::Buffer#sliceã®ãªã¼ãã¼ããããé¿ããããªããã¨ããï¼ãããããããã¤ã³ã¿ã¼ãã§ã¤ã¹ãèãããã§ãï¼
ã¾ãï¼ãã®æ¡å¼µã¯Rustã¨magnusã使ã£ã¦å®è£ ãããã®ã®ï¼å®å ¨æ§ã®ããã«å¾®å¦ã«ä½åãªãªã¼ãã¼ããããä¹ããã¨ãããã£ã¦ï¼C++ã§æ¸ãç´ãããã¨æã£ã¦ãã¾ãï¼ããããå¥ã®ã¨ããã§å¿ è¦ã«ãªã£ã¦rcxã¨ããã¢ãã³C++ã§Rubyã®æ¡å¼µãæ¸ãããã®ã©ã¤ãã©ãªãä½ã£ã¦ããã¨ããã®ãããã¾ã*2ï¼ãããã¾ãå¥ã®æ©ä¼ã«ç´¹ä»ãããã¨æãã¾ãï¼
conntrack_exporter
Netfilterã®ã³ãã¯ã·ã§ã³ãã©ããã³ã°(conntrack)ã®ç¶æ ãå¯è¦åããããã«ï¼conntrack_exporterãRubyã§æ¸ãã¾ããï¼ååã®ã½ããã¦ã§ã¢ã¯ä¸ã®ä¸ã«åå¨ããã®ã§ããï¼ä»åæ¸ããconntrack_exporterã¯ï¼conntrackã¨ã³ããªãL3ãããã³ã«ã»L4ãããã³ã«ã»ã©ãã«(connlabel)ã§éç´ãã¦æ°ããããã®ãç¹å¾´ã§ãï¼connlabelã¨ã¯åconntrackã¨ã³ããªã«ãã128 bé·ã®ãããã»ããã§ï¼åãããã1ã¤ã®ã©ãã«ã«å¯¾å¿ãã¦ãã¾ãï¼nftablesãªã©ã使ãã¨connlabelã«ç®¡çç¨ã®å¥½ããªå¤ãè¨å®ã§ãã¾ãï¼
RubyKaigiã§ã¯NAT64ã®ã¢ãã¬ã¹ãã¼ã«æ¯ã«ç°ãªãconnlabelãä»ä¸ãããã¨ã§ï¼åã¢ãã¬ã¹ãã¼ã«ããL4ãã¼ããã©ãã ã使ããã¦ããããèå¥ã§ããããã«ãã¦ãã¾ããï¼UDPã§ã¯ï¼NAPTã®å¤å´IPã¢ãã¬ã¹1ã¤ããã64,512æ¬ï¼UDPã§å©ç¨å¯è½ãªãã¹ã¦ã®ãã¼ã2**16åããï¼ã·ã¹ãã ãã¼ã2**10åãé¤ããæ°ï¼ã®ã³ãã¯ã·ã§ã³ããå¼µããªãå¶ç´ãããããï¼ãã¼ãã®å©ç¨çãç£è¦ãããã¨ã§ã¢ãã¬ã¹ãã¼ã«ã®ãµã¤ãºã決ããç®å®ã«ãªãã¾ãï¼
nl/ynl
conntrack_exporterãå®è£ ããã«ããã£ã¦ï¼Rubyã§ä½¿ããNetlinkã®ã©ã¤ãã©ãªãå¿ è¦ã¨ãªãnlã¨ããåã®gemãæ¸ãã¾ããï¼Netlinkã¨ã¯Linuxã®ããã»ã¹ééä¿¡ã®ä»çµã¿ã®ä¸ã¤ã§ï¼ä¸»ã«ã¢ããªã±ã¼ã·ã§ã³ãã«ã¼ãã«ã®æã£ã¦ããæ å ±ãåå¾ãããï¼ã«ã¼ãã«ã®ç¶æ ã夿´ãããããã®ã«ä½¿ããã¦ãã¾ãï¼
Netlinkã®éä¿¡ãããã³ã«èªä½ã¯ï¼ã½ã±ããä¸ã§ãªã¯ã¨ã¹ãã»ãªãã©ã¤ã®ã¡ãã»ã¼ã¸ãé ã«ããã¨ãããã ãã§ï¼ãã»ã©è¤éã§ã¯ããã¾ããï¼ãããï¼å¯¾è©±ãããã«ã¼ãã«ã®ãµãã·ã¹ãã ãã¨ã«ã¡ãã»ã¼ã¸ãã¨ã³ã³ã¼ãã»ãã³ã¼ãããã³ã¼ããæ¸ãã®ãããã¸ãã«é¢åã¨ããåé¡ãç¥ããã¦ãã¾ãï¼ã¡ãã»ã¼ã¸ã¯åºæ¬çã«TLV (tag-length-value)ã®ãã©ã¼ãããã«å¾ã£ã¦ãããã®ã®ï¼tagã¯Cè¨èªã®ãããã§å®ç¾©ããã¦ãã¦ï¼valueã®ãã©ã¼ãããã¯Cãããã®ã³ã¡ã³ããï¼éããããã°manpageã«èªç¶è¨èªã§æ¸ããã¦ãããã®ãè§£èªããªããã°ãªãã¾ããï¼ãã®ãããªçç±ããï¼ç¶²ç¾ çãªã¨ã³ã³ã¼ãã»ãã³ã¼ããæ¸ããã¨ãç¾å®çã«ã¯å°é£ã§ï¼ã¡ã³ããã³ã¹ãç¶ããªããªãããã¸ã§ã¯ããå°ãªãããã¾ããã§ããï¼
ãã®ãããªåé¡ã解決ããããã«ï¼æ©æ¢°å¯èªã§Cã«ä¾åããªãã¡ãã»ã¼ã¸ã¹ãã¼ããæä¾ããããã¸ã§ã¯ããYNLã§ãï¼YNLã®YãYAMLã®Yã§ããããã«ï¼YAMLå½¢å¼ã§åãµãã·ã¹ãã ã®ã¡ãã»ã¼ã¸ã®ãã©ã¼ããããå®ç¾©ãã¦ãã¾ãï¼ã¹ãã¼ãã¯ã«ã¼ãã«ããªã¼ã®Documentation/netlink/specsãã£ã¬ã¯ããªä»¥ä¸ã«å«ã¾ãã¦ãã¾ãï¼ãã®ã¹ãã¼ãããåè¨èªã®ã³ã¼ããçæãããã¨ã§ï¼ã¨ã³ã³ã¼ãã»ãã³ã¼ããç¡æã§æã«å
¥ãããï¼ã«ã¼ãã«ã®ã¢ãããã¼ãã«è¿½å¾ããã®ãç°¡åã«ãªãã¨ãããããã¿ã§ãï¼Rubyã®ã³ã¼ããçæããynl gemãä½ãã¾ããï¼nlã¨åãGitHubãªãã¸ããªã«ç½®ãã¦ãã¾ãï¼ï¼
YNLã¯å§ã¾ã£ãã°ããã®ããã¸ã§ã¯ãã§ï¼ã¾ã å ¨ã¦ã®ãµãã·ã¹ãã ãç¶²ç¾ ãã¦ããããã§ã¯ãªãã§ããï¼conntrackãµãã·ã¹ãã ã®ã¡ãã»ã¼ã¸ã¹ãã¼ããã¡ããã©ãã¾éçºä¸ã®Linux 6.15ã§è¿½å ããã¦ï¼conntrack_exporterãä½ãã®ã«å©ç¨ã§ãã¾ããï¼YNLèªä½ã¯ãããããµãã·ã¹ãã ãã«ãã¼ããããã«çµæ§è¤éã«ãªã£ã¦ãã¦ï¼ynl gemã§ã¯ã¾ã å ¨ã¦ã®æ©è½ã¯å®è£ ã§ãã¦ãã¾ããï¼ããã¯ãããããã£ã¦ãããã¨æãã¾ãï¼
ã¨ããã§ï¼nlã®Netlinkã¡ãã»ã¼ã¸ããã³ã¼ãã»ã¨ã³ã³ã¼ãããé¨åãIO::Bufferããã¼ã¹ã«æ¸ãã¾ããï¼packï¼unpackã®ãã©ã¼ãããæååãè¦ãããã¨ããéæ¾ãããã®ãIO::Bufferã®å©ç¹ã§ãï¼
æ¥å¹´ã«åãã¦
å¹´å§ã®æ±äº¬Rubyä¼è°12ã§ã¯DNSã®è©±ããããã®ã®ï¼ãã®å¾IPv6-mostlyã®å®è£ ã«ãã¾ãã¦ãã¦ï¼ä»å¹´ã®DNSãªã¾ã«ãã«ã¯å°ããªæ¹åããçãè¾¼ãã¾ããã§ããï¼DNS-over-QUIC (RFC 9250)ãåãããã«ãªã£ã¦ãããã¨ãï¼RESINFO (RFC 9606)ãè¿ãããã«ãªã£ã¦ãããã¨ã«æ°ã¥ãã人ã¯ããã§ããããï¼IPv6-mostlyãå°å ¥ããã«ããã£ã¦ï¼DNSãªã¾ã«ããIPv6ã«å¯¾å¿ãã¾ããï¼ãããå®ã¯Xlatã®NAT64ã使ã£ã¦ãã¦ï¼ã¯ã©ã¤ã¢ã³ãããIPv6ã§éããã¦ããã¯ã¨ãªãXlatã§ç¿»è¨³ãã¦IPv4ã®DNSãªã¾ã«ãã«æµãã¦ãã¾ããï¼æ¥å¹´ããã¯DNSé¢é£ã§ãªã«ãã³ã¼ããæ¸ãããããªãã¨ãããããã¨æã£ã¦ãã¾ãï¼ãã£ã¨ãï¼ç§ã«ã¯Kaigi on Railsã®Wi-Fiããããããããªãã¨ãã話ãããã®ã§ï¼IPv6-mostlyã®æ¤è¨¼ãã¾ã ããããããã£ã¦ããã®ã ã¨æãã¾ããï¼
é¢é£è¨äº
BAKUCHIKU BANBAN #1ã§ï¼id:sorahãKaigi Wi-Fiã®è¿æ³ã話ãã¦ããã¾ããï¼
*1:TruffleRubyã®ãããªä»ã®Rubyå¦çç³»ã§ã¯ï¼ãã®ãããªæååæä½ã«ãã¤ãåã®ã³ãã¼ãå¿ è¦ãªãããã«æé©åããã¦ãããã®ãããã¾ã
*2:ãã¤ã³ãã£ã³ã°ãæ¸ãã®ã楽ãããã¦ãã¤ã³ãã£ã³ã°ãæ¸ãã¦ããããã¤ã³ãã£ã³ã°ãæ¸ãããã®ãã¤ã³ãã£ã³ã°ãçãã¾ãã