1é±éã»ã©åã®ä¸è¨blogè¨äºãæ°ã«ãªã£ããããå°ã調ã¹ã¦ã¿ããä¼¼ããããªäºä¾ã«å¼ã£ããã£ã人ã¯ãããªãã«ããããã ã
調ã¹ã¦ã¿ã¦ã®ææ³ã¯ï¼
- ããªãã§ããã©ã«ããinsecureãããï¼ãã¨ããå©ç¨è ã®å¿ã®å«ã³ã¯çã£å½ã ãã©ãã§ããããDockerã®éçºè ã®ç«å ´ããããã°ããããã¦å·¥è¤ãããã¼ãªãããããæ¡ä»¶ã ãããªãã
- æ ¹æ¬çã«ã¯ãDockerã®ã³ã³ããèªä½ã¯ããã»ã¹ã§ã¯ãªãï¼Linux namespacesã®æ©è½ãé§ä½¿ãã代ç©ã§ããï¼ãã¨ããç¹ã«èµ·å ãããããªæ°ãããã
- èªä½Linuxã«ã¼ã¿ã¼ä¸æ³ï¼
ââã¨ãã£ãå ·åã ãç¹ã«èªä½Linuxã«ã¼ã¿ã¼ä¸æ³ã*1
å¨ç¥ã®äºå®ã ãä»ä¸åº¦ç¹°ãè¿ãã¨ãã³ã³ããèªä½ã¯ããã»ã¹ã§ã¯ãªããLinux namespacesã®æ©è½ãé§ä½¿ãã¦ãæ¢å®ã®åå空éã¨ã¯å¥ã®åå空éã«è«¸ã ã®ãªã½ã¼ã¹ãè©°ãè¾¼ãã§éé¢ãã代ç©ãã³ã³ããã§ããã
ããã»ã¹ã§ã¯ãªãã®ã§ãDockerã®bridge networkã«ããã¦ä»åã®è©±é¡ã®ä¸å¿ã§ãããã¼ãã»ãããã³ã°ã®ãããªæ©è½ãå®ç¾ããã«ããããã¦ã¼ã¶ã¼ã©ã³ãã§ã®ã½ããã¦ã§ã¢å¦çã«ããéä¿¡å¶å¾¡ââã¤ã¾ãã½ã±ããã»ããã°ã©ãã³ã°ãè¡ã£ã¦ããªãã
ãããã½ã±ããã»ããã°ã©ãã³ã°ã«ããã½ããã¦ã§ã¢å¦çã§å®ç¾ãã¦ãããªãã°ããã®ä»¶ã¯ãLinuxä¸ã§ãããã¯ã¼ã¯ã»ãµã¼ããç´æ¥åãããã®ã¨åãã¬ãã«ã«ãªãã®ã§ãå®éç¨ã«ããã¦åé¡ãå¼ãèµ·ãããã¨ã¯ãªãã£ãã ããã
ã§ãæ®å¿µãç¾å®ã¯éæ ã§ãããã³ã³ããããããã¹ãã®å¤é¨ãããã¯ã¼ã¯ãã¸ã®éä¿¡ãããã¼ãã»ãããã³ã°ã®æ©è½ãå®ç¾ããããã«ããã¹ãå´ã§ã¯å¤ã®èªä½Linuxã«ã¼ã¿ã¼ã¿ãããªãã¨ããã£ã¦ããã®ã§ããã
bind(2)ã«ããIPã¢ãã¬ã¹ã®å²ãå½ã¦
Dockerã®ãããã¯ã¼ã¯æ©è½ã«ã¤ãã¦èªãã«ããããä¸è¦ãã¦ç¡é¢ä¿ãããªãè¿é ãªã¨ãããã話ãå§ãããã¨æããBSDã½ã±ããã¨ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã®é¢ä¿ã§ããã
TCPãUDPã«ã¯ãã¼ãçªå·ã¨ããæ¦å¿µããã*2ãã¯ã©ã¤ã¢ã³ãã»ãµã¼ãã»ã¢ãã«ã«ããããµã¼ãå´ã½ããã¦ã§ã¢ã§ã¯ãbind(2)ã使ç¨ãã¦ã½ã±ããããéä¿¡ãå¾ ã¡åãããã¼ãçªå·ãã«å²ãå½ã¦ãââã¨ããã®ãã½ã±ããã»ããã°ã©ãã³ã°ã«ãããå¤å ¸çãªã¢ããã¼ãã§ããã*3
ãã¼ãçªå·ã«ç®ãåããã¡ã ããbind(2)ã§ã¯ã½ã±ããã«IPã¢ãã¬ã¹ãå²ãå½ã¦ããã¨ãã§ãããã©ããããã¨ã ãããï¼
ä¾ãã°ã³ã³ãã¥ã¼ã¿ã«LANãã¼ãã2ã¤ä»å±ãã¦ãã¦ããã®ãã¡eth0ã«ã¯192.0.2.1ããeth1ã«ã¯203.0.113.10ãå²ãå½ã¦ããã¦ããã¨ããã
ããã§ãTCPãã¼ã2195çªã使ç¨ãããããã¯ã¼ã¯ã»ãµã¼ããåããããã®ã ããeth0ï¼192.0.2.1:2195ï¼å®ã¦ã®éä¿¡ã¯åä¿¡ããããã©eth1ï¼203.0.113.10:2195ï¼å®ã¦ã®éä¿¡ã¯ç¡è¦ãããââã¨ããå ´åã«ãbind(2)ã«ã¦ã192.0.2.1:2195ãã¨ããIPã¢ãã¬ã¹ã¨ãã¼ãçªå·ã®ãã¢ãå²ãå½ã¦ããã¨ã«ãããeth0å®ã¦ã®éä¿¡ã ãåä¿¡ããããã«ãªãã
eth0ã¨eth1ã®ä¸¡æ¹ã«å±ããéä¿¡ãåä¿¡ããããªããã0.0.0.0ãã¨ããã¯ã¤ã«ãã«ã¼ãã¨ãã¦æ©è½ããIPã¢ãã¬ã¹*4ãæå®ããã°ãããã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ãæå®ãããã¨ã«ããããã¼ã«ã«ã«ã¼ãããã¯ãå«ãããã®ã³ã³ãã¥ã¼ã¿ã«å²ãå½ã¦ããã¦ããå ¨ã¦ã®IPã¢ãã¬ã¹ãã®ãã¼ã2195çªå®ã¦ã®éä¿¡ãåä¿¡ããããã«ãªãã
ãbind(2)ã«ããIPã¢ãã¬ã¹ã®å²ãå½ã¦ãã®çæ³ã¨ç¾å®
bind(2)ã«ããIPã¢ãã¬ã¹ã®å²ãå½ã¦ã¯ä¾¿å©ã¨ããã°ä¾¿å©ãªã®ã§ã大æµã®ãããã¯ã¼ã¯ã»ãµã¼ãã§ã¯ãéä¿¡ãå¾ ã¡åããIPã¢ãã¬ã¹ããè¨å®ã§ããããã«ãªã£ã¦ããã
ä¾ãã°ãä¸è¨ã¯æå ã®sshd_configã®ä¸é¨ãæç²ãããã®ã«ãªããããListenAddressãã¨ããé ç®ã«ã¦bind(2)ããIPã¢ãã¬ã¹ãæå®ã§ããããã«ãªã£ã¦ããã
# sshd_config ããæç² #Port 22 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ::
æ¢å®å¤ã¯0.0.0.0ã§ãããã³ã³ãã¥ã¼ã¿ã®å ¨ã¦ã®IPã¢ãã¬ã¹å®ã¦ã®éä¿¡ã«åå¿ããããã«ãªã£ã¦ããã
å¤å ¸çãªã管çè ããµã¼ãã®é ããé ã¾ã§ææ¡ãã¦ãããã¨ããã¹ã¿ã¤ã«ã®ãµã¼ãæ§ç¯ã»ç®¡çã«ããã¦ã¯ããµã¼ãä¸ã§åãããTCP/IPãåããµã¼ãã»ãã¼ã¢ã³ãã«ã¤ãã¦ãåã ã®è¨å®ãè¦ç´ãã¦ãå¿ è¦æå°éã®ãIPã¢ãã¬ã¹ã®bind(2)ããå®ç¾ããã ãããã¤ã¾ãã軽ã ããã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã使ç¨ããã¾ã¾ã«ã¯ãã¦ãããªãã®ãçæ³çã§ããã
ç¾å®ã¯ç°ãªãããããã¯ã¼ã¯ã»ãµã¼ãã®è¨å®ãå¤æ´ãã¦ç¹å®ã®IPã¢ãã¬ã¹ãbind(2)ãããããªãã¨ã¯ãä»ã¨ãªã£ã¦ã¯ãã¾ãå¤ããªããè¨å®ãã¡ã¤ã«ã®æ¢å®å¤ã¯ã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã§ãããã¨ãå¤ããã大åã®ã±ã¼ã¹ã§ã¯æ¢å®å¤ã§ããã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã®ã¾ã¾éç¨ãã¦ããã
å ã«æç²ããsshd_configããåããããã«ãç§èªèº«ãã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã®ã¾ã¾ãããã¯ã¼ã¯ã»ãµã¼ãã®é¡ãåããã¦ãããã¨ãå¤ãã
å®éã®ã¨ãããç¾å¨ã®ãµã¼ã管çã«ããã¦ã¯ãå¤ç¨®å¤æ§ãªãTCP/IPãåããµã¼ãã»ãã¼ã¢ã³ããåããã¦ããä¸ã«ãå種ã³ã³ãã¼ãã³ãé¡ã®å ¥ãæ¿ãããæ©ãããªã®ã§ãã¡ãã¡å ¨ã¦ã®ãããã¯ã¼ã¯ã»ãµã¼ãã®è¨å®ãç²¾æ»ãªãã¦ãã¦ããããªããã¡ãã£ã¨éã«åããªãã
ã§ã¯ãbind(2)ã«ããIPã¢ãã¬ã¹ã®å²ãå½ã¦ã®ä»£ããã«ä½ããã¦ãããã¨ããã°ããã¡ã¤ã¢ã¦ã©ã¼ã«ã§å®å ã¢ãã¬ã¹ï¼ãã¼ãçªå·ããã§ãã¯ãã¦ãã±ãããã£ã«ã¿ãªã³ã°ãã¦ããã®ã§ããã
ãããã¯ã¼ã¯ã»ãµã¼ãã®è¨å®ãã¡ã¤ã«ã¯åæ£ãã¦ããä¸ã«å 容ãåå·®ä¸å¥ã ãããã¡ã¤ã¢ã¦ã©ã¼ã«ãªã1ã¶æã§éä¸ç®¡çã§ããããã®ç¹ã¯ä¾¿å©ã ããã
ãã¼ã«ã«ã»ããã»ã¹å®ã¦ã®ãã±ããããã£ã«ã¿ãªã³ã°ããã¿ã¤ãã³ã°
Linuxä¸ã§ã¯ããããã¯ã¼ã¯ã»ãµã¼ãã¯ããã»ã¹ã¨ãã¦åä½ãã¦ãããLinuxã®Netfilterã«ããã¦ã¯ããã¼ã«ã«ããã»ã¹å®ã¦ã®ãã±ããã¯INPUTãã§ã¤ã³ã§ãã£ã«ã¿ãªã³ã°ããã°ããã
次ã®å³ã¯ãNetfilterã«ãããL3ã§ã®ãã±ããå¦çã®æµãã示ãããã®ã§ããã
+-----------------------------------------------------------------+ | Network Interfaces | | (lo/eth/wlan/etc...) | +-----------------------------------------------------------------+ | | Incoming packet Outgoing packet | | +-------------+ | | PREROUTING | | | +---------+ | +-------------+ | | raw | | | POSTROUTING | | +---------+ | | +---------+ | | | | | | nat | | | +---------+ | | +---------+ | | | mangle | | | | | | +---------+ | | +---------+ | | | | | | mangle | | | +---------+ | | +---------+ | | | nat | | +-------------+ | +---------+ | | +-------------+ | | +---------------------------+ | | | FORWARD | | +-------------+ | +--------+ +--------+ | +-------------+ | Routing |--->| | mangle |---->| filter | |--->| Routing | +-------------+ | +--------+ +--------+ | +-------------+ | +---------------------------+ | | +-------------+ | | OUTPUT | | | +---------+ | | | | filter | | +-------------+ | +---------+ | | INPUT | | | | | +---------+ | | +---------+ | | | mangle | | | | nat | | | +---------+ | | +---------+ | | | | | | | | +---------+ | | +---------+ | | | filter | | | | mangle | | | +---------+ | | +---------+ | +-------------+ | | | | | +---------+ | | | | raw | | +-----------------------------------------------+ | +---------+ | | | Local Process | +-------------+ | | | | | +---------------------+ +-------------------+ | +-------------+ | | recv(2)/recvfrom(2) | | send(2)/sendto(2) |-|-->| Routing | | +---------------------+ +-------------------+ | +-------------+ | | | | | Received data Send data | +-----------------------------------------------+
å é¨ã§ã½ã±ããéä¿¡ãã¦ãããããã¯ã¼ã¯ã»ãµã¼ãã¯ããã®å³ã«ããããã¼ã«ã«ã»ããã»ã¹ã«è©²å½ãããINPUTãã§ã¤ã³ã¯ããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ãããã¼ã«ã«ã»ããã»ã¹ã¾ã§ã®çµè·¯ä¸ã«ä½ç½®ããããªã®ã§ãINPUTãã§ã¤ã³ã«ã¦ãã±ãããã£ã«ã¿ãªã³ã°ãè¡ããã¨ã«ãªãã
VPSãªã©ã§ãµã¼ããæ§ç¯ããå ´åãiptablesãnftablesã®INPUTãã§ã¤ã³ã«ãã£ã«ã¿ãªã³ã°ã«ã¼ã«ãè¨å®ããã ããã大æ¦ã®å ¥éææ¸ã«ã¦ããæ¡å ããã¦ããããå®åçã«ããã®éãã ã
ã¨ãããã¨ã§ãLinuxãµã¼ãã触ã£ã¦ãã人ã«ã¨ã£ã¦ãINPUTãã§ã¤ã³ã¯èº«è¿ãªãã®ã§ãããæ®éã«ãããã¯ã¼ã¯ã»ãµã¼ããåããåã«ã¯ãå²ã¨ããã ãã§ååã«éã«åããã®ã ã
Bridge networkã«ããããã¹ãã¨ã³ã³ããã®ãããã¯ã¼ã¯æ§æ
æ®å¿µãªãããDockerã®ã³ã³ãããã®ãã®ã¯ãã¼ã«ã«ã»ããã»ã¹ã§ã¯ãªãããã¼ã«ã«ã»ããã»ã¹ã§ã¯ãªãã®ã ãããã³ã³ããå®ã¦ã®éä¿¡ã«ã¤ãã¦ããã¹ãå´ã®Netfilterã®INPUTãã§ã¤ã³ãã«ã¦å¶å¾¡ã試ã¿ãã®ã¯çå¤ãã§ããã
次ã®å³ã¯ãDockerã§ãããã¯ã¼ã¯ã»ãã©ã¤ãã¨ãã¦bridge networkãé¸æããç¶æ ã§ã3ã¤ã®ã³ã³ãããåãããéã®ã大ã¾ããªãããã¯ã¼ã¯æ§æã示ãããã®ã§ããã
+----------------------------------------------+ | Linux box | | | | +------------------------------------------+ | | | Default network namespace | | | | | | | | +-------+ +-------+ +-------+ +-------+ | | | | | lo | | eth0 | | eth1 | | wlan0 | | | | | +-------+ +-------+ +-------+ +-------+ | | | | | | | | +---------+ | | | | | docker0 | | | | | +----+----+ | | | | | | | | | +--------------+--------------+ | | | | | | | | | | | +---+---+ +---+---+ +---+---+ | | | | | veth0 | | veth1 | | veth2 | | | | | +---+---+ +---+---+ +---+---+ | | | +-----|--------------|--------------|------+ | | | | | | | +-----|------+ +-----|------+ +-----|------+ | | | +---+---+ | | +---+---+ | | +---+---+ | | | | | veth0 | | | | veth0 | | | | veth0 | | | | | +-------+ | | +-------+ | | +-------+ | | | | +-------+ | | +-------+ | | +-------+ | | | | | lo | | | | lo | | | | lo | | | | | +-------+ | | +-------+ | | +-------+ | | | | | | | | | | | | Container1 | | Container2 | | Container3 | | | +------------+ +------------+ +------------+ | +----------------------------------------------+
Dockerã®ãã¹ãå´ããè¦ãã¨ãå®è¡ä¸ã®åã³ã³ããã¯docker0ã¨ããä»®æ³ãããã¯ã¼ã¯ã»ããã¤ã¹ã®å ã«ã¶ãä¸ãã£ã¦ããã
ãã®æ§é ã¯ãä¸è¨ã®ãããã¯ã¼ã¯æ§æã¨é常ã«ããä¼¼ã¦ããã
+------------------------------------------+ | Linux_box0 | | | | +-------+ +-------+ +-------+ +-------+ | | | lo | | eth0 | | eth1 | | wlan0 | | | +-------+ +-------+ +-------+ +-------+ | | | | +-------+ | | | eth2 | | | +---+---+ | +--------------------|---------------------+ | +--------------+--------------+ | | | +-----|------+ +-----|------+ +-----|------+ | +---+---+ | | +---+---+ | | +---+---+ | | | eth0 | | | | eth0 | | | | eth0 | | | +-------+ | | +-------+ | | +-------+ | | +-------+ | | +-------+ | | +-------+ | | | lo | | | | lo | | | | lo | | | +-------+ | | +-------+ | | +-------+ | | | | | | | | Linux_box1 | | Linux_box2 | | Linux_box3 | +------------+ +------------+ +------------+
ãã®å³ã¯èªä½Linuxã«ã¼ã¿ã®å®è¡ç°å¢ã®ä¸ä¾ã§ãããLinux_box0ãã«ã¼ã¿ã§ãããeth2ã¯ãã©ã¤ãã¼ãã»ãããã¯ã¼ã¯ã«ç¹ãã£ã¦ããããã©ã¤ãã¼ãã»ãããã¯ã¼ã¯ä¸ã«ã¯3å°ã®ã³ã³ãã¥ã¼ã¿ï¼Linux_box1ï½Linux_box3ï¼ãåä½ãã¦ãããLinux_box1ï½Linux_box3ã¯ãã«ã¼ã¿ã§ããLinux_box0ãçµç±ãã¦å¤é¨ãããã¯ã¼ã¯ã¨éä¿¡ããã
ããã§ãå¤é¨ãããã¯ã¼ã¯ã¨ç¹ãã£ã¦ãããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ãeth0ã ã¨ä»®å®ããã¨ãLinux_box0ã§ã¯ãä½ãããã®æ¹æ³ã§eth0ï½eth2éã§ãã±ãããæ©æ¸¡ãããå¿ è¦ãããã
Dockerã®å ´åãä¼¼ããããªãã®ã§ããã¯ãå¤é¨ãããã¯ã¼ã¯ã¨ç¹ãã£ã¦ããã®ãeth0ã ã¨ä»®å®ããã¨ããã¹ãå´ã«ã¦ä½ãããã®æ¹æ³ã§eth0ï½docker0éã§ãã±ãããæ©æ¸¡ãããå¿ è¦ãããã
ã©ãæ©æ¸¡ããããï¼ãIPãã©ã¯ã¼ãã使ç¨ãã¦ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹éã§ãã±ããã転éããã®ã§ããããã®æãNetfilterã®PREROUTINGãã§ã¤ã³ã¨POSTROUTINGãã§ã¤ã³ã«ã¦ããã±ããã®å®å IPã¢ãã¬ã¹ã®æ¸ãæããè¡ã£ã¦ããï¼ä¿ã«è¨ãNATã¨ãIPãã¹ã«ã¬ã¼ãã¨ãããã¢ã¬ã§ããï¼ã
å ã«ç¤ºããNetfilterã®ãã±ããå¦çã®å³ã§è¨ãã¨ãä¾ãã°Linux_box1ï¼Container1ãå¤é¨ãããã¯ã¼ã¯ã«åãã¦éä¿¡ãããã±ããã¯ãLinux_box0ï¼Dockerãã¹ãå´ã§ã¯æ¬¡ã®ããã«å¦çãããã ããã
- Network Interfacesï¼eth2ï¼docker0ï¼ â PREROUTINGãã§ã¤ã³ã
- PREROUTINGãã§ã¤ã³ â FORWARDãã§ã¤ã³ã
- FORWARDãã§ã¤ã³ã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãé©ç¨ãããã
- FORWARDãã§ã¤ã³ â POSTROUTINGãã§ã¤ã³ã
- POSTROUTINGãã§ã¤ã³ã§éä¿¡å IPã¢ãã¬ã¹ãæ¸ãæããããã
- POSTROUTINGãã§ã¤ã³ â Network Interfacesï¼eth0ï¼ã
å対æ¹åã®ãå¤é¨ãããã¯ã¼ã¯ããLinux_box1ï¼Container1ã«åãã¦ã®ãã±ããã¯ã次ã®ããã«å¦çãããã ããã
- Network Interfacesï¼eth0ï¼ â PREROUTINGãã§ã¤ã³ã
- PREROUTINGãã§ã¤ã³ã§å®å IPã¢ãã¬ã¹ãæ¸ãæããããã
- PREROUTINGãã§ã¤ã³ â FORWARDãã§ã¤ã³ã
- FORWARDãã§ã¤ã³ã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãé©ç¨ãããã
- FORWARDãã§ã¤ã³ â POSTROUTINGãã§ã¤ã³ã
- POSTROUTINGãã§ã¤ã³ â Network Interfacesï¼eth2ï¼docker0ï¼ã
ã©ã¡ãã®ã±ã¼ã¹ãï¼ç¹ã«åä¿¡æ¹åã®ãã±ããã«ã¤ãã¦ï¼INPUTãã§ã¤ã³ãééããªããã ããINPUTãã§ã¤ã³ã«è¨è¿°ãããã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ã¯é©ç¨ãããªãã
ãã®ãã¨ã¯ãDockerã®ãããã¯ã¼ã¯ã¾ããã«ã¤ãã¦ç解ãã¦ããã°ãèªæã®ãã¨ã§ããã
æ®å¿µãªãããç§ãå«ãã¦ãã³ã³ããã¯ããã»ã¹ã§ã¯ãªããã¨ãããã¨ã®æ¬å½ã®æå³ã«ã¤ãã¦ã®ç解ãæµ ã人ã¯å¤ãããã®ãããªäººãä»ã¾ã§è§¦ã£ã¦ãããããã¯ã¼ã¯ã»ãµã¼ãã¨åããããªå¡©æ¢ ã§ã³ã³ãããæ±ããã¨ãã¦ãã¾ãããã¡ã¤ã¢ã¦ã©ã¼ã«ã«ã¤ãã¦ããããã¯ã¼ã¯ã»ãµã¼ãã®æã¨åãæµåã§é©ç¨ããã°ååã ã¨å¤æãã¦ãã¾ã£ãæã«ãINPUTãã§ã¤ã³ã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãé©ç¨ãããªãã¨ããäºå®ãçããããã¨ã«ãªãã
â¦â¦èªä½Linuxã«ã¼ã¿ãªããç©ççã«LANã®æ§æãç®ã«è¦ãã¦åãããã§ãDockerã®å ´åã¯å ¨ã¦ããã¹ãå´ã®ã³ã³ãã¥ã¼ã¿ã®ä¸ã«ããã¾ã£ã¦ãã¦ç®ã«è¦ããªããç®ã«è¦ããªããããããæ··ä¹±ãå¼ãèµ·ãããããã®ãããããªãã
å®éã«Netfilterã«è¨å®ãããã«ã¼ã«ãè¦ã¦ã¿ã
Dockerã¯å¤é¨ãããã¯ã¼ã¯ã¨ã³ã³ããã®éãã¤ãªãããã«Netfilterã®ã«ã¼ã«ãå¤æ´ãããå ·ä½çã«ã¯ã©ã®ãããªå 容ãªã®ã ãããï¼
以ä¸ã«ç¤ºãç°å¢ï¼Ubuntu 22.04ä¸ã®Docker 24.0.3ï¼ã«ã¦ã«ã¼ã«ã確èªãã¦ã¿ããå®é¨ç¨ã«ç¨æããç°å¢ã§ããããããããããã±ãããã£ã«ã¿ãªã³ã°ã®ã«ã¼ã«ã¯æªè¨å®ã®ç°å¢ã§ããã
$ lsb_release -a Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy $ uname -a Linux fabrico 5.19.0-46-generic #47~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 21 15:35:31 UTC 2 x86_64 x86_64 x86_64 GNU/Linux $ docker --version Docker version 24.0.3, build 3713ee1 $ docker version Client: Docker Engine - Community Version: 24.0.3 API version: 1.43 Go version: go1.20.5 Git commit: 3713ee1 Built: Wed Jul 5 20:44:55 2023 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 24.0.3 API version: 1.43 (minimum version 1.12) Go version: go1.20.5 Git commit: 1d9c861 Built: Wed Jul 5 20:44:55 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.21 GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8 runc: Version: 1.1.7 GitCommit: v1.1.7-0-g860f061 docker-init: Version: 0.19.0 GitCommit: de40ad0
ã¾ããDockeræ¬ä½ãåä½ãã¦ããæã«nftablesã§ã«ã¼ã«ã確èªããã¨ã次ã®ããã«ãªã£ã¦ããã
# sudo nft -s list ruleset table ip nat { chain POSTROUTING { type nat hook postrouting priority srcnat; policy accept; oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade } chain PREROUTING { type nat hook prerouting priority dstnat; policy accept; fib daddr type local counter jump DOCKER } chain OUTPUT { type nat hook output priority -100; policy accept; ip daddr != 127.0.0.0/8 fib daddr type local counter jump DOCKER } chain DOCKER { iifname "docker0" counter return } } table ip filter { chain DOCKER { } chain DOCKER-ISOLATION-STAGE-1 { iifname "docker0" oifname != "docker0" counter jump DOCKER-ISOLATION-STAGE-2 counter return } chain FORWARD { type filter hook forward priority filter; policy drop; counter jump DOCKER-USER counter jump DOCKER-ISOLATION-STAGE-1 oifname "docker0" ct state related,established counter accept oifname "docker0" counter jump DOCKER iifname "docker0" oifname != "docker0" counter accept iifname "docker0" oifname "docker0" counter accept } chain DOCKER-USER { counter return } chain DOCKER-ISOLATION-STAGE-2 { oifname "docker0" counter drop counter return } }
ãã®ç¶æ ã§ã¯ãã³ã³ãããã¯ã©ã¤ã¢ã³ãå´ã¨ãã¦æ¯ãèãéä¿¡ã許å¯ããã¦ããï¼ãªã®ã§apt(8)ãyum(8)ã使ç¨ãã¦ãããã¯ã¼ã¯çµç±ã§ãã³ã³ãã¼ãã³ããã¢ãããã¼ããããã¨ãå¯è½ã§ããï¼ã
å ·ä½çã«ã¯ãPOSTROUTINGãã§ã¤ã³ã®ä¸è¨ã«ã¼ã«ã«ãããã³ã³ããããå¤é¨ãããã¯ã¼ã¯ã«åãã¦éä¿¡ãããã±ããã®éä¿¡å IPã¢ãã¬ã¹ãããã¹ãå´ã®IPã¢ãã¬ã¹ãã«æ¸ãæãããã¦ããå¤é¨ãããã¯ã¼ã¯ã«éåºãããã
oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade
nftablesã®ã«ã¼ã«ã§ã¯æ示ããã¦ããªãããå¤é¨ãããã¯ã¼ã¯ããã³ã³ããå®ã¦ã«å±ãããã±ããã«ã¤ãã¦ããPREROUTINGãã§ã¤ã³ãããã®ã¿ã¤ãã³ã°ã§éä¿¡å IPã¢ãã¬ã¹ãããã¹ãå´ã®IPã¢ãã¬ã¹ããããã³ã³ããã®IPã¢ãã¬ã¹ãã«æ¸ãæãããã¦ããã¯ãã§ãã*5ã
å¤é¨ãããã¯ã¼ã¯ããã³ã³ããå®ã¦ã«å±ãããã±ããã«é¢ãã¦ã¯ãFORWARDãã§ã¤ã³ã®ä¸è¨ã«ã¼ã«ã«ãããã³ã³ãããéä¿¡ãããã±ããã«å¯¾ããå¿çãã±ãããã®ã¿ãå容ããããã«åä½ãã¦ããã
oifname "docker0" ct state related,established counter accept
ç·ãã¦ãéä¿¡å´ãåä¿¡å´ãå®ã«ã家åºç¨ã®ããã¼ããã³ãã«ã¼ã¿ãã£ã½ãã«ã¼ã«ã§ãããªãã¨ããææ³ã§ããã
次ã«docker run -p 8080:8080
ã§ã³ã³ãããèµ·åããæã®ã«ã¼ã«ã¯ã©ããªã£ã¦ããã ãããï¼
# docker run -p 8080:8080 test_image # sudo nft -s list ruleset table ip nat { chain POSTROUTING { type nat hook postrouting priority srcnat; policy accept; oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 8080 counter masquerade } chain PREROUTING { type nat hook prerouting priority dstnat; policy accept; fib daddr type local counter jump DOCKER } chain OUTPUT { type nat hook output priority -100; policy accept; ip daddr != 127.0.0.0/8 fib daddr type local counter jump DOCKER } chain DOCKER { iifname "docker0" counter return iifname != "docker0" meta l4proto tcp tcp dport 8080 counter dnat to 172.17.0.2:8080 } } table ip filter { chain DOCKER { iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 8080 counter accept } chain DOCKER-ISOLATION-STAGE-1 { iifname "docker0" oifname != "docker0" counter jump DOCKER-ISOLATION-STAGE-2 counter return } chain FORWARD { type filter hook forward priority filter; policy drop; counter jump DOCKER-USER counter jump DOCKER-ISOLATION-STAGE-1 oifname "docker0" ct state related,established counter accept oifname "docker0" counter jump DOCKER iifname "docker0" oifname != "docker0" counter accept iifname "docker0" oifname "docker0" counter accept } chain DOCKER-USER { counter return } chain DOCKER-ISOLATION-STAGE-2 { oifname "docker0" counter drop counter return } }
ã³ã³ããããå¤é¨ãããã¯ã¼ã¯ã«åãã¦éä¿¡ããããã±ããã®æ±ãã«ã¤ãã¦ã¯ãå ã»ã©ã¨åãã ãéãã¯å¤é¨ãããã¯ã¼ã¯ããã³ã³ããå®ã¦ã«å±ãããã±ããã®æ±ãã«è¦ãããã
å¤é¨ãããã¯ã¼ã¯ãããã¹ãå´ã®ãã¼ã8080çªã«å±ãããã±ããã¯ãPREROUTINGãã§ã¤ã³ããã¸ã£ã³ãããå ã®DOCKERãã§ã¤ã³ã«ããã¦ãä¸è¨ã«ã¼ã«ã«ãã£ã¦å®å IPã¢ãã¬ã¹ï¼ãã¼ãçªå·ãæ¸ãæããããã
iifname != "docker0" meta l4proto tcp tcp dport 8080 counter dnat to 172.17.0.2:8080
ãã®å¾ãFORWARDãã§ã¤ã³ããã¸ã£ã³ãããå ã®DOCKERãã§ã¤ã³ã®ä¸è¨ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ã§ãã±ãããå容ãããã
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 8080 counter accept
ãã®ä¸é£ã®æµãã«ã¯ã家åºç¨ã«ã¼ã¿ã®ãã¼ãéæ¾æ©è½ã彷彿ããããã®ãããã
ãã¦ãPREROUTINGãã§ã¤ã³ã§å®è¡ãããä¸è¨ã«ã¼ã«ãå度è¦ã¦ã¿ãã
iifname != "docker0" meta l4proto tcp tcp dport 8080 counter dnat to 172.17.0.2:8080
ãã®ã«ã¼ã«ã§ã¯ããã¹ãå´ã«å±ãããã±ããã®å®å IPã¢ãã¬ã¹ããã§ãã¯ãã¦ããªãããã®ããããã¹ãå´ã®ãdocker0ãé¤ããå ¨ã¦ã®ãIPã¢ãã¬ã¹ãä»ä¸ãããããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ãã®ãã¼ã8080çªã«å±ãããã±ããããDNATã§å®å ãã³ã³ããã®IPã¢ãã¬ã¹ã«æ¸ãæãããã¦ã以éã®ãã§ã¤ã³ã«æµãã¦è¡ã£ã¦ãã¾ããã¨ã«ãªãã
ããã§ã¯ãä¾ãã°docker run -p 192.0.2.100:8080:8080
ã®ããã«ãIPã¢ãã¬ã¹ãæ示ãã¦ãã¼ãã»ãããã³ã°ããå ´åã«ã¯ãã©ã®ãããªã«ã¼ã«ã«ãªãã ãããï¼
# docker run -p 192.0.2.100:8080:8080 test_image # sudo nft -s list ruleset table ip nat { chain POSTROUTING { type nat hook postrouting priority srcnat; policy accept; oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 8080 counter masquerade } chain PREROUTING { type nat hook prerouting priority dstnat; policy accept; fib daddr type local counter jump DOCKER } chain OUTPUT { type nat hook output priority -100; policy accept; ip daddr != 127.0.0.0/8 fib daddr type local counter jump DOCKER } chain DOCKER { iifname "docker0" counter return iifname != "docker0" meta l4proto tcp ip daddr 192.0.2.100 tcp dport 8080 counter dnat to 172.17.0.2:8080 } } table ip filter { chain DOCKER { iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 8080 counter accept } chain DOCKER-ISOLATION-STAGE-1 { iifname "docker0" oifname != "docker0" counter jump DOCKER-ISOLATION-STAGE-2 counter return } chain FORWARD { type filter hook forward priority filter; policy drop; counter jump DOCKER-USER counter jump DOCKER-ISOLATION-STAGE-1 oifname "docker0" ct state related,established counter accept oifname "docker0" counter jump DOCKER iifname "docker0" oifname != "docker0" counter accept iifname "docker0" oifname "docker0" counter accept } chain DOCKER-USER { counter return } chain DOCKER-ISOLATION-STAGE-2 { oifname "docker0" counter drop counter return } }
PREROUTINGãã§ã¤ã³ã§DNATããé¨åã®ã«ã¼ã«ã®ã¿å¤åãã¦ããã
# IPã¢ãã¬ã¹ãæ示ããªãã£ãå ´åï¼ iifname != "docker0" meta l4proto tcp tcp dport 8080 counter dnat to 172.17.0.2:8080 # IPã¢ãã¬ã¹ãæ示ããå ´åï¼ iifname != "docker0" meta l4proto tcp ip daddr 192.0.2.100 tcp dport 8080 counter dnat to 172.17.0.2:8080
IPã¢ãã¬ã¹ãæ示ããå ´åã¯ãDNATããéã«å®å IPã¢ãã¬ã¹ããã§ãã¯ãã¦ãããããã«ããããã¹ãå´ã®ç¹å®ã®ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã«å±ãããã±ãããã®ã¿ãDNATããã以éã®ãã§ã¤ã³ã«æµãã¦ããããã«ãªãã
ããããã¦å·¥è¤ãããã¼ãªãããããæ¡ä»¶
ãã¼ãã»ãããã³ã°ããéã«IPã¢ãã¬ã¹ãæ示ãããã¨ã§ããã¹ãå´ã®ç¹å®ã®ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã«å±ãããã±ããã ããDNATããã¦ãã³ã³ããã«è»¢éãããã®ã§ãã£ãã
ãã¦ãDockerã®éçºè ã«ãªã£ãæ°åã§æèå®é¨ãã¦ã¿ãããããã¹ãå´ã®ç¹å®ã®ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã示ãIPã¢ãã¬ã¹ãã®æ¢å®å¤ï¼ããã©ã«ãå¤ï¼ã¨ãã¦ç¸å¿ããå¤ã¯ä½ã ãããï¼
Dockerãåãããã¹ãã«ã¯ããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã¯ä½ååå¨ããã ãããï¼ãããããã®ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã«ã¯ãã©ã®ãããªIPã¢ãã¬ã¹ãä»ä¸ããã¦ããã ãããï¼
çãï¼ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ãä½åããã®ãåãããªãããä»ä¸ããã¦ããIPã¢ãã¬ã¹ãåãããªãã
ãããæ¢å®å¤ã¨ãã¦ç¸å¿ããIPã¢ãã¬ã¹ã¯ä½ã ãããï¼
ââã¨èããæã«ãæ¢åã®ãããã¯ã¼ã¯ã»ãµã¼ãã®å¾ ã¡åãIPã¢ãã¬ã¹ã®ããã«ãã¨ããããå ¨ã¦ã®ãããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹å®ã¦ã®ãã±ãããå容ãã¦ãã¾ãããã¨ããå¤æããããã¨ã¯ãã¾ããæå¤ã¨ãããã¡ãªãã¿ã¼ã³ã§ã¯ãªããã¨æãã
å¯ä¸ã®éãã¯ãæ®éã®ãããã¯ã¼ã¯ã»ãµã¼ããªãNetfilterã®INPUTãã§ã¤ã³ã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãé©ç¨ãããï¼ã ããããã®è¾ºã®ã«ã¼ã«ããé©åãªãã°ãã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã«bind(2)ãã¦ã被害ã¯ã§ãªãï¼ã®ã«ãããã¦ãDockerã®ãã¼ãã»ãããã³ã°ã§ã¯INPUTãã§ã¤ã³ã®ã«ã¼ã«ãé©ç¨ãããªããã¨ã§ããã
ããã§ãæ¢å®å¤ã¨ãã¦ãã¼ã«ã«ã«ã¼ãããã¯ãæ¡ç¨ãããã¨ã¯ãDockerã¨ããæ±ç¨ãªã½ããã¦ã§ã¢ã¨ãã¦ã¯ãã¡ãã£ã¨ãããããæãããã
ä¾ãã°RDBMSï¼MySQLã¨ãï¼ã®ç®¡çãã¼ããªããæ¢å®å¤ï¼ãã¼ã«ã«ã«ã¼ãããã¯ãã§ãç´å¾ã§ãããããããªãããªããªãRDBMSãå ¨ä¸çã«å¤§å ¬éãããã¨ã¯é常ã«ç¨ã ããã ãã¨ãããæ®éã¯ãå ¬éãããã¯ã¼ã¯ä¸ã®ãµã¼ãã§åããã¦ããRDBMSã®ç®¡çãã¼ãã«å¤ããã¢ã¯ã»ã¹ã§ãã¦ãã¾ã£ãããçã£å ã«ãµã¼ãã®ã»ãã¥ãªãã£å¯¾çä¸è¶³ãçãã¨æãã
ä¸æ¹ã§Webãµã¼ãã®å ¬éãã¼ãã«ã¤ãã¦ãæ¢å®å¤ï¼ãã¼ã«ã«ã«ã¼ãããã¯ãã ã£ããããã¼ããããã£ã¦ã©ããªã®ãï¼ãã¿ãããªãæ°æã¡è¡¨æãåºã¦ããã¯ãã§ããããæ¢å®å¤ã¯ã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ã§ããã®ã§ã¯ï¼ãã¨ãçªã£è¾¼ã¾ãããããããªãã
Dockerã¯æ±ç¨ãªä»çµã¿ã§ãããåã³ã³ããã§ã¯ãWebãµã¼ãï¼åºãå ¬éããããã¨ãå¤ãï¼ãåãã¦ãããã¨ãããã°ãRDBMSï¼å ¬éç¯å²ã¯ã§ããã ãçãï¼ãåãã¦ãããã¨ãããã
ãã¼ã«ã«ã«ã¼ãããã¯ãæ¢å®å¤ã¨ããã®ã¯é©åã ãããï¼ããããDockerã¦ã¼ã¶ããã®ãæ°æã¡è¡¨æãåºãªãã ãããï¼
é常ã«æ©ã¾ãããç§å人ã®ææ³ã¨ãã¦ã¯ãä»®ã«éçºè ããããã¼ãªãããããã¨ãã¼ãã¦ããã¨ãã¦ããã¾ãããã¹ãªãããªâ¦â¦ã
対çæ¡
ã¨ãããã以ä¸ã®4éããèããããããªã¹ã¹ã¡ã¯(1)ãªãã(2)ãããªããããã
- ã³ã³ãããèµ·åããæã«ããã¼ãã»ãããã³ã°ã«ã¦ããã±ãããå容ãããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹ã®IPã¢ãã¬ã¹ããæ示ããã
- ä¾ãã°
docker run -p 8080:8080
ã§ã¯ãªãdocker run -p 127.0.0.1:8080:8080
ã®ããã«æ示ããã - è¨å®ãã¡ã¤ã«ï¼ä¾ãã°daemon.jsonï¼ãæ¸ãæãã¦ããã¼ãã»ãããã³ã°ã®æ¢å®å¤ãã¯ã¤ã«ãã«ã¼ãã¢ãã¬ã¹ä»¥å¤ã«å¤æ´ãã¦ããã®ãè¯ãã¢ã¤ãã¢ã ããã
- ä¾ãã°
- Netfilterã®FORWARDãã§ã¤ã³ã«ã¦ãã³ã³ããå®ã¦ã®éä¿¡ãã®ãã±ãããã£ã«ã¿ãªã³ã°ãè¡ãã
- Dockerã¯
DOCKER-USER
ã¨ããååã®ãã§ã¤ã³ã追å ãããããã«ã¦ã¼ã¶å®ç¾©ã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ã追å ããã°ããã
- Dockerã¯
- åã
ã®ã³ã³ããå´ã«ã¦ãã±ãããã£ã«ã¿ãªã³ã°ããã
docker run
ããæã«--cap-add=NET_ADMIN
ãä»ä¸ãããã¨ã§ãã³ã³ããã®ä¸ã§iptablesãnftablesãå©ç¨ã§ããããã«ãªãã- ãã種ã®ãç¹æ¨©ã¢ã¼ããã§ã³ã³ãããåãããã¨ã«ãªãã®ã§ãä½ã¨ãªãã³ã³ããã®é·æã®1ã¤ãæ½°ãã¦ãã¾ããã¨ã«ãªãæ°ãããã
- DockerãNetfilterã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãåæã«å¤æ´ããªãããã«è¨å®ããä¸ã§ãèªåã§ãã«ã»ããã®ãã£ã«ã¿ãªã³ã°ã»ã«ã¼ã«ãç¨æããã
ã¾ã¨ã
æ¬ä»¶ã®ç¾è±¡ã«ã¤ãã¦ãDockerããã¡ã¤ã¢ã¦ã©ã¼ã«ã«ç©´ã空ãããã¿ãããªæãã§èªããããã¨ãå¤ãããããã¯èª¤è§£ãæãããã表ç¾ã ããã
Netfilterã«ãããL3ã§ã®ãã±ããå¦çã®æµããè¦ãã°åããããã«ãä¸è¬çãªãããã¯ã¼ã¯ã»ãµã¼ãââã½ã±ããAPIã使ã£ã¦éä¿¡ããããã»ã¹ã«ãããããã±ãããã£ã«ã¿ãªã³ã°ã¯ãINPUTãã§ã¤ã³ãOUTPUTãã§ã¤ã³ã«è¨å®ãããã®ã§ããã
ã¤ã¾ããæ®éã®ãããã¯ã¼ã¯ã»ãµã¼ãã®ç®¡çè ã«ã¨ã£ã¦ããµã¼ãã®ãã¡ã¤ã¢ã¦ã©ã¼ã«âINPUTãã§ã¤ã³ã¨OUTPUTãã§ã¤ã³ãã§ããã
ããã¡ã¤ã¢ã¦ã©ã¼ã«ã«ç©´ã空ãããã¨ãã表ç¾ã¯ãDockerãINPUTãã§ã¤ã³ãOUTPUTãã§ã¤ã³ã®è¨å®ãå¤æ´ãããã¿ãããªèª¤è§£ãçããããå¯è½æ§ãããã
ãããå®éã«Dockerã®ã·ã¹ãã ãè¡ã£ã¦ããã®ã¯ãIPãã©ã¯ã¼ãã«ãããããã¯ã¼ã¯ã»ã¤ã³ã¿ãã§ã¼ã¹éã§ã®ãã±ãã転éãã§ãããããã¯ãINPUTãã§ã¤ã³ãããåã»OUTPUTãã§ã¤ã³ã®å¾ãã®ã¿ã¤ãã³ã°ã§å¦çãè¡ããããæ®éã®ãããã¯ã¼ã¯ã»ãµã¼ãã®ç®¡çè ããããã¨ããã¡ã¤ã¢ã¦ã©ã¼ã«ãããå¤ã§ã®åºæ¥äºãã®ããã«è¦ããã ããã
ï¼ç¢ºãã«Netfilterã®ã«ã¼ã«ã«æãå ãã¦ããæç¹ã§ããã±ãããã£ã«ã¿ãªã³ã°ã®è¨å®ãå¼ã£ã¦ãããã¨è¨ããããããããåã ã®ãããã¯ã¼ã¯ã»ãµã¼ãã管çãããã¨ãã観ç¹ã§ã®ãã¡ã¤ã¢ã¦ã©ã¼ã«ã®ã«ã¼ã«ââINPUTãã§ã¤ã³ã¨OUTPUTãã§ã¤ã³ã«ã¯ä¸åæãå ãããã¦ããªãã®ã§ããï¼
ãã£ã¦ããå 容ã¯å¤å ¸çãªãããã¯ã¼ã¯ã»ã«ã¼ã¿ãã®ãã®ã§ãããè«çæ§æã¨ãã¦ã¯ãDockerãã¹ããã«ã¼ã¿ã§ãããåã³ã³ããã¯ã«ã¼ã¿ã«ã¶ãä¸ãã£ã¦ãããç¬ç«ããTCP/IPã¨ã³ããã¤ã³ããã§ãããã¨ãã風ã«è¦åããã ããã
ââãããDockerãå ¥ãã¦ã³ã³ãããåããã¦ãããã¹ãã¯ãæé»ã®ãã¡ã«ãããã¯ã¼ã¯ã»ã«ã¼ã¿åãã¦ãããããªãã®ã ããããã¯ã¼ã¯ã»ãµã¼ãã®è¦³ç¹ã¨ã¯å¥ã«ããããã¯ã¼ã¯ã»ã«ã¼ã¿ã®è¦³ç¹ãããã»ãã¥ãªãã£ãåºããªããã°ãç©´ãçªããã¦ãã¾ããã¨ã«ãªãã
ç¹ã«ãåã³ã³ããã¯ãè«çæ§æã¨ãã¦ã¯ãç¬ç«ããTCP/IPã¨ã³ããã¤ã³ããã§ãããã®ã®ãä¸è¬çãªã¨ã³ããã¤ã³ãã§ãããOSãè¼ã£ã¦ããã³ã³ãã¥ã¼ã¿ãã¨ã¯ç°ãªããã¨ã³ããã¤ã³ãå´ã§ãã±ãããã£ã«ã¿ãªã³ã°ãè¨å®ã»éç¨ãããã¨ã¯ä¸è¬çã§ã¯ãªãï¼--cap-add=NET_ADMIN
ã®æç¹ã§ãã種ã®ãç¹æ¨©ã¢ã¼ããã§ã³ã³ãããåãããã¨ã«ãªãããã³ã³ãããã¨ã«ãã£ã«ã¿ãªã³ã°ãè¨å®ã»éç¨ããã®ã¯æéã§ããï¼ã
ã ãããããDockerãã¹ãå´ã«ããã¦ãããã¯ã¼ã¯ã»ã«ã¼ã¿ã®è¦³ç¹ã§ãã»ãã¥ãªãã£é¢ã«æ°ãé
ããã¨ãéè¦ã¨ãªããDockerã®ãã¼ãã»ãããã³ã°ã¯ãã«ã¼ã¿ã§ãããã¼ãéæ¾æ©è½ã¿ãããªãã®ã§ããããããã®è¦³ç¹ã§ã»ãã¥ãªãã£ã»ãã§ãã¯ããã¹ãã ããã±ãããã£ã«ã¿ãªã³ã°ã«ã¤ãã¦ã¯ããããã¯ã¼ã¯ã»ã«ã¼ã¿ã®è¦³ç¹ã¨ã¯å¥ã«ããããã¯ã¼ã¯ã»ã«ã¼ã¿ã®è¦³ç¹ã«ã¦å¥å£ã§è¨å®ã追å ãããã¨ãæ¤è¨ãã¦ããã ããï¼ãã®ããã«DOCKER-USER
ãã§ã¤ã³ãåå¨ããã®ã ããï¼ã
ãã¾ã
ã³ã³ããèµ·åå¾ã«è¿½å ãããã«ã¼ã«ã®ãã¡ãPOSTROUTINGã«è¿½å ãããä¸è¨å 容ã«ã¤ãã¦ï¼
meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 8080 counter masquerade
ã©ã®ãããªæå³ã®ã«ã¼ã«ãªã®ãåãããªãã£ãã®ã ããStack Overflowæ
å ±ã«ããã°ãPOSTROUTINGã®ããã©ã«ãã»ã«ã¼ã«ãDENYï¼ã¤ã¾ãpolicy drop
ï¼ã§ããå ´åã§ãã³ã³ãããèªåèªèº«ã«æ¥ç¶ã§ããããã«ãããããã¨ããã¨ãã¸ã±ã¼ã¹å¯¾å¿ç¨ã®ã«ã¼ã«ã§ãããããã
*1:ãªãç§ã¯èªä½Linuxã«ã¼ã¿ã¼ã¨ã¢ãå¢ã§ããã
*2:SCTPãDCCPãªã©ã®å¾çºã®L4ãããã³ã«ã«ããã¼ãçªå·ã¯ãããAppleTalkãIPX/SPXãNBFï¼NetBEUIï¼ãªã©ã®å¤ããããã³ã«ã«ã¤ãã¦ã¯ç¥ããªãã
*3:ãµã¼ãå´ã®ãã¼ãçªå·ãåºå®ããã¦ããã®ã§ãã¯ã©ã¤ã¢ã³ãå´ã¯ãéä¿¡å ãã¼ãçªå·ãã決ãæã¡ãã¦éä¿¡éå§ããââã¨ããã¢ããã¼ãã§ãããããã¨ã¯å¥ã«ãVoIPãWebRTCãªã©ã®ããã«ã仲ä»è ï¼SIPãµã¼ããã·ã°ããªã³ã°ãµã¼ãï¼ãéãã¦ï¼SDPãªã©ã§ï¼ãéä¿¡ã«ä½¿ç¨ãããã¼ãçªå·ãã®æ å ±ãç¸äºã«äº¤æãããã¨ã«ããããã¼ãçªå·ãåçã«æ±ºå®ããï¼â決ãæã¡ã§ã¯ãªãï¼ã¢ããã¼ããããã
*4:IPv6ã§ã¯ã::ãã§ããã
*5:iptablesã®ããã¥ã¢ã«ã確èªããæãã§ã¯ãIPãã¹ã«ã¬ã¼ãã使ç¨ããå ´åã«ã¯POSTROUTINGãã§ã¤ã³ã«ã ãè¨å®ãã¦ããã°ããã¿ããã§ããã