±à¼ÍƼö: |
±¾ÎĽéÉܵÄ×éÖ¯ÈÝÆ÷ÍøÂçµÄ·½°¸½ö½öÊÇ¿ÉÄÜ·½°¸µÄÒ»ÖÖ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÆæÃîµÄLinuxÊÀ½ç
£¬ÓÉAlice±à¼¡¢ÍƼö¡£ |
|
ʹÓÃÈÝÆ÷×ÜÊǸоõÏñʹÓÃħ·¨Ò»Ñù¡£¶ÔÓÚÄÇЩÀí½âµ×²ãÔÀíµÄÈËÀ´ËµÈÝÆ÷ºÜºÃÓ㬵«ÊǶÔÓÚ²»Àí½âµÄÈËÀ´Ëµ¾ÍÊǸöجÃΡ£ºÜÐÒÔ˵ÄÊÇ£¬ÎÒÃÇÒѾÑо¿ÈÝÆ÷¼¼ÊõºÜ¾ÃÁË£¬ÉõÖÁ³É¹¦½ÒÃØÈÝÆ÷Ö»ÊǸôÀë²¢ÊÜÏÞµÄ Linux ½ø³Ì£¬ÔËÐÐÈÝÆ÷²¢²»ÐèÒª¾µÏñ£¬ÒÔ¼°ÁíÒ»¸ö·½Ã棬¹¹½¨¾µÏñÐèÒªÔËÐÐһЩÈÝÆ÷¡£
ÏÖÔÚÊÇʱºò½â¾öÈÝÆ÷ÍøÂçÎÊÌâÁË¡£»òÕ߸ü׼ȷµØËµ£¬µ¥Ö÷»úÈÝÆ÷ÍøÂçÎÊÌâ¡£±¾ÎÄ»á»Ø´ðÕâЩÎÊÌ⣺
- ÈçºÎÐéÄâ»¯ÍøÂç×ÊÔ´£¬ÈÃÈÝÆ÷ÈÏΪ×Ô¼ºÓµÓжÀÕ¼ÍøÂ磿
- ÈçºÎÈÃÈÝÆ÷ÃÇºÍÆ½¹²´¦£¬Ö®¼ä²»»á»¥Ïà¸ÉÈÅ£¬²¢ÇÒÄܹ»»¥ÏàͨÐÅ£¿
- ´ÓÈÝÆ÷ÄÚ²¿ÈçºÎ·ÃÎÊÍⲿÊÀ½ç£¨±ÈÈ磬»¥ÁªÍø£©£¿
- ´ÓÍⲿÊÀ½çÈçºÎ·ÃÎÊij̨»úÆ÷ÉϵÄÈÝÆ÷ÄØ£¨±ÈÈ磬¶Ë¿Ú·¢²¼£©£¿
×îÖÕ½á¹ûºÜÃ÷ÏÔ£¬µ¥Ö÷»úÈÝÆ÷ÍøÂçÊÇÒÑÖªµÄ Linux ¹¦Äܵļòµ¥×éºÏ£º
- ÍøÂçÃüÃû¿Õ¼ä£¨namespace£©
- ÐéÄâ EthernetÉ豸£¨veth£©
- ÐéÄâÍøÂç½»»»»ú£¨ÍøÇÅ£©
- IP·ÓɺÍÍøÂçµØÖ··Ò루NAT£©
²¢ÇÒ²»ÐèÒªÈκδúÂë¾Í¿ÉÒÔÈÃÕâÑùµÄÍøÂçħ·¨·¢Éú¡¡
ǰÌáÌõ¼þ
ÈÎÒâ Linux ·¢Ðа涼¿ÉÒÔ¡£±¾ÎĵÄËùÓÐÀý×Ó¶¼ÊÇÔÚ vagrant CentOS 8 µÄÐéÄâ»úÉÏÖ´Ðеģº
- $ vagrant init centos/8
- $ vagrant up
- $ vagrant ssh
- [vagrant@localhost ~]$ uname -a
- Linux localhost.localdomain 4.18.0-147.3.1.el8_1.x86_64
|
ΪÁ˼òµ¥Æð¼û£¬±¾ÎÄʹÓÃÈÝÆ÷»¯½â¾ö·½°¸£¨±ÈÈ磬Docker »òÕß Podman£©¡£ÎÒÃÇ»áÖØµã½éÉÜ»ù±¾¸ÅÄ²¢Ê¹ÓÃ×î¼òµ¥µÄ¹¤¾ßÀ´´ïµ½Ñ§Ï°Ä¿±ê¡£
network ÃüÃû¿Õ¼ä¸ôÀëÈÝÆ÷
Linux ÍøÂçÕ»°üÀ¨ÄÄЩ²¿·Ö£¿ÏÔÈ»£¬ÊÇһϵÁÐÍøÂçÉ豸¡£»¹ÓбðµÄÂ𣿿ÉÄÜ»¹°üÀ¨Ò»ÏµÁеÄ·ÓɹæÔò¡£²¢ÇÒ²»ÒªÍü¼Ç£¬netfilter hook£¬°üÀ¨ÓÉiptables¹æÔò¶¨ÒåµÄ¡£
ÎÒÃÇ¿ÉÒÔ¿ìËÙ´´½¨Ò»¸ö²¢²»¸´ÔӵĽű¾ inspect-net-stack.sh£º
- #!/usr/bin/env bash
- echo " > Network devices"
- ip link
- echo -e "\n > Route table"
- ip route
- echo -e "\n > Iptables rules"
- iptables --list-rules
|
ÔÚÔËÐнű¾Ç°£¬ÈÃÎÒÃÇÐÞ¸ÄÏ iptable rule£º
- $ sudo iptables -N ROOT_NS
|
ÕâÖ®ºó£¬ÔÚ»úÆ÷ÉÏÖ´ÐÐÉÏÃæµÄ½Å±¾£¬Êä³öÈçÏ£º
- $ sudo ./inspect-net-stack.sh
- > Network devices
- 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
- > Route table
- default via 10.0.2.2 dev eth0 proto dhcp metric 100
- 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100
- > Iptables rules
- -P INPUT ACCEPT
- -P FORWARD ACCEPT
- -P OUTPUT ACCEPT
- -N ROOT_NS
|
ÎÒÃǶÔÕâЩÊä³ö¸ÐÐËȤ£¬ÒòΪҪȷ±£¼´½«´´½¨µÄÿ¸öÈÝÆ÷¶¼Óи÷×Ô¶ÀÁ¢µÄÍøÂçÕ»¡£
Äã¿ÉÄÜÒѾ֪µÀÁË£¬ÓÃÓÚÈÝÆ÷¸ôÀëµÄÒ»¸ö Linux ÃüÃû¿Õ¼äÊÇÍøÂçÃüÃû¿Õ¼ä£¨network namespace£©¡£´Ó man ip-netns ¿ÉÒÔ¿´µ½£¬¡°ÍøÂçÃüÃû¿Õ¼äÊÇÍøÂçÕ»Âß¼ÉϵÄÁíÒ»¸ö¸±±¾£¬ËüÓÐ×Ô¼ºµÄ·ÓÉ£¬·À»ðǽ¹æÔòºÍÍøÂçÉ豸¡£¡±ÎªÁ˼ò»¯Æð¼û£¬ÕâÊDZ¾ÎÄʹÓõÄΨһµÄÃüÃû¿Õ¼ä¡£ÎÒÃDz¢Ã»Óд´½¨ÍêÈ«¸ôÀëµÄÈÝÆ÷£¬¶øÊǽ«·¶Î§ÏÞÖÆÔÚÍøÂçÕ»ÉÏ¡£
´´½¨ÍøÂçÃüÃû¿Õ¼äµÄÒ»ÖÖ·½·¨ÊÇ ip ¹¤¾ß£¬ËüÊÇ iproute2 µÄÒ»²¿·Ö£º
- $ sudo ip netns add netns0
- $ ip netns
- netns0
|
ÈçºÎʹÓøղŴ´½¨µÄÃüÃû¿Õ¼äÄØ£¿Ò»¸öºÜºÃÓõÄÃüÁî nsenter¡£½øÈëÒ»¸ö»ò¶à¸öÌØ¶¨µÄÃüÃû¿Õ¼ä£¬È»ºóÖ´ÐÐÖ¸¶¨µÄ½Å±¾£º
- $ sudo nsenter --net =/var/run/netns/netns0 bash
- # н¨µÄ bash ½ø³ÌÔÚ netns0 Àï
- $ sudo ./inspect-net-stack.sh
- > Network devices 1: lo: < LOOPBACK > mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- > Route table
- > Iptables rules
- -P INPUT ACCEPT
- -P FORWARD ACCEPT
- -P OUTPUT ACCEPT
|
´ÓÉÏÃæµÄÊä³ö¿ÉÒÔÇå³þµØ¿´µ½ bash ½ø³ÌÔËÐÐÔÚ netns0 ÃüÃû¿Õ¼ä£¬Õâʱ¿´µ½µÄÊÇÍêÈ«²»Í¬µÄÍøÂçÕ»¡£ÕâÀïûÓзÓɹæÔò£¬Ã»ÓÐ×Ô¶¨ÒåµÄ iptables chain£¬Ö»ÓÐÒ»¸ö loopback µÄÍøÂçÉ豸¡£

ʹÓÃÐéÄâµÄ Ethernet É豸£¨veth£©½«ÈÝÆ÷Á¬½Óµ½Ö÷»úÉÏ
Èç¹ûÎÒÃÇÎÞ·¨ºÍij¸öרÓеÄÍøÂçջͨÐÅ£¬ÄÇôËü¿´ÉÏÈ¥¾ÍûʲôÓá£ÐÒÔ˵ÄÊÇ£¬Linux ÌṩÁ˺ÃÓõŤ¾ß¡ª¡ªÐéÄâ EthernetÉ豸¡£´Ó man veth ¿ÉÒÔ¿´µ½£¬¡°veth É豸ÊÇÐéÄâ Ethernet É豸¡£ËûÃÇ¿ÉÒÔ×÷ÎªÍøÂçÃüÃû¿Õ¼äÖ®¼äµÄͨµÀ£¨tunnel£©£¬´Ó¶ø´´½¨Á¬½Óµ½ÁíÒ»¸öÃüÃû¿Õ¼äÀïµÄÎïÀíÍøÂçÉ豸µÄÇÅÁº£¬µ«ÊÇÒ²¿ÉÒÔ×÷Ϊ¶ÀÁ¢µÄÍøÂçÉ豸ʹÓᣡ±
ÐéÄâ Ethernet É豸ͨ³£¶¼³É¶Ô³öÏÖ¡£²»Óõ£ÐÄ£¬ÏÈ¿´Ò»Ï´´½¨µÄ½Å±¾£º
- $ sudo ip link add veth0 type veth peer name ceth0
|
ÓÃÕâÌõ¼òµ¥µÄÃüÁÎÒÃǾͿÉÒÔ´´½¨Ò»¶Ô»¥ÁªµÄÐéÄâ Ethernet É豸¡£Ä¬ÈÏÑ¡ÔñÁË veth0 ºÍ ceth0 ÕâÁ½¸öÃû³Æ¡£
- $ ip link
- 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
- link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
- 5: ceth0@veth0: < BROADCAST ,MULTICAST,M-DOWN > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
- link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff
- 6: veth0@ceth0: < BROADCAST ,MULTICAST,M-DOWN > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
- link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff
|
´´½¨µÄ veth0 ºÍ ceth0 ¶¼ÔÚÖ÷»úµÄÍøÂçÕ»£¨Ò²³ÆÎª root ÍøÂçÃüÃû¿Õ¼ä£©ÉÏ¡£½« netns0 ÃüÃû¿Õ¼äÁ¬½Óµ½ root ÃüÃû¿Õ¼ä£¬ÐèÒª½«Ò»¸öÉ豸ÁôÔÚ root ÃüÃû¿Õ¼ä£¬ÁíÒ»¸öŲµ½ netns0 À
- $ sudo ip link set ceth0 netns netns0
- # ÁгöËùÓÐÉ豸£¬¿ÉÒÔ¿´µ½ ceth0 ÒѾ´Ó root Õ»ÀïÏûʧÁË
- $ ip link 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
- link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
- 6: veth0@if5: < BROADCAST ,MULTICAST > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
- link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff link-netns netns0
|
Ò»µ©ÆôÓÃÉ豸²¢ÇÒ·ÖÅäÁ˺ÏÊ浀 IP µØÖ·£¬ÆäÖÐÒ»¸öÉ豸ÉϲúÉúµÄ°ü»áÁ¢¿Ì³öÏÖÔÚÆäÅä¶ÔÉ豸À´Ó¶øÁ¬½ÓÆðÁ½¸öÃüÃû¿Õ¼ä¡£´Ó root ÃüÃû¿Õ¼ä¿ªÊ¼£º
- $ sudo ip link set veth0 up
- $ sudo ip addr add 172.18.0.11/16 dev veth0
|
È»ºóÊÇ netns0£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ip link set lo up
- $ ip link set ceth0 up
- $ ip addr add 172.18.0.10/16 dev ceth0
- $ ip link
- 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- 5: ceth0@if6: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
- link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff link-netnsid 0
|

¼ì²éÁ¬Í¨ÐÔ£º
- # ÔÚ netns0 Àï ping root µÄ veth0
- $ ping -c 2 172.18.0.11
- PING 172.18.0.11 (172.18.0.11) 56(84) bytes of data.
- 64 bytes from 172.18.0.11: icmp_seq = 1 ttl = 64 time = 0 .038 ms
- 64 bytes from 172.18.0.11: icmp_seq = 2 ttl = 64 time = 0 .040 ms
- --- 172.18.0.11 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 58ms
- rtt min/avg/max/ mdev = 0 .038/0.039/0.040/0.001 ms
- # À뿪 netns0
- $ exit
- # ÔÚrootÃüÃû¿Õ¼äÀïping ceth0
- $ ping -c 2 172.18.0.10
- PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
- 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .073 ms
- 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .046 ms
- --- 172.18.0.10 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 3ms
- rtt min/avg/max/ mdev = 0 .046/0.059/0.073/0.015 ms
|
ͬʱ£¬Èç¹û³¢ÊÔ´Ó netns0 ÃüÃû¿Õ¼ä·ÃÎÊÆäËûµØÖ·£¬ËüÊDz»¿ÉÒԳɹ¦µÄ£º
- # ÔÚ root ÃüÃû¿Õ¼ä
- $ ip addr show dev eth0
- 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP group default qlen 1000
- link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
- inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0
- valid_lft 84057sec preferred_lft 84057sec
- inet6 fe80::5054:ff:fee3:2777/64 scope link
- valid_lft forever preferred_lft forever
- # ¼ÇסÕâÀï IP ÊÇ 10.0.2.15
- $ sudo nsenter --net =/var/run/netns/netns0
- # ³¢ÊÔpingÖ÷»úµÄeth0
- $ ping 10.0.2.15
- connect: Network is unreachable
- # ³¢ÊÔÁ¬½ÓÍâÍø
- $ ping 8.8.8.8
- connect: Network is unreachable
|
ÕâÒ²ºÜºÃÀí½â¡£ÔÚ netns0 ·ÓɱíÀïûÓÐÕâÀà°üµÄ·ÓÉ¡£Î¨Ò»µÄ entry ÊÇÈçºÎµ½´ï 172.18.0.0/16 ÍøÂ磺
- # ÔÚnetns0ÃüÃû¿Õ¼ä:
- $ ip route
- 172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10
|
Linux Óкü¸ÖÖ·½Ê½½¨Á¢Â·ÓÉ±í¡£ÆäÖÐÒ»ÖÖÊÇÖ±½Ó´ÓÍøÂç½Ó¿ÚÉÏÌáȡ·ÓÉ¡£¼Çס£¬ÃüÃû¿Õ¼ä´´½¨ºó£¬ netns0 ÀïµÄ·ÓɱíÊǿյġ£µ«ÊÇËæºóÎÒÃÇÌí¼ÓÁË ceth0 É豸²¢ÇÒ·ÖÅäÁËIPµØÖ· 172.18.0.0/16¡£ÒòΪÎÒÃÇʹÓõIJ»ÊǼòµ¥µÄ IP µØÖ·£¬¶øÊǵØÖ·ºÍ×ÓÍøÑÚÂëµÄ×éºÏ£¬ÍøÂçÕ»¿ÉÒÔ´ÓÆäÖÐÌáÈ¡³ö·ÓÉÐÅÏ¢¡£Ä¿µÄµØÊÇ 172.18.0.0/16 µÄÿ¸öÍøÂç°ü¶¼»áͨ¹ý ceth0 É豸¡£µ«ÊÇÆäËû°ü»á±»¶ªÆú¡£ÀàËÆµÄ£¬root ÃüÃû¿Õ¼äÒ²ÓÐÁ˸öеķÓÉ£º
- # ÔÚrootÃüÃû¿Õ¼ä:
- $ ip route
- # ... ºöÂÔÎÞ¹ØÐÐ ...
- 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11
|
ÕâÀ¾Í¿ÉÒԻشðµÚÒ»¸öÎÊÌâÁË¡£ÎÒÃÇÁ˽âÁËÈçºÎ¸ôÀ룬ÐéÄ⻯²¢ÇÒÁ¬½ÓLinuxÍøÂçÕ»¡£
ʹÓÃÐéÄâÍøÂç switch£¨ÍøÇÅ£©Á¬½ÓÈÝÆ÷
ÈÝÆ÷»¯Ë¼ÏëµÄÇý¶¯Á¦ÊǸßЧµÄ×ÊÔ´¹²Ïí¡£ËùÒÔ£¬Ò»Ì¨»úÆ÷ÉÏÖ»ÔËÐÐÒ»¸öÈÝÆ÷²¢²»³£¼û¡£Ïà·´£¬×îÖÕÄ¿±êÊǾ¡¿ÉÄܵØÔÚ¹²ÏíµÄ»·¾³ÉÏÔËÐиü¶àµÄ¸ôÀë½ø³Ì¡£Òò´Ë£¬Èç¹û°´ÕÕÉÏÊö veth ·½°¸£¬ÔÚͬһ̨Ö÷»úÉÏ·ÅÖöà¸öÈÝÆ÷µÄ»°»á·¢ÉúÊ²Ã´ÄØ£¿ÈÃÎÒÃdz¢ÊÔÌí¼ÓµÚ¶þ¸öÈÝÆ÷¡£
- # ´Ó root ÃüÃû¿Õ¼ä
- $ sudo ip netns add netns1
- $ sudo ip link add veth1 type veth peer name ceth1
- $ sudo ip link set ceth1 netns netns1
- $ sudo ip link set veth1 up
- $ sudo ip addr add 172.18.0.21/16 dev veth1
- $ sudo nsenter --net =/var/run/netns/netns1
- $ ip link set lo up
- $ ip link set ceth1 up
- $ ip addr add 172.18.0.20/16 dev ceth1
|
¼ì²éÁ¬Í¨ÐÔ£º
- # ´Ó netns1 ÎÞ·¨Á¬Í¨ root ÃüÃû¿Õ¼ä!
- $ ping -c 2 172.18.0.21
- PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
- From 172.18.0.20 icmp_seq = 1 Destination Host Unreachable
- From 172.18.0.20 icmp_seq = 2 Destination Host Unreachable
- --- 172.18.0.21 ping statistics ---
- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 55ms pipe 2
- # µ«ÊÇ·ÓÉÊÇ´æÔÚµÄ!
- $ ip route
- 172.18.0.0/16 dev ceth1 proto kernel scope link src 172.18.0.20
- # À뿪 netns1
- $ exit
- # ´Ó root ÃüÃû¿Õ¼äÎÞ·¨Á¬Í¨ netns1
- $ ping -c 2 172.18.0.20
- PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
- From 172.18.0.11 icmp_seq = 1 Destination Host Unreachable
- From 172.18.0.11 icmp_seq = 2 Destination Host Unreachable
- --- 172.18.0.20 ping statistics ---
- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 23ms pipe 2
- # ´Ónetns0¿ÉÒÔÁ¬Í¨ veth1
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ping -c 2 172.18.0.21
- PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
- 64 bytes from 172.18.0.21: icmp_seq = 1 ttl = 64 time = 0 .037 ms
- 64 bytes from 172.18.0.21: icmp_seq = 2 ttl = 64 time = 0 .046 ms
- --- 172.18.0.21 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 33ms
- rtt min/avg/max/ mdev = 0 .037/0.041/0.046/0.007 ms
- # µ«ÊÇÈÔÈ»ÎÞ·¨Á¬Í¨ netns1
- $ ping -c 2 172.18.0.20
- PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
- From 172.18.0.10 icmp_seq = 1 Destination Host Unreachable
- From 172.18.0.10 icmp_seq = 2 Destination Host Unreachable
- --- 172.18.0.20 ping statistics ---
- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 63ms pipe 2
|
ÔΣ¡Óеط½³ö´íÁË¡¡netns1 ÓÐÎÊÌâ¡£ËüÎÞ·¨Á¬½Óµ½ root£¬²¢ÇÒ´Ó root ÃüÃû¿Õ¼äÀïÒ²ÎÞ·¨·ÃÎʵ½Ëü¡£µ«ÊÇ£¬ÒòΪÁ½¸öÈÝÆ÷¶¼ÔÚÏàͬµÄ IP Íø¶Î 172.18.0.0/16 À´Ó netns0 ÈÝÆ÷¿ÉÒÔ·ÃÎʵ½Ö÷»úµÄ veth1¡£
ÕâÀﻨÁËЩʱ¼äÀ´ÕÒµ½ÔÒò£¬²»¹ýºÜÃ÷ÏÔÓöµ½µÄÊÇ·ÓÉÎÊÌâ¡£ÏȲéһϠroot ÃüÃû¿Õ¼äµÄ·ÓÉ±í£º
- $ ip route
- # ... ºöÂÔÎÞ¹ØÐÐ... #
- 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11
- 172.18.0.0/16 dev veth1 proto kernel scope link src 172.18.0.21
|
ÔÚÌí¼ÓÁ˵ڶþ¸ö veth ¶ÔÖ®ºó£¬root µÄÍøÂçÕ»ÖªµÀÁËзÓÉ 172.18.0.0/16 dev veth1 proto kernel scope link src 172.18.0.21£¬µ«ÊÇ֮ǰÒѾ´æÔÚ¸ÃÍøÂçµÄ·ÓÉÁË¡£µ±µÚ¶þ¸öÈÝÆ÷³¢ÊÔ ping veth1 ʱ£¬Ñ¡ÖеÄÊǵÚÒ»¸ö·ÓɹæÔò£¬Õâµ¼ÖÂÍøÂçÎÞ·¨Á¬Í¨¡£Èç¹ûÎÒÃÇɾ³ýµÚÒ»¸ö·ÓÉ sudo ip route delete 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11£¬È»ºóÖØÐ¼ì²éÁ¬Í¨ÐÔ£¬Ó¦¸Ã¾ÍûÓÐÎÊÌâÁË¡£netns1 ¿ÉÒÔÁ¬Í¨£¬µ«ÊÇ netns0 ¾Í²»ÐÐÁË¡£

Èç¹ûÎÒÃÇΪ netns1 Ñ¡ÔñÆäËûµÄÍø¶Î£¬Ó¦¸Ã¾Í¶¼¿ÉÒÔÁ¬Í¨¡£µ«ÊÇ£¬¶à¸öÈÝÆ÷ÔÚͬһ¸ö IP Íø¶ÎÉÏÓ¦¸ÃÊǺÏÀíµÄʹÓó¡¾°¡£Òò´Ë£¬ÎÒÃÇÐèÒªµ÷Õû veth ·½°¸¡£
±ðÍüÁË»¹ÓÐ Linux ÍøÇÅ¡ª¡ªÁíÒ»ÖÖÐéÄâ»¯ÍøÂç¼¼Êõ£¡Linux ÍøÇÅ×÷ÓÃÀàËÆÓÚÍøÂç switch¡£Ëü»áÔÚÁ¬½Óµ½ÆäÉϵĽӿڼäת·¢ÍøÂç°ü¡£²¢ÇÒÒòΪËüÊÇ switch£¬ËüÊÇÔÚ L2 ²ãÍê³ÉÕâЩת·¢µÄ¡£
ÊÔÊÔÕâ¸ö¹¤¾ß¡£µ«ÊÇÊ×ÏÈ£¬ÐèÒªÇå³ýÒÑÓÐÉèÖã¬ÒòΪ֮ǰµÄһЩÅäÖÃÏÖÔÚ²»ÔÙÐèÒªÁË¡£É¾³ýÍøÂçÃüÃû¿Õ¼ä£º
- $ sudo ip netns delete netns0
- $ sudo ip netns delete netns1
- $ sudo ip link delete veth0
- $ sudo ip link delete ceth0
- $ sudo ip link delete veth1
- $ sudo ip link delete ceth1
|
¿ìËÙÖØ½¨Á½¸öÈÝÆ÷¡£×¢Ò⣬ÎÒÃÇûÓиøÐµÄveth0ºÍveth1É豸·ÖÅäÈκÎIPµØÖ·£º
- $ sudo ip netns add netns0
- $ sudo ip link add veth0 type veth peer name ceth0
- $ sudo ip link set veth0 up
- $ sudo ip link set ceth0 netns netns0
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ip link set lo up
- $ ip link set ceth0 up
- $ ip addr add 172.18.0.10/16 dev ceth0
- $ exit
- $ sudo ip netns add netns1
- $ sudo ip link add veth1 type veth peer name ceth1
- $ sudo ip link set veth1 up
- $ sudo ip link set ceth1 netns netns1
- $ sudo nsenter --net =/var/run/netns/netns1
- $ ip link set lo up
- $ ip link set ceth1 up
- $ ip addr add 172.18.0.20/16 dev ceth1
- $ exit
|
È·±£Ö÷»úÉÏûÓÐеķÓÉ£º
- $ ip route
- default via 10.0.2.2 dev eth0 proto dhcp metric 100
- 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100
|
×îºó´´½¨ÍøÇŽӿڣº
- $ sudo ip link add br0 type bridge
- $ sudo ip link set br0 up
|
½«veth0ºÍveth1½Óµ½ÍøÇÅÉÏ£º
- $ sudo ip link set veth0 master br0
- $ sudo ip link set veth1 master br0
|

¼ì²éÈÝÆ÷¼äµÄÁ¬Í¨ÐÔ£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ping -c 2 172.18.0.20
- PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
- 64 bytes from 172.18.0.20: icmp_seq = 1 ttl = 64 time = 0 .259 ms
- 64 bytes from 172.18.0.20: icmp_seq = 2 ttl = 64 time = 0 .051 ms
- --- 172.18.0.20 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 2ms
- rtt min/avg/max/ mdev = 0 .051/0.155/0.259/0.104 ms
- $ sudo nsenter --net =/var/run/netns/netns1
- $ ping -c 2 172.18.0.10
- PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
- 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .037 ms
- 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .089 ms
- --- 172.18.0.10 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 36ms
- rtt min/avg/max/ mdev = 0 .037/0.063/0.089/0.026 ms
|
Ì«ºÃÁË£¡¹¤×÷µÃºÜºÃ¡£ÓÃÕâÖÖз½°¸£¬ÎÒÃǸù±¾²»ÐèÒªÅäÖà veth0 ºÍ veth1¡£Ö»ÐèÒªÔÚ ceth0 ºÍ ceth1 ¶Ëµã·ÖÅäÁ½¸ö IP µØÖ·¡£µ«ÊÇÒòΪËüÃǶ¼Á¬½ÓÔÚÏàͬµÄ EthernetÉÏ£¨¼Çס£¬ËüÃÇÁ¬½Óµ½ÐéÄâ switchÉÏ£©£¬Ö®¼äÔÚ L2 ²ãÊÇÁ¬Í¨µÄ£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ip neigh
- 172.18.0.20 dev ceth0 lladdr 6e:9c:ae:02:60:de STALE
- $ exit
- $ sudo nsenter --net =/var/run/netns/netns1
- $ ip neigh
- 172.18.0.10 dev ceth1 lladdr 66:f3:8c:75:09:29 STALE
- $ exit
|
Ì«ºÃÁË£¬ÎÒÃÇѧϰÁËÈçºÎ½«ÈÝÆ÷±ä³ÉÓÑÁÚ£¬ÈÃËüÃÇ»¥²»¸ÉÈÅ£¬µ«ÊÇÓÖ¿ÉÒÔÁ¬Í¨¡£
Á¬½ÓÍⲿÊÀ½ç£¨ IP ·Óɺ͵ØÖ·Î±×°£¨masquerading£©£©
ÈÝÆ÷¼ä¿ÉÒÔͨÐÅ¡£µ«ÊÇËüÃÇÄܺÍÖ÷»ú£¬±ÈÈçrootÃüÃû¿Õ¼ä£¬Í¨ÐÅÂð£¿
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ping 10.0.2.15 # eth0 address
- connect: Network is unreachable
|
ÕâÀïºÜÃ÷ÏÔ£¬netns0 ûÓзÓÉ£º
- $ ip route
- 172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10
|
root ÃüÃû¿Õ¼ä²»ÄܺÍÈÝÆ÷ͨÐÅ£º
- # Ê×ÏÈʹÓà exit À뿪netns0:
- $ ping -c 2 172.18.0.10
- PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
- From 213.51.1.123 icmp_seq = 1 Destination Net Unreachable
- From 213.51.1.123 icmp_seq = 2 Destination Net Unreachable
- --- 172.18.0.10 ping statistics ---
- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms
- $ ping -c 2 172.18.0.20
- PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
- From 213.51.1.123 icmp_seq = 1 Destination Net Unreachable
- From 213.51.1.123 icmp_seq = 2 Destination Net Unreachable
- --- 172.18.0.20 ping statistics ---
- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms
|
Òª½¨Á¢ root ºÍÈÝÆ÷ÃüÃû¿Õ¼äµÄÁ¬Í¨ÐÔ£¬ÎÒÃÇÐèÒª¸øÍøÇÅÍøÂç½Ó¿Ú·ÖÅä IP µØÖ·£º
- $ sudo ip addr add 172.18.0.1/16 dev br0
|
Ò»µ©¸øÍøÇÅÍøÂç½Ó¿Ú·ÖÅäÁË IP µØÖ·£¬ÔÚÖ÷»úµÄ·ÓɱíÀï¾Í»á¶àÒ»Ìõ·ÓÉ£º
- $ ip route
- # ...ºöÂÔÎÞ¹ØÐÐ ...
- 172.18.0.0/16 dev br0 proto kernel scope link src 172.18.0.1
- $ ping -c 2 172.18.0.10
- PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
- 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .036 ms
- 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .049 ms
- --- 172.18.0.10 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 11ms
- rtt min/avg/max/ mdev = 0 .036/0.042/0.049/0.009 ms
- $ ping -c 2 172.18.0.20
- PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
- 64 bytes from 172.18.0.20: icmp_seq = 1 ttl = 64 time = 0 .059 ms
- 64 bytes from 172.18.0.20: icmp_seq = 2 ttl = 64 time = 0 .056 ms
- --- 172.18.0.20 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 4ms
- rtt min/avg/max/ mdev = 0 .056/0.057/0.059/0.007 ms
|
ÈÝÆ÷¿ÉÄÜÒ²¿ÉÒÔ ping ÍøÇŽӿڣ¬µ«ÊÇËüÃÇ»¹ÊÇÎÞ·¨Á¬½Óµ½Ö÷»úµÄ eth0¡£ÐèҪΪÈÝÆ÷Ìí¼ÓĬÈϵÄ·ÓÉ£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ip route add default via 172.18.0.1
- $ ping -c 2 10.0.2.15
- PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
- 64 bytes from 10.0.2.15: icmp_seq = 1 ttl = 64 time = 0 .036 ms
- 64 bytes from 10.0.2.15: icmp_seq = 2 ttl = 64 time = 0 .053 ms
- --- 10.0.2.15 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 14ms
- rtt min/avg/max/ mdev = 0 .036/0.044/0.053/0.010 ms
- # Ϊ`netns1`Ò²×öÉÏÊöÅäÖÃ
|
Õâ¸ö¸Ä¶¯»ù±¾ÉϰÑÖ÷»ú±ä³ÉÁË·ÓÉ£¬²¢ÇÒÍøÇŽӿڱä³ÉÁËÈÝÆ÷¼äµÄĬÈÏÍø¹Ø¡£

ºÜºÃ£¬ÎÒÃǽ«ÈÝÆ÷Á¬½Óµ½ root ÃüÃû¿Õ¼äÉÏ¡£ÏÖÔÚ£¬¼ÌÐø³¢ÊÔ½«ËüÃÇÁ¬½Óµ½ÍⲿÊÀ½ç¡£Linux ÉÏĬÈÏ disable ÁËÍøÂç°üת·¢£¨±ÈÈ磬·Óɹ¦ÄÜ£©¡£ÎÒÃÇÐèÒªÏÈÆôÓÃÕâ¸ö¹¦ÄÜ£º
- # ÔÚ root ÃüÃû¿Õ¼ä
- sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
|
Ôٴμì²éÁ¬Í¨ÐÔ£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ping 8.8.8.8
- # hungסÁË...
|
»¹ÊDz»¹¤×÷¡£ÄÄÀïŪ´íÁËÄØ£¿Èç¹ûÈÝÆ÷¿ÉÒÔÏòÍⲿ·¢°ü£¬ÄÇôĿ±ê·þÎñÆ÷ÎÞ·¨½«°ü·¢»ØÈÝÆ÷£¬ÒòΪÈÝÆ÷µÄIPµØÖ·ÊÇ˽Óеģ¬ÄǸöÌØ¶¨ IP µÄ·ÓɹæÔòÖ»Óб¾µØÍøÂçÖªµÀ¡£²¢ÇÒÓкܶàÈÝÆ÷¹²ÏíµÄÊÇÍêÈ«ÏàͬµÄ˽ÓÐIPµØÖ· 172.18.0.10¡£Õâ¸öÎÊÌâµÄ½â¾ö·½·¨³ÆÎªÍøÂçµØÖ··Ò루NAT£©¡£ÔÚµ½´ïÍâ²¿ÍøÂç֮ǰ£¬ÈÝÆ÷·¢³öµÄ°ü»á½«Ô´IPµØÖ·Ì滻ΪÖ÷»úµÄÍâ²¿ÍøÂçµØÖ·¡£Ö÷»ú»¹»á¸ú×ÙËùÓÐÒÑÓеÄÓ³É䣬»áÔÚ½«°üת·¢»ØÈÝÆ÷֮ǰ»Ö¸´Ö®Ç°±»Ìæ»»µÄ IP µØÖ·¡£ÌýÉÏÈ¥ºÜ¸´ÔÓ£¬µ«ÊÇÓÐÒ»¸öºÃÏûÏ¢£¡iptables Ä£¿éÈÃÎÒÃÇÖ»ÐèÒªÒ»ÌõÃüÁî¾Í¿ÉÒÔÍê³ÉÕâÒ»ÇУº
- $ sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -o br0 -j MASQUERADE
|
ÃüÁî·Ç³£¼òµ¥¡£ÔÚ nat ±íÀïÌí¼ÓÁËÒ»Ìõ POSTROUTING chain µÄзÓÉ£¬»áÌæ»»Î±×°ËùÓÐÔ´ÓÚ 172.18.0.0/16 ÍøÂçµÄ°ü£¬µ«ÊDz»Í¨¹ýÍøÇŽӿڡ£
¼ì²éÁ¬Í¨ÐÔ£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
- 64 bytes from 8.8.8.8: icmp_seq = 1 ttl = 61 time = 43 .2 ms
- 64 bytes from 8.8.8.8: icmp_seq = 2 ttl = 61 time = 36 .8 ms
- --- 8.8.8.8 ping statistics ---
- 2 packets transmitted, 2 received, 0% packet loss, time 2ms
- rtt min/avg/max/ mdev = 36 .815/40.008/43.202/3.199 ms
|
ÒªÖªµÀÕâÀïÎÒÃÇÓõÄĬÈϲßÂÔ¡ª¡ªÔÊÐíËùÓÐÁ÷Á¿£¬ÕâÔÚÕæÊµµÄ»·¾³ÀïÊǷdz£Î£Ïյġ£Ö÷»úµÄĬÈÏ iptables ²ßÂÔÊÇACCEPT£º
- sudo iptables -S
- -P INPUT ACCEPT
- -P FORWARD ACCEPT
- -P OUTPUT ACCEPT
|
Docker ĬÈÏÏÞÖÆËùÓÐÁ÷Á¿£¬Ëæºó½ö½öΪÒÑÖªµÄ·¾¶ÆôÓ÷ÓÉ¡£
ÈçÏÂÊÇÔÚ CentOS 8 »úÆ÷ÉÏ£¬µ¥¸öÈÝÆ÷±©Â¶ÁË¶Ë¿Ú 5005 ʱ£¬ÓÉ Docker daemon Éú³ÉµÄ¹æÔò£º
- $ sudo iptables -t filter --list-rules
- -P INPUT ACCEPT
- -P FORWARD DROP
- -P OUTPUT ACCEPT
- -N DOCKER
- -N DOCKER-ISOLATION-STAGE-1
- -N DOCKER-ISOLATION-STAGE-2
- -N DOCKER-USER
- -A FORWARD -j DOCKER-USER
- -A FORWARD -j DOCKER-ISOLATION-STAGE-1
- -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- -A FORWARD -o docker0 -j DOCKER
- -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
- -A FORWARD -i docker0 -o docker0 -j ACCEPT
- -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
- -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
- -A DOCKER-ISOLATION-STAGE-1 -j RETURN
- -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
- -A DOCKER-ISOLATION-STAGE-2 -j RETURN
- -A DOCKER-USER -j RETURN
- $ sudo iptables -t nat --list-rules
- -P PREROUTING ACCEPT
- -P INPUT ACCEPT
- -P POSTROUTING ACCEPT
- -P OUTPUT ACCEPT
- -N DOCKER
- -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
- -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
- -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
- -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
- -A DOCKER -i docker0 -j RETURN
- -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5005 -j DNAT --to-destination 172.17.0.2:5000
- $ sudo iptables -t mangle --list-rules
- -P PREROUTING ACCEPT
- -P INPUT ACCEPT
- -P FORWARD ACCEPT
- -P OUTPUT ACCEPT
- -P POSTROUTING ACCEPT
- $ sudo iptables -t raw --list-rules
- -P PREROUTING ACCEPT
- -P OUTPUT ACCEPT
|
ÈÃÍⲿÊÀ½ç¿ÉÒÔ·ÃÎÊÈÝÆ÷£¨¶Ë¿Ú·¢²¼£©
´ó¼Ò¶¼ÖªµÀ¿ÉÒÔ½«ÈÝÆ÷¶Ë¿Ú·¢²¼¸øÒ»Ð©£¨»òÕßËùÓУ©Ö÷»úµÄ½Ó¿Ú¡£µ«ÊǶ˿ڷ¢²¼µ½µ×ÊÇʲôÒâË¼ÄØ£¿
¼ÙÉèÈÝÆ÷ÄÚÔËÐÐ×Å·þÎñÆ÷£º
- $ sudo nsenter --net =/var/run/netns/netns0
- $ python3 -m http.server --bind 172.18.0.10 5000
|
Èç¹ûÎÒÃÇÊÔ×Å´ÓÖ÷»úÉÏ·¢ËÍÒ»¸öHTTPÇëÇóµ½Õâ¸ö·þÎñÆ÷£¬Ò»Çж¼¹¤×÷µÃºÜºÃ£¨rootÃüÃû¿Õ¼äºÍËùÓÐÈÝÆ÷½Ó¿ÚÖ®¼äÓÐÁ´½Ó£¬µ±È»¿ÉÒÔÁ¬½Ó³É¹¦£©£º
- # ´Ó root ÃüÃû¿Õ¼ä
- $ curl 172.18.0.10:5000
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
- # ... ºöÂÔÎÞ¹ØÐÐ ...
|
µ«ÊÇ£¬Èç¹ûÒª´ÓÍⲿ·ÃÎÊÕâ¸ö·þÎñÆ÷£¬Ó¦¸ÃʹÓÃÄĸöIPÄØ£¿ÎÒÃÇÖªµÀµÄΨһ IP ÊÇÖ÷»úµÄÍⲿ½Ó¿ÚµØÖ· eth0£º
- $ curl 10.0.2.15:5000
- curl: (7) Failed to connect to 10.0.2.15 port 5000: Connection refused
|
Òò´Ë£¬ÎÒÃÇÐèÒªÕÒµ½·½·¨£¬Äܹ»½«µ½´ïÖ÷»ú eth0 5000¶Ë¿ÚµÄËùÓаüת·¢µ½Ä¿µÄµØ 172.18.0.10:5000¡£ÓÖÊÇi ptablesÀ´°ï棡
- # ÍⲿÁ÷Á¿
- sudo iptables -t nat -A PREROUTING -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000
- # ±¾µØÁ÷Á¿ (ÒòΪËüûÓÐͨ¹ý PREROUTING chain)
- sudo iptables -t nat -A OUTPUT -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000
|
ÁíÍ⣬ÐèÒªÈÃiptablesÄܹ»ÔÚÇŽÓÍøÂçÉϽػñÁ÷Á¿£º
- sudo modprobe br_netfilter
|
²âÊÔ£º
- curl 10.0.2.15:5000
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
- # ... ºöÂÔÎÞ¹ØÐÐ ...
|
Àí½â Docker ÍøÂçÇý¶¯
ÎÒÃÇ¿ÉÒÔÔõôʹÓÃÕâÐ©ÖªÊ¶ÄØ£¿±ÈÈ磬¿ÉÒÔÊÔ×ÅÀí½â Docke rÍøÂçģʽ[1]¡£
´Ó --network host ģʽ¿ªÊ¼¡£ÊÔ×űȽÏÒ»ÏÂÃüÁî ip link ºÍ sudo docker run -it --rm --network host alpine ip link µÄÊä³ö¡£ËüÃǼ¸ºõÒ»Ñù£¡ÔÚ host ģʽÏ£¬Docker ¼òµ¥µØÃ»ÓÐʹÓÃÍøÂçÃüÃû¿Õ¼ä¸ôÀ룬ÈÝÆ÷¾ÍÔÚ root ÍøÂçÃüÃû¿Õ¼äÀ﹤×÷£¬²¢ÇÒºÍÖ÷»ú¹²ÏíÍøÂçÕ»¡£
ÏÂÒ»¸öģʽÊÇ--network none¡£sudo docker run -it --rm --network host alpine ip link µÄÊä³öÖ»ÓÐÒ»¸ö loopback ÍøÂç½Ó¿Ú¡£ÕâºÍ֮ǰ´´½¨µÄÍøÂçÃüÃû¿Õ¼ä£¬Ã»ÓÐÌí¼Ó veth É豸ǰºÜÏàËÆ¡£
×îºóÊÇ --network bridge£¨Ä¬ÈÏ£©Ä£Ê½¡£ÕâÕýÊÇÎÒÃÇǰÎij¢ÊÔ´´½¨µÄģʽ¡£´ó¼Ò¿ÉÒÔÊÔÊÔip ºÍiptablesÃüÁ·Ö±ð´ÓÖ÷»úºÍÈÝÆ÷µÄ½Ç¶È¹Û²ìÒ»ÏÂÍøÂçÕ»¡£
rootless ÈÝÆ÷ºÍÍøÂç
Podman ÈÝÆ÷¹ÜÀíÆ÷µÄÒ»¸öºÜºÃµÄÌØÐÔÊǹØ×¢ÓÚ rootless ÈÝÆ÷¡£µ«ÊÇ£¬Äã¿ÉÄÜ×¢Òâµ½£¬±¾ÎÄʹÓÃÁ˺ܶà sudo ÃüÁ˵Ã÷£¬Ã»ÓÐ root ȨÏÞÎÞ·¨ÅäÖÃÍøÂç¡£Podman ÔÚ root ÍøÂçÉϵķ½°¸[2] ºÍDocker·Ç³£ÏàËÆ¡£µ«ÊÇÔÚ rootless ÈÝÆ÷ÉÏ£¬Podman ʹÓÃÁË slirp4netns[3] ÏîÄ¿£º
´Ó Linux 3.8 ¿ªÊ¼£¬·ÇÌØÈ¨Óû§¿ÉÒÔ´´½¨ user_namespaces(7) µÄͬʱ´´½¨ network_namespaces(7)¡£µ«ÊÇ£¬·ÇÌØÈ¨ÍøÂçÃüÃû¿Õ¼ä²¢²»ÊǺÜÓÐÓã¬ÒòΪÔÚÖ÷»úºÍÍøÂçÃüÃû¿Õ¼äÖ®¼ä´´½¨ veth(4) ÈÔÈ»ÐèÒªrootȨÏÞ
slirp4netns ¿ÉÒÔÓÃÍêÈ«·ÇÌØÈ¨µÄ·½Ê½½«ÍøÂçÃüÃû¿Õ¼äÁ¬½Óµ½ Internet ÉÏ£¬Í¨¹ýÍøÂçÃüÃû¿Õ¼äÀïµÄÒ»¸öTAPÉ豸Á¬½Óµ½Óû§Ì¬µÄTCP/IPÕ»£¨slirp£©¡£
rootless ÍøÂçÊǺÜÓÐÏ޵ģº¡°´Ó¼¼ÊõÉÏ˵£¬ÈÝÆ÷±¾ÉíûÓÐ IP µØÖ·£¬ÒòΪûÓÐ root ȨÏÞ£¬ÎÞ·¨ÊµÏÖÍøÂçÉ豸µÄ¹ØÁª¡£ÁíÍ⣬´Ó rootless ÈÝÆ÷ ping ÊDz»»á¹¤×÷µÄ£¬ÒòΪËüȱÉÙ CAP_NET_RAW °²È«ÄÜÁ¦£¬¶øÕâÊÇ ping ÃüÁî±ØÐèµÄ¡£¡±µ«ÊÇËüÈÔÈ»±ÈÍêȫûÓÐÁ¬½ÓÒªºÃ¡£
½áÂÛ
±¾ÎĽéÉܵÄ×éÖ¯ÈÝÆ÷ÍøÂçµÄ·½°¸½ö½öÊÇ¿ÉÄÜ·½°¸µÄÒ»ÖÖ£¨¿ÉÄÜÊÇ×îΪ¹ã·ºÊ¹ÓõÄÒ»ÖÖ£©¡£»¹Óкܶà±ðµÄ·½Ê½£¬Óɹٷ½»òÕßµÚÈý·½²å¼þʵÏÖ£¬µ«ÊÇËùÓÐÕâЩ·½°¸¶¼ÑÏÖØÒÀÀµÓÚ Linux ÍøÂçÐéÄ⻯¼¼Êõ[4]¡£Òò´Ë£¬ÈÝÆ÷»¯¿ÉÒÔÈÏΪÊÇÒ»ÖÖÐéÄ⻯¼¼Êõ¡£
|