ããã«èªã䟡å€ããããã©ãããè©äŸ¡ã§ããå°ããªç®æ¬¡ïŒ
- ãããã·ãµãŒããŒã¯ã©ã®ããã«æ©èœããŸããïŒ åé¡ã®å£°æã
- ã¯ã©ã€ã¢ã³ã-ãã³ããããã³ã°ãœã±ããã䜿çšãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã
- Netfilterã©ã€ãã©ãªã䜿çšããŠã«ãŒãã«ã¢ãžã¥ãŒã«ãäœæããŸãã
- ãŠãŒã¶ãŒç©ºéããã®ã«ãŒãã«ã¢ãžã¥ãŒã«ãšã®çžäºäœçšïŒNetlinkïŒ
PS HTTPããã³HTTPSã®ééãããã·ãµãŒããŒã確èªãããå Žåã¯ãééããŒã3128ã®Squidãªã©ã®HTTPã®ééãããã·ãµãŒããŒãæ§æãã Shifter sourcesã§ã¢ãŒã«ã€ããããŠã³ããŒãããŸã ã ã³ã³ãã€ã«ïŒmakeïŒããã³ã³ãã€ã«ãæåããããã/ Startãã«ãŒããšããŠå®è¡ããŸãã å¿ èŠã«å¿ããŠãã³ã³ãã€ã«ã®åã«shifter.hã®èšå®ã調æŽã§ããŸãã
åé¡ã®å£°æ
ITã®åéã®ãã¹ãŠã®åå¿è ãšåæ§ã«ãã³ã¢ã«ã€ããŠå°ãæãäžããããšæããŸããã ããã§ã¯ãå®éšçšã®é åãåç¬ã§è¡šç€ºãããŸããã GoogleãèŠããšãHTTPã®ééãããã·ãµãŒããŒã«èª°ãåé¡ããªãå ŽåãHTTPSã®å ŽåãHTTPSãããã³ã«ã®ééãããã·ããªããšç¢ºä¿¡ãã人ãããããšã«æ°ä»ãã§ãããã ãããŠåœŒã¯æ±ºããŠãããªããªãã§ãããã ãã®ãã¹ãŠããã®èšäºã®å€èŠ³ã«åœ¹ç«ã¡ãŸããã
ãŸããå¿ èŠãªãããã·ãµãŒããŒã®ããã€ãã®åŽé¢ãæ€èšããŸãã ãã©ãŠã¶ãHTTPãµãŒããŒã«çŽæ¥ã¢ã¯ã»ã¹ãããšã次ã®å žåçãªãªã¯ãšã¹ããäœæãããŸãã
GET / HTTP/1.1 Host: www.google.ru âŠ
ãã©ãŠã¶ãŒèšå®ã§ãããã·ãµãŒããŒãæå®ãããšããã©ãŠã¶ãŒã¯ãããã·ãµãŒããŒãžã®æ¥ç¶ãéå§ããå®å šãªã¢ãã¬ã¹ã䜿çšããŠãªã¯ãšã¹ããéä¿¡ããŸãã
GET http://www.google.ru/ HTTP/1.1 Host: www.google.ru âŠ
æåã®å Žåã®ããã«ããããã·ãµãŒããŒãäžå®å šãªã¢ãã¬ã¹ãæã€ãªã¯ãšã¹ããåä¿¡ããå Žåããã®ãªã¯ãšã¹ãã®å®å ãããããªãå Žåãããããšã©ãŒãè¿ããŸãã
HTTPSã«ã€ããŠå°ã説æããŸãã ãã©ãŠã¶ã¯tcpæ¥ç¶ã確ç«ããSSLãããã³ã«ã䜿çšããŠïŒèšŒææžã亀æããæå·åãããHTTPãã©ãã£ãã¯ãéä¿¡ããŸãã SSLãããã³ã«ã¯ãéä¿¡ãããããŒã¿ãéäžã§èªã¿åãããšãã§ããªãããã«ããããšãç®çãšããŠããããããããã·ãµãŒããŒã¯ãHTTPã®å Žåã®ããã«ã誰ãšæ¥ç¶ã確ç«ããããå€æã§ããŸããã ãããã·ãµãŒããŒãä»ããŠHTTPSçµç±ã§ããŒã¿ãéä¿¡ããã«ã¯ããã©ãŠã¶ãŒã¯HTTP CONNECTã¡ãœããã䜿çšããŠæ¥ç¶ãããããã·ãµãŒããŒã«éç¥ããå¿ èŠããããŸãã
CONNECT mail.google.com:443 HTTP/1.1 Host: mail.google.com âŠ
æ¥ç¶ãæ£åžžã«ç¢ºç«ãããããšããããã·ãµãŒããŒãå¿çããå¿ èŠããããã®ïŒ
HTTP/1.0 200 Connection established
ãã®çµæããã©ãŠã¶ãŒã¯ãããã·ãµãŒããŒãä»ããŠçŽæ¥tcpæ¥ç¶ãåä¿¡ããŸãããã®ãµãŒããŒã§ã¯ããã¹ãŠã®ããŒã¿ãå®å šã«è»¢éã§ããŸãã ãŸãããããã·ãµãŒããŒã¯ããã©ãŠã¶ã§ç¢ºç«ãããtcpæ¥ç¶ãããCONNECTã¡ãœããã§æå®ããããã¹ãã§ç¢ºç«ãããtcpæ¥ç¶ãžã®æ£ç¢ºãªããŒã¿è»¢éãããã³ããã«å¿ããé転éã®ã¿ãåŠçããŸãã
éæãªãããã·ã䜿çšãããå Žåãã€ãŸã ãã©ãŠã¶ãŒããããã·ãµãŒããŒã®ååšãçããªãå Žåããã©ãŠã¶ãŒã¯ãã®ããŒã¿ãããã»ã©çŸããæºåããŸããã ãããŠããããã·ãµãŒããŒã¯ããã«ã€ããŠèããå¿ èŠããããŸãã
HTTPã®ééãããã·ãå³åŒçã«èŠãŠã¿ãŸãããã

ãã¡ãããããŒã3128ã§ãã±ãããåä¿¡ãããããã·ãGoogleã«ãã以äžè»¢éãããGoogleãšã®æ°ããæ¥ç¶ãäœæãããªã©ãäžæ£ç¢ºãªç¹ããããŸãããäžè¬çã«ãçžäºäœçšã¹ããŒã ã¯ã»ãŒæ¬¡ã®ãšããã§ãã ãã®å³ã¯ãNATãæå³ãããŠããªããããã·ãµãŒããŒã«ãã±ããã®è»¢éãéå§ããããšã瀺ããŠãããNATã¯èª°ã«åãããã«éä¿¡ããããç¥ãå¿ èŠããããŸãã HTTPãã©ãã£ãã¯ã®å Žåãäžéšã®ãããã·ã¯HTTPãªã¯ãšã¹ãããããŒã®HOSTãã£ãŒã«ãããã®æ å ±ãäžæ£ã«äœ¿çšãå§ããä»æ§ã«éåããŸãã ãã¡ãããã»ãšãã©ã®å ŽåãHOSTã«ã¯èŠæ±ã®å®å ãšãªããã¹ãåãæ£ç¢ºã«å«ãŸããŠããŸãããäžè¬çãªå ŽåãHOSTã«ã¯äœã§ãå«ããããšãã§ããŸãã HTTPSã®å Žåããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ãŸã£ããé©ããŠããŸããã ãã±ããã®å®å ãç¹å®ããããã«ããããã·ãµãŒããŒãNATã調ã¹ãŠããŒã¿ã®å®å ã確èªããåé¡ããªããœãªã¥ãŒã·ã§ã³ãããã«çºçããŸãã ãããå®éã«è¡ãããšã§ãã
æ®å¿µãªãããiptablesã¯iptablesèªäœã§ã¯æçšã§ã¯ãããŸããããããã§ãããã®æäœã®åºæ¬ååã¯ååã«ç解ãããŠããŸãã æŠç¥çã«ã¯ã次ã®ããã«ãªããŸãã

æå³ããç®çã®ããã«ã¯ãå°ããªã«ãŒãã«ã¢ãžã¥ãŒã«ïŒModule ShifterïŒãèšè¿°ãããŠãŒã¶ãŒç©ºéã«å°ããªãœãããŠã§ã¢ã¬ã€ã€ãŒïŒShifterïŒãå®è£ ããŠãã¢ãžã¥ãŒã«ãšå¯Ÿè©±ãããããã·ãµãŒããŒã®ããŒã¿ãæºåããŸãã
ã¯ã©ã€ã¢ã³ã-ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ïŒã·ãã¿ãŒïŒ
ShifterãšåŒã°ããå°ããªã¯ã©ã€ã¢ã³ããµãŒããŒã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã ã·ãã¿ãŒã¯ãã®ããŒãã§ãã³ã°ãã誰ãã圌ãšã®tcpæ¥ç¶ã確ç«ãããšããããã·ãµãŒããŒãšã®tcpæ¥ç¶ãäœæããCONNECTïŒHTTPïŒã¡ãœãããéä¿¡ããŸãããã®åŸã圌ã¯ããã2ã€ã®æ¥ç¶éã®æ£ç¢ºãªããŒã¿è»¢éã®ã¿ãåŠçããŸãã ã¯ã©ã€ã¢ã³ããŸãã¯ãããã·ããããšã®æ¥ç¶ãéãããšããã®ãœã±ããã®ãã¢ãéããããŸãã
CONNECTã¡ãœãããéä¿¡ããã«ã¯ãã¯ã©ã€ã¢ã³ããå®éã«æ¥ç¶ã確ç«ããããªã¢ãŒããã¹ãã®IPã¢ãã¬ã¹ãå¿ èŠã§ãã ãã®æ å ±ãååŸããããã«ãShifterã¯Netlinkã©ã€ãã©ãªã䜿çšããŠModule Shifterã«é£çµ¡ããŸãã ããã«ã€ããŠã¯ããã®èšäºã®æåŸã®éšåã§èª¬æããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã·ãµãŒããŒã«ã€ããŠäœãç¥ããªãã¯ã©ã€ã¢ã³ãããããŒã¿ïŒHTTPSïŒãåä¿¡ããããã«ãããã·ãµãŒããŒãæºåããŸãã ãœã±ããã«ã€ããŠè©³çŽ°ã«èšè¿°ãããŠãããªãœãŒã¹ã¯å€æ°ãããããããã§ã¯ã詳现ãªã³ã¡ã³ãä»ãã®ShifterãœãŒã¹ã³ãŒãã®äžéšãžã®ãªã³ã¯ã®ã¿ãæäŸããŸã ã
ã«ãŒãã«ã¢ãžã¥ãŒã«ã·ãã¿ãŒ
ã«ãŒãã«ã¢ãžã¥ãŒã«ãšã¯äœãã調ã¹ãã«ã¯ãããšãã°ã Linuxã§ã®ã«ãŒãã«ã¢ãžã¥ãŒã«ã®æäœãèªãã§ãã ããã ã¢ãžã¥ãŒã«ã®äœæãå§ããŸãããã æåã«ãã¢ãžã¥ãŒã«ãã«ãŒãã«ã«ããŒãããããšãã«äžåºŠçºçããã¢ãžã¥ãŒã«ã®åæåãå®è¡ããå¿ èŠããããŸãã ãŸããã¢ãžã¥ãŒã«ãã«ãŒãã«ããã¢ã³ããŒãããããšãã«éå»ã®ååšã®äžèŠãªãã¬ãŒã¹ãæ®ããªãããã«ãã¢ãžã¥ãŒã«ã®æ£ããã·ã£ããããŠã³ãå®è¡ããå¿ èŠããããŸãã ãããã®ç®çã®ããã«ãã©ã€ãã©ãª<linux / module.h>ïŒ<linux / init.h>ã«ã¯2ã€ã®ãã¯ãmodule_initããã³module_exitãããããã®ç®çã®é¢æ°åããã©ã¡ãŒã¿ãŒãšããŠåãåããŸãã ãŸããååãæ°žç¶åããããã®ãã¯ãMODULE_AUTHOR ã MODULE_DESCRIPTION ã MODULE_LICENSEããããŸã:)ã©ã€ãã©ãª<linux \ kernel.h>ïŒ<linux \ printk.h>ã«ã¯éåžžã«äŸ¿å©ãªåºåé¢æ°int printkïŒconst char * fmtã...ïŒããããŸã ã éåžžã®printfïŒ..ïŒãšå€§å·®ãããŸããã ã¢ãžã¥ãŒã«ã¯ã«ãŒãã«å ã«ãããã³ã³ãœãŒã«ã§ã¯èµ·åãããªããããã¡ãã»ãŒãžã¯ãã°ã«è¡šç€ºãããŸãïŒ dmesgã³ãã³ãã䜿çšããŠè¡šç€ºã§ããŸãïŒã ããŸããŸãªã¿ã€ãã®ã¡ãã»ãŒãžã衚瀺ã§ããŸãã
#define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT "<1>" /* action must be taken immediately */ #define KERN_CRIT "<2>" /* critical conditions */ #define KERN_ERR "<3>" /* error conditions */ #define KERN_WARNING "<4>" /* warning conditions */ #define KERN_NOTICE "<5>" /* normal but significant condition */ #define KERN_INFO "<6>" /* informational */ #define KERN_DEBUG "<7>" /* debug-level messages */ #define KERN_DEFAULT "<d>" /* Use the default kernel loglevel */
ããã§ãæåã®ã¢ãžã¥ãŒã«ã®ã¹ã±ã«ãã³ãäœæããããã®ãã¹ãŠã®æ å ±ãåŸãããŸããã
#include <linux/module.h> #include <linux/kernel.h> MODULE_AUTHOR("Denis Dolgikh <sindo@sibmail.com>"); MODULE_DESCRIPTION("Module for the demonstration"); MODULE_LICENSE("GPL"); int Init(void) { printk(KERN_INFO "Init my module\n"); printk("Hello, World!\n"); return 0; } void Exit(void) { printk(KERN_INFO "Exit my module\n"); } module_init(Init); module_exit(Exit);
ãã¹ãŠãã³ã³ãã€ã«ããŠå®è¡ããæ¹æ³ã«ã€ããŠããå°ã説æããŸãã Ubuntu 11.10ïŒx86ïŒKernel 3.0ãã€ã³ã¹ããŒã«ãããšããã«èšããŸãã
ã·ã¹ãã ã«ã¯ããã£ã¬ã¯ããª/ lib / modules / [ã«ãŒãã«ããŒãžã§ã³] /ãããã察å¿ããã«ãŒãã«ããŒãžã§ã³ã®ã¢ãžã¥ãŒã«ãå«ãŸããŠããŸãã ãã«ãããããŸã-ããã¯ã / usr / src / linux-headers- [ã«ãŒãã«ããŒãžã§ã³] /ãã£ã¬ã¯ããªã«ããã«ãŒãã«ã©ã€ãã©ãªã®ããããŒïŒã«ãŒãã«ããããŒïŒãžã®ã·ã³ããªãã¯ãªã³ã¯ã§ãã ã«ãŒãã«ããããŒããŸã ãªãå Žåã¯ãããŠã³ããŒãããå¿ èŠããããŸãïŒ sudo apt-get install linux-headers- [ã«ãŒãã«ããŒãžã§ã³] ïŒã çŸåšäœæ¥ããŠããã«ãŒãã«ã®ããŒãžã§ã³ã確èªããã«ã¯ã uname ârã³ãã³ããå®è¡ããŸãã çŸåšã®ã«ãŒãã«ã®ããŒãžã§ã³ãšã¯ç°ãªãããŒãžã§ã³ã®ã©ã€ãã©ãªã䜿çšããå Žåããã®ãããªã³ã³ãã€ã«ãããã¢ãžã¥ãŒã«ã¯æ£åžžã«åäœããããããããèµ·åããªãå¯èœæ§ããããŸãã ããã¯ãã¹ãŠãã«ãŒãã«ã§ã©ã®ãããªå€æŽãçºçããããããã³ã¢ãžã¥ãŒã«ã§ã©ã®æ©èœã䜿çšãããã«ãã£ãŠç°ãªããŸãã
ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããã«ã¯ã MakefileãäœæããŸãã 2ã€ã®ç®æšãäœæããŸãããïŒ all ïŒã¢ãžã¥ãŒã«ã®æ§ç¯ïŒãšclean ïŒãããžã§ã¯ãã®æé€ïŒãããããæžãããã«ãæ¢ã«æžãããç®æšã䜿çšããŸã ïŒ modulesãškernel-headersã® Makefile㧠æé€ããŸã ã
# # module_test.o â , module_test. obj-m += module_test.o # Makefile kernel-headers -, # /lib/modules/[ ]/build # modules obj-m # M=$(PWD) , all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
ããã§ã makeã³ãã³ãã䜿çšããŠã¢ãžã¥ãŒã«ãç°¡åã«ã³ã³ãã€ã«ãã make cleanãããžã§ã¯ããã¯ãªãŒã³ã¢ããã§ããŸãã ãã®çµæãå®æããã¢ãžã¥ãŒã«module_test.koãååŸããŸããããã¯ã insmod ./module_test.koã³ãã³ãã䜿çšããŠã«ãŒãã«ã«ããã«ããŒãã§ããŸãã modprobe module_testã³ãã³ãã䜿çšããŠãã«ãŒãã«ã«ã¢ãžã¥ãŒã«ãããŒãããå¥ã®ãªãã·ã§ã³ããããŸãã ãããè¡ãã«ã¯ãã¢ãžã¥ãŒã«module_test.koã¢ãžã¥ãŒã«ã/ lib / modules / [ã«ãŒãã«ã®çŸåšã®ããŒãžã§ã³] / [ä»»æã®ãã£ã¬ã¯ããª] /ãã£ã¬ã¯ããªã« 眮ã ãå¿ããã«depmodãå®è¡ããŸã ã ãã®ã³ãã³ãã¯ã / lib / modules /ã«ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã®ãªã¹ããäœæããŸã ã ã¢ãžã¥ãŒã«ã«äŸåé¢ä¿ããªãå Žåã§ãã modprobeã¯depmodãªãã§ã¯è¿œå ãããã¢ãžã¥ãŒã«ãèªèããŸããã insmodãšmodprobeã®äž»ãªéãã¯æ¬¡ã®ãšããã§ããã¢ãžã¥ãŒã«ãããŒããããšã modprobeã¯äŸåãããã¹ãŠã®ã¢ãžã¥ãŒã«ãèªåçã«ããŒãããŸããã insmodã¯ä»»æã®ãã£ã¬ã¯ããªããã¢ãžã¥ãŒã«ãããŒãã§ããŸãã ã«ãŒãã«ããã¢ãžã¥ãŒã«ãåé€ããŸãïŒ rmmod module_test ã ã¢ãžã¥ãŒã«æ å ±ã®è¡šç€ºïŒ modinfo module_testãŸãã¯modinfo ./module_test.ko
Netfilterã©ã€ãã©ãª
ãããŠãHTTPSã®ãããã·ã«æ»ããŸãã ç§ãã¡ã®ã¿ã¹ã¯ã¯ãã¢ãžã¥ãŒã«ãDNATïŒiptablesïŒã«ãã£ãŠåŠçãããåã«ãããã¯ãŒã¯ãã±ãããã¹ãã£ã³ããããšã§ãã ãã®ããã«ã Netfilterã©ã€ãã©ãªã圹ç«ã¡ãŸãã ïŒãã詳现ãªç解ã®ããã«ãå°ãªããšãWikipediaã§ä»ã®ãœãŒã¹ã®Netfilterã«ã€ããŠããã«èªãããšããå§ãããŸãïŒã«ãŒãã«å ã®ãããã¯ãŒã¯ãã±ãããã¹ãã©ã®ããã«èŠããããèæ ®ããŠãã ããã

詳现ã¯ãã¡ããã芧ãã ãã ã
Netfilter <linux / netfilter.h>ã¯ã5ã€ã®ç°ãªãå Žæã§ãããã¯ãŒã¯ãã±ãããžã®ã¢ã¯ã»ã¹ãæäŸãã5ã€ã®ããã¯é¢æ°ãæäŸããŸãã
- NF_INET_PRE_ROUTING-é¢æ°ã¯ããã±ããããã§ã«åçŽãªãã§ãã¯ã«åæ Œããåã«ããã¹ãŠã®å
¥åãã±ãããå®å
šã«ãã£ããããŸãïŒãã±ããã¯å€±ãããŸãããIPãã§ãã¯ãµã ã¯OKãªã©ïŒã
ãã®åŸããã±ããã¯ã«ãŒãã£ã³ã°ãééãããã±ãããå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹çšã§ãããããŒã«ã«ããã»ã¹çšã§ãããã決å®ãããŸãã ã«ãŒãã£ã³ã°ã§ããªãå Žåãã«ãŒãã£ã³ã°ã¯ãã±ãããç Žæ£ã§ããŸãã - NF_INET_LOCAL_IN-ããã±ãŒãžãããŒã«ã«ããã»ã¹ã«æž¡ãå Žåãããã±ãŒãžãæž¡ãåã«åŒã³åºãããŸãã
- NF_INET_FORWARD-ãã±ãããããã€ã³ã¿ãŒãã§ãŒã¹ããå¥ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ã«ãŒãã£ã³ã°ããããšãã
- NF_INET_LOCAL_OUT-ããŒã«ã«ããã»ã¹ãäœæããããã±ãŒãžã®ãã©ããã
- NF_INET_POST_ROUTING-ãããã¯ãŒã¯ã«ãŒããã©ã€ããŒã«ãã±ãããéä¿¡ããåã®æçµãã€ã³ãã
ã«ãŒãã«ã¢ãžã¥ãŒã«ã¯ãããã5ã€ã®å Žæã®ããããã«ãã®æ©èœãç»é²ã§ããŸãã ç»é²ãããšããã¢ãžã¥ãŒã«ã¯ãã®å Žæã§ã®æ©èœã®åªå é äœã瀺ãå¿ èŠããããŸãã <linux / netfilter_ipv4.h>ã©ã€ãã©ãªã§ãããŸããŸãªæšæºã¿ã¹ã¯ã®åªå é äœã確èªã§ããŸãã
enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN, NF_IP_PRI_CONNTRACK_DEFRAG = -400, NF_IP_PRI_RAW = -300, NF_IP_PRI_SELINUX_FIRST = -225, NF_IP_PRI_CONNTRACK = -200, NF_IP_PRI_MANGLE = -150, NF_IP_PRI_NAT_DST = -100, NF_IP_PRI_FILTER = 0, NF_IP_PRI_SECURITY = 50, NF_IP_PRI_NAT_SRC = 100, NF_IP_PRI_SELINUX_LAST = 225, NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX, NF_IP_PRI_LAST = INT_MAX, };
ãªã¹ãããDNATã®åªå 床ã¯-100ã§ããããšãããããŸãããããã£ãŠã-100æªæºã®åªå 床ãç®çã«é©ããŠããŸãã é¢æ°ã®åªå 床ã-100ãã倧ããå Žåãå®å IPïŒå®å ïŒããã§ã«å€æŽããããã±ãããåä¿¡ããŸãã
5ã€ã®ãã€ã³ãã®ããããã§ç»é²ãããåé¢æ°ã¯ã転éããããã±ããã®ãããªãéåœã決å®ãã次ã®å€ã®ãããããè¿ãå¿ èŠããããŸãã
#define NF_DROP 0 /* discarded the packet */ #define NF_ACCEPT 1 /* the packet passes, continue iterations */ #define NF_STOLEN 2 /* gone away */ #define NF_QUEUE 3 /* inject the packet into a different queue (the target queue number is in the high 16 bits of the verdict) */ #define NF_REPEAT 4 /* iterate the same cycle once more */ #define NF_STOP 5 /* accept, but don't continue iterations */
ç§ã®ç¡æ翻蚳ã§ã¯ããã®ããã«èãããŸãïŒ
- NF_DROP-ãã®ããã±ãŒãžãåé€
- NF_ACCEPT-ãã±ããã¯ããã«é²ãã§ãç¹°ãè¿ããç¶ããŸã
- NF_STOLEN-ãã®ããã±ãŒãžãåé€ããŸãïŒã«ãŒãã«ã¯ãããåŠçããªããªããŸããã¢ãžã¥ãŒã«èªäœã¯ãã®ããã±ãŒãžã«å²ãåœãŠãããã¡ã¢ãªã解æŸããå¿ èŠããããŸãïŒ
- NF_QUEUE-ãã±ããããã¥ãŒã«å ¥ãã ïŒéåžžã¯ãŠãŒã¶ãŒç©ºéã§ãã±ãããåŠçããããïŒ
- NF_REPEAT-å埩ãç¹°ãè¿ããŸãïŒåãããã±ãŒãžã§é¢æ°ãå床åŒã³åºããŸãïŒ
- NF_STOP-ãã±ãããããã«ã¹ãããããŸãããå埩ãç¶è¡ããŸãã
ç§ãã¡ã¯çè«ãç解ããä»ã§ã¯ã¢ãžã¥ãŒã«ãæžãç¶ããŠããŸãã ã¢ãžã¥ãŒã«ãã«ãŒãã«ã«ããŒããããšããé¢æ°ãç»é²ããå¿ èŠããããŸãããããHook_FuncãšåŒã³ãŸããããããã¯ãã¹ãŠã®çä¿¡ãã±ããã調ã¹ãæåŸã«ãã®é¢æ°ãç»é²è§£é€ããå¿ èŠããããŸããããããªããšãã«ãŒãã«ã¯ååšããªãé¢æ°ãåŒã³åºãããšããŸãã
#include <linux/module.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> /* ip */ struct nf_hook_ops bundle; int Init(void) { printk(KERN_INFO "Start module Shifter\n"); /* hook */ /* , */ bundle.hook = Hook_Func; /* , hook */ bundle.owner = THIS_MODULE; /* */ bundle.pf = PF_INET; /* , */ bundle.hooknum = NF_INET_PRE_ROUTING; /* */ bundle.priority = NF_IP_PRI_FIRST; /* */ nf_register_hook(&bundle); return 0; } void Exit(void) { /* hook */ nf_unregister_hook(&bundle); printk(KERN_INFO "End module Shifter\n"); } module_init(Init); module_exit(Exit);
ããšã¯ã Hook_Funcé¢æ°èªäœãèšè¿°ããã ãã§ã ã 次ã®ãããã¿ã€ããå¿ èŠã§ãã
unsigned int Hook_Func(uint hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *) ) { /* firewall */ /* () :) */ return NF_DROP; }
ãã®ãã©ã¡ãŒã¿ãŒãèæ ®ããŠãã ããã
- uint hooknumã«ã¯ã次ã®å€ã®ãããããå«ãŸããŸãïŒ {NF_INET_PRE_ROUTING = 0ãNF_INET_LOCAL_IN = 1ãNF_INET_FORWARD = 2ãNF_INET_LOCAL_OUT = 3ãNF_INET_POST_ROUTING = 4} ã ãã®ãã©ã¡ãŒã¿ãŒã¯ãé¢æ°ã®åŒã³åºãå ãèŠã€ããããã«å¿ èŠã§ãããªããªãã åãæ©èœãè€æ°ã®å Žæã«ç»é²ã§ããŸãã
- struct sk_buff * skbããã±ãŒãžæ§é ãžã®ãã€ã³ã¿ãŒã
- å ¥åã€ã³ã¿ãŒãã§ãŒã¹ã«é¢ããæ å ±ã®const struct net_device * ã çºä¿¡ãã±ããã®å Žåããã©ã¡ãŒã¿ãŒã¯NULLã§ãã
- const struct net_device *åºåã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããæ å ±ã çä¿¡ãã±ããã®å Žåããã©ã¡ãŒã¿ãŒã¯NULLã§ãã
- intïŒ* okfnïŒïŒstruct sk_buff *ïŒã¯ããã¹ãŠã®å埩ãæ£ã®çããè¿ããšãã«ããã±ãŒãžãšãšãã«åŒã³åºãããã³ãŒã«ããã¯é¢æ°ã§ãã
ããã±ãŒãžstruct sk_buff * skbãžã®ãã€ã³ã¿ãŒã«ã€ããŠè©³ãã説æããŸãã
sk_buffã¯ãããã±ãŒãžãæäœããããã®ãããã¡ãŒã§ãã ãã±ãããå°çããããéä¿¡ããå¿ èŠããããšããã«ãsk_buffãäœæãããŸãããã±ãããé 眮ãããå Žæãããã³é¢é£æ å ±ãå Žæãå Žæãç®ç...ãã±ããã®ç§»åäžããããã¯ãŒã¯ã¹ã¿ãã¯ã§sk_buffã䜿çšãããŸãã ãã±ãããéä¿¡ãããããããŒã¿ããŠãŒã¶ãŒã«è»¢éããããšããã«ãæ§é ãç Žå£ãããã¡ã¢ãªã解æŸãããŸããsk_buffæ§é ã¯<linux / skbuff.h>ã§èª¬æãããŠããŸãããŸããå¿«é©ãªäœæ¥ã®ããã®ããŸããŸãªé¢æ°ã説æãããŠããŸãã
tcpã䜿çšããå Žåãããã«2ã€ã®æ§é äœã䜿çšã§ããŸãããããã¯struct iphdrãšstruct tcphdrã§ãã
ååã瀺ãããã«ããããã®æ§é ã¯IPããã㌠ããããã£ãŠTCPããããŒã§æ©èœããããã«èšèšãããŠããŸã ã 2ã€ã®é¢æ°ã䜿çšããŠããããã®æ§é äœãžã®ãã€ã³ã¿ãŒãskb_buffããååŸã§ããŸãã
static inline unsigned char *skb_network_header(const struct sk_buff *skb); static inline unsigned char *skb_transport_header(const struct sk_buff *skb);
ãã®æç¹ã§ãèªè ã«ã¢ããŒã«ããããšæããŸãã sk_buffæ§é äœã§transport_headerãã€ã³ã¿ãŒãèšå®ããå¿ èŠãããã®ã¯æ£ç¢ºã«ã¯æ確ã§ã¯ãããŸããã§ããã ãã€ã³ãNF_INET_PRE_ROUTINGããã³NF_INET_LOCAL_IN ïŒåªå 床ãæå®ïŒ ã§ã¯ ã skb_transport_headerã䜿çšããŠtcpããããŒã®æ§é ãååŸã§ããŸããã§ããããä»ã®ãã€ã³ãã§ã¯æ£åžžã«æ©èœããŸããã void skb_set_transport_headerïŒskbãoffsetïŒã䜿çšããŠã sk_buff->ããŒã¿ãã€ã³ã¿ãŒããtransport_headerã®ãªãã»ãããæåã§æå®ããå¿ èŠããããŸããã
åè¿°ã®sk_buff->ããŒã¿ãã€ã³ã¿ãŒã¯ãããã±ãŒãžã®å 容ãžã®ãã€ã³ã¿ãŒã§ãã ã€ãŒãµããããããã³ã«ã®åŸã®ã¡ã¢ãªé åãæããŸããããšãã°ãããã«IPããããŒæ§é ãæãããã®åŸã«TCPããããŒæ§é ãŸãã¯ç¬èªã®ãããã³ã«ãç¶ããŸãã
ããã±ãŒãžèªäœã®ããŒã¿ãžã®ãã€ã³ã¿ãŒã¯ã©ãã§ã䜿çšããããããããŸããŸãªãã£ãŒã«ããèªã¿åãã ãã§ãªããããããå€æŽããããšãã§ããŸãã ãã ããããšãã°éä¿¡è ãŸãã¯åä¿¡è ã®IPã¢ãã¬ã¹ãå€æŽããå ŽåãIPãã±ããããããŒã®ãã§ãã¯ãµã ãåèšç®ããå¿ èŠãããããšã«æ³šæããŠãã ããã
ãããã£ãŠãããŒã443ïŒHTTPSïŒã«è¡ããã¯ã©ã€ã¢ã³ããHTTPSãããã³ã«ã®TCPæ¥ç¶ã確ç«ããããšããSYNãã©ã°ãå«ãIP-TCPãã±ãããæ€åºããå Žåã«ã®ã¿ãé¢æ°ã¯å®å IPã¢ãã¬ã¹ãä¿åããŸãã ãŸããTFTPæ¥ç¶ãåæããããã®IPã¢ãã¬ã¹ãäžèŠã«ãªã£ãããšã瀺ãFINãŸãã¯RSTãã©ã°ãå«ããã±ããã衚瀺ããããåé€ããŸãã
#include <linux/skbuff.h> #include <linux/ip.h> #include <linux/tcp.h> #define uchar unsigned char #define ushort unsigned short #define uint unsigned int /* Hook_Func - , */ /* IP , : */ /* - tcp */ /* - 443 (HTTPS) */ /* - SYN ( tcp ) */ uint Hook_Func(uint hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *) ) { /* ip */ struct iphdr *ip; /* tcp */ struct tcphdr *tcp; /* IP */ if (skb->protocol == htons(ETH_P_IP)) { /* IP */ ip = (struct iphdr *)skb_network_header(skb); /* IP 4 TCP */ if (ip->version == 4 && ip->protocol == IPPROTO_TCP) { /* TCP */ /* ip->ihl - IP 32- */ skb_set_transport_header(skb, ip->ihl * 4); /* TCP */ tcp = (struct tcphdr *)skb_transport_header(skb); /* 443 (HTTPS) */ if (tcp->dest == htons(443)) { /* SYN, IP */ if (tcp->syn) AddTable((uint)ip->saddr, (ushort)tcp->source, (uint)ip->daddr); /* FIN RST, IP */ if (tcp->fin || tcp->rst) DelTable((uint)ip->saddr, (ushort)tcp->source, (uint)ip->daddr); } } } /* */ return NF_ACCEPT; }
AddTableãšDelTableã® 2ã€ã®é¢æ°ããããéä¿¡è ã®IPãšããŒãããšã«ãåä¿¡è ã®IPã¢ãã¬ã¹ãã¡ã¢ãªããä¿åããã³åé€ããå¿ èŠããããŸãã ããã¯ãShifterã¯ã©ã€ã¢ã³ããµãŒããŒãShifterã¢ãžã¥ãŒã«ãšéä¿¡ãã ReadTableé¢æ°ã䜿çšããŠãã¯ã©ã€ã¢ã³ãã®IPãšããŒãã«ãã£ãŠãã©ã®IPã¢ãã¬ã¹ã«å®éã«é£çµ¡ãããããèŠã€ããããã«å¿ èŠã§ãã IPãä¿åããããã®ããŒã¿åã«ã€ããŠã¯ããŸãèãããåºæ¬çãªããã·ã¥é¢æ°ã䜿çšããŠéåžžã®éçé åã䜿çšããŸããã ããã·ã¥é¢æ°ïŒ KeyHash ïŒã¯ãéä¿¡åŽããŒããšå ¥åã§ã®å ¥åãåãåããå®å IPã¢ãã¬ã¹ãæ ŒçŽãããŠããé åã®ã€ã³ããã¯ã¹ãè¿ããŸãã ã¯ã©ã€ã¢ã³ããnatã®èåŸã«ããã255.255.255.0ã®ãã¹ã¯ãæã€ãµãããããæã£ãŠããããšãèæ ®ããŠèšè¿°ãããŠãããããéä¿¡è ã®IPã®æåŸã®ãã€ãã®ã¿ã䜿çšãããã®ãã€ãã«ã¯2ã€ã®ããŒããã€ãã®3ããããéç³ãããŠããŸãã ãã®çµæãé åããµã€ãº0x1FFFFFïŒã8 MbïŒã«å§çž®ããããšãã§ããŸããã ãã¡ãããã«ãŒãã«ã«ããŒãããåŸããã®ã¢ãžã¥ãŒã«ãå°ãªããšã8 MBã®ã¡ã¢ãªãå æããããšãèæ ®ããå¿ èŠããããŸããããã¯ãäžéšã®çµã¿èŸŒã¿ã·ã¹ãã ã«ãšã£ãŠã¯å€§ããããå¯èœæ§ããããŸãã ãããŠãè¡çªãå¿ããªãã§ãã ãã:)ããããç§ã®ãã¢ã§ã¯ãããã¯ãã¹ãŠåçŽãã§å ±ãã ãããã«ã DelTableã¯äžè¬ã«ç©ºã§ãã
/* IP */ #define MaxTable 0x1FFFFF uint Table[MaxTable]; /* KeyHash - */ /* IP */ uint KeyHash(uint src_IP, ushort src_Port) { return (uint)(((src_IP & 0xFF000000) >> 11) ^ (uint)src_Port) % MaxTable; } /* AddTable - IP */ /* IP */ void AddTable(uint src_IP, ushort src_Port, uint dst_IP) { Table[KeyHash(src_IP, src_Port)] = dst_IP; } void DelTable(uint src_IP, ushort src_Port, uint dst_IP) { /* IP */ /* */ } /* ReadTable - IP */ /* IP */ uint ReadTable(uint src_IP, ushort src_Port) { return Table[KeyHash(src_IP, src_Port)]; }
ããã§ãèšäºã®ãã®é·ãéšåã¯çµäºããShifterã¯ã©ã€ã¢ã³ããµãŒããŒãšShifterã«ãŒãã«ã¢ãžã¥ãŒã«ãæ¥ç¶ããããã ãã«æ®ããŸãã
ãŠãŒã¶ãŒç©ºéããã®ã«ãŒãã«ã¢ãžã¥ãŒã«ãšã®çžäºäœçšïŒNetlinkïŒ
ããã§ã®ç®æšã¯ãShifterããã³Shifterã¢ãžã¥ãŒã«ã«1ã€ã®ãœã±ãããäœæããããããæ¥ç¶ããããšã§ããã¢ãžã¥ãŒã«ãšShifterãµãŒããŒéã®äº€æãããã³ã«ã¯ç°¡åã§ããã·ãã¿ãŒã¯4ãã€ãã®ã¯ã©ã€ã¢ã³ãIPãš2ãã€ãã®ã¯ã©ã€ã¢ã³ãããŒããéä¿¡ããã¢ãžã¥ãŒã«ã¯ããŒãã«ããååŸãã4ãã€ãã®IPå®å ã§å¿çããŸãããããè¡ãã«ã¯ãNetlinkã©ã€ãã©ãªã䜿çšããŸãã
ç§ã¯æ³šæããããšããèŠåºãã¯<linux / netlink.h>ã«ã¹ã¿ã ã¢ããªã±ãŒã·ã§ã³ã®ããã® /usr/include/linux/netlink.h ãšã«ãŒãã«ã¢ãžã¥ãŒã« ã¯/ usr / src / linuxã«ãããããªã© [ ã«ãŒãã«ããŒãžã§ã³] / / linuxã«/ããããªã³ã¯ãå«ãŸããŠããŸãã hã« ã¯å€ãã®éãããããŸãã
ãŠãŒã¶ãŒç©ºéã®ããããªã³ã¯
ããããªã³ã¯ã«ã€ããŠã¯ããããã¯ãŒã¯ã®ãŠãŒã¶ãŒç©ºéåŽã«å€ãã®æ å ±ããããŸãïŒããšãã°ã
RFC 3549-IPãµãŒãã¹ã®ãããã³ã«ãšããŠã®Linux NetlinkïŒ
ã ããŒã1
netlinkã䜿çšããLinuxãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ç°¡åãªã¢ãã¿ãŒ
ãããã£ãŠãããã§ã¯ãã«ãŒãã«ã¢ãžã¥ãŒã«ãšãŠãŒã¶ãŒç©ºéããã°ã©ã éã®æ å ±äº€æãä¿èšŒããããã«å¿ èŠãªãã®ã«ã€ããŠã®ã¿èª¬æããŸãã
Netlinkãœã±ããã¯ãéåžžã®é¢æ°int socketïŒPF_NETLINKãsocket_typeãnetlink_familyïŒ ã«ãã£ãŠäœæãããŸãã
ã©ããšsocket_typeã«ã¯ããšããŠäœ¿çšããããšãã§ãSOCK_RAWãšSOCK_DGRAMãããã«ãããããããnetlinkãããã³ã«ã¯ããŒã¿ã°ã©ã ãšrawãœã±ãããåºå¥ããŸããããŸããnetlink_familyã¯ãéä¿¡çšã®ã«ãŒãã«ã¢ãžã¥ãŒã«ãŸãã¯ããããªã³ã¯ã°ã«ãŒããéžæããŸãã<linux / netlink.h> ã次ã®ããšãã§ãã家æã®å®å šãªãªã¹ãã衚瀺ããŸãã
Netlinkã¡ãã»ãŒãžã¯ã1ã€ä»¥äžã®nlmsghdrïŒnetlinkã¡ãã»ãŒãžããããŒïŒããããŒãæã€ãã€ãã®ã¹ããªãŒã ã§ãããã€ãã¹ããªãŒã ã«ã¢ã¯ã»ã¹ããã«ã¯ãNLMSG_ *ãã¯ãã®ã¿ã䜿çšããŸãããŸããnetlinkãããã³ã«ã¯ä¿èšŒãããã¡ãã»ãŒãžé ä¿¡ãæäŸããªãããšã«æ³šæããŠãã ãããååãªã¡ã¢ãªããªãããä»ã®ãšã©ãŒãçºçããå Žåããããã³ã«ã¯ãã±ãããããããããå¯èœæ§ããããŸãã
èããŠã¿ãŸãããsockaddr_nlæ§é ãã®nlmsghdrïŒ<linuxã®/ netlink.h> ïŒãIOVECãšã®msghdrïŒã¯<sys / socket.h>ã«ïŒãåäœããŸãïŒ

æ§é äœsockaddr_nlã -ãŠãŒã¶ãŒããã°ã©ã ãšã«ãŒãã«ã¢ãžã¥ãŒã«ã®ããã®ããããªã³ã¯ã¢ãã¬ã¹ãèšè¿°ããŸãããã®æ§é ã¯ãããŒã¿ã®éä¿¡è ãŸãã¯åä¿¡è ãèšè¿°ããããã«äœ¿çšãããŸãã
struct sockaddr_nl { sa_family_t nl_family; /* AF_NETLINK */ unsigned short nl_pad; /* */ __u32 nl_pid; /* 0, , */ __u32 nl_groups; /* netlink 32 multicast-. nl_groups , , */ };
struct nlmsghdrã¯ããããªã³ã¯ã¡ãã»ãŒãžããããŒã§ãããéåä¿¡ãããããŒã¿ã¯æ§é äœã®çŽåŸã®ã¡ã¢ãªã«ãããŸããNLMSG_DATAïŒstruct nlmsghdr *ïŒãã¯ãã䜿çšããŠã¢ã¯ã»ã¹ããŸãã
struct nlmsghdr { __u32 nlmsg_len; /* */ __u16 nlmsg_type; /* () */ __u16 nlmsg_flags; /* */ __u32 nlmsg_seq; /* ( ) */ __u32 nlmsg_pid; /* (PID), */ };
struct iovec - msghdrã«ãããnlmsghdræ§é äœãžã®ãã€ã³ã¿ãå«ã¿ãŸãã
struct iovec { void * iov_base; /* ( nlmsghdr) */ size_t iov_len; /* () */ };
struct msghdr-ã¢ãã¬ã¹ïŒsockaddr_nlïŒããã³ããŒã¿ïŒiovecïŒãžã®ãã€ã³ã¿ãŒãå«ã
struct msghdr { void * msg_name; /* */ socklen_t msg_namelen; /* */ struct iovec * msg_iov; /* */ size_t msg_iovlen; /* */ void * msg_control; /* */ size_t msg_controllen; /* */ int msg_flags; /* */ };
ããã€ãã®Netlinkãã¯ããæ€èšããŠãã ããã
int NLMSG_ALIGN(size_t len);
ããããªã³ã¯ã¡ãã»ãŒãžãµã€ãºãæãè¿ãå¢çæŽåå€ã«äžžããŸãã
int NLMSG_LENGTH(size_t len);
ããŒã¿ãã£ãŒã«ãã®ãµã€ãºããã©ã¡ãŒã¿ãŒãšããŠååŸããnlmsghdrããããŒã®nlmsg_lenãã£ãŒã«ãã«æžã蟌ãããã®å¢çæŽåãµã€ãºå€ãè¿ããŸãã
int NLMSG_SPACE(size_t len);
nlmsghdræ§é äœãå æããã¡ã¢ãªã®ãµã€ãºïŒãã€ãåäœïŒãšãnetlinkãã±ããã®æå®ãããlené·ã®ããŒã¿ïŒãã€ãåäœïŒãè¿ããŸãã
void *NLMSG_DATA(struct nlmsghdr *nlh);
æž¡ãããnlmsghdrããããŒã«é¢é£ä»ããããããŒã¿ãžã®ãã€ã³ã¿ãŒãè¿ããŸãã
struct nlmsghdr *NLMSG_NEXT(struct nlmsghdr *nlh, int len);
å€ãã®éšåã§æ§æãããã¡ãã»ãŒãžã®æ¬¡ã®éšåãè¿ããŸãããã®ãã¯ãã¯ããã«ãããŒãã¡ãã»ãŒãžã§æ¬¡ã®nlmsghdrããããŒãåãå
¥ããŸããåŒã³åºãåŽã¢ããªã±ãŒã·ã§ã³ã¯ãçŸåšã®nlmsghdrããããŒã®NLMSG_DONEãã©ã°ã確èªããå¿
èŠããããŸããã¡ãã»ãŒãžãåŠçããããšãã«ãé¢æ°ã¯NULLãè¿ããŸããã2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ãã¡ãã»ãŒãžãããã¡ãŒã®æ®ãã®éšåã®ãµã€ãºãèšå®ããŸãããã¯ãã¯ãã¡ãã»ãŒãžããããŒã®ãµã€ãºã ããã®å€ãæžãããŸãã
int NLMSG_OK(struct nlmsghdr *nlh, int len);
ã¡ãã»ãŒãžãåãæšãŠãããŠãããããã®éã¢ã»ã³ããªãæåããå ŽåãTRUEïŒ1ïŒãè¿ããŸãã
int NLMSG_PAYLOAD(struct nlmsghdr *nlh, int len);
nlmsghdrããããŒã«é¢é£ä»ããããŠããããŒã¿ã®ãµã€ãºãè¿ããŸãã
NetlinkãåããShifterãµãŒããŒã®ãœãŒã¹ã³ãŒãã®äžéšã
Netlinkã«ãŒãã«ã¹ããŒã¹
ã«ãŒãã«ã¢ãžã¥ãŒã«ã§netlinkã©ã€ãã©ãªã䜿çšããå Žåãããã€ãã®éãããããŸããããšãã°ã<linux / netlink.h>ã®nlmsghdræ§é ã¯åããŸãŸã§ããããã§ã«ããªãã¿ã®sk_buffæ§é ã«ã©ãããããŠããŸãããŸãããœã±ãããæäœããããã®éåžžã®é¢æ°ã®ä»£ããã«ãæ°ããé¢æ°ã»ããã䜿çšããŸãããããã®ããã€ããèããŠã¿ãŸãããã
ã¢ãžã¥ãŒã«ã§ã¯ããœã±ããã¯intåã§ã¯ãªãã<net / sock.h>ã®sockæ§é ã«ãã£ãŠè¡šãããŸããstruct sock-éåžžã«å€§ããã®ã§ã説æã¯å¿ èŠãããŸãããã説æã¯ããŸããã
netlinkãœã±ãããäœæããããã«ã<linux / netlink.h>ã«ã¯netlink_kernel_createé¢æ°ããããŸããnetlinkãœã±ãããäœæããã ãã§ãªããããŒã¿ãå°çãããã³ã«åŒã³åºãããé¢æ°ãç»é²ããŸãã
struct sock *netlink_kernel_create( struct net *net, int unit, unsigned int groups, void (*input)(struct sk_buff *skb), struct mutex *cb_mutex, struct module *module);
netlinkãœã±ãããéããŠãé¢æ°ç»é²ããåé€ããã«ã¯ã次ã䜿çšããŸãã
void netlink_kernel_release(struct sock *sk);
ãŸãã<net / netlink.h>ã®é¢æ°ãå¿ èŠã«ãªããŸããããã§ã¯ããã°ããã説æã®ããé¢æ°ãèŠã€ããããšãã§ããŸãã
å¿ èŠãªæ©èœã®äžéšã翻蚳ããŸãã
/** * nlmsg_new â netlink * @payload: * @flags: * * NLMSG_DEFAULT_SIZE, */ static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags) { return alloc_skb(nlmsg_total_size(payload), flags); } /** * nlmsg_put - NetLink skb * @skb: netlink * @pid: * @seq: * @type: * @payload: ( ) * @flags: * * NULL, skb , * netlink , * netlink */ static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int payload, int flags) /** * nlmsg_unicast â netlink * @sk: netlink * @skb: netlink * @pid: netlink */ static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 pid) /** * nlmsg_data â * @nlh: netlink */ static inline void *nlmsg_data(const struct nlmsghdr *nlh) { return (unsigned char *) nlh + NLMSG_HDRLEN; }
Module Shifterãè¿œå ããŸãã
ãããã«
çµè«ãšããŠããããã·ãµãŒããŒã«ãã±ããããªãã€ã¬ã¯ãããã«ã¯ãã²ãŒããŠã§ã€ã®iptablesã«ã«ãŒã«ãè¿œå ããã ãã§ååã ãšæããŸãã
# nat (-A) PREROUTING # tcp 443 443 iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 443
ShifterãœãŒã¹ãå«ãã¢ãŒã«ã€ããããŠã³ããŒããã
çµããã
䜿çšãããæçšãªæç®
NetFilter.org
Linuxãã«ãŒãã«ããã¡ã€ã¢ãŠã©ãŒã«
ã«ãŒãã«ã³ãŒããŒ-Netlink Socket
RFC 3549 ã䜿çšããçç±ãšæ¹æ³-IPãµãŒãã¹ã®ãããã³ã«ãšããŠã®Linux Netlink ã¯Linuxäžã®NetLinkãšé£æºã
ãŸãã ããŒã1
Linux netlinkãããã³ã«