Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÎåÕÅͼ´øÄã¸ã¶®ÈÝÆ÷ÍøÂçµÄ¹¤×÷Ô­Àí
 
×÷ÕߣºØýÃû
  1164  次浏览      27
 2022-1-11
 
±à¼­ÍƼö:
±¾ÎĽéÉܵÄ×éÖ¯ÈÝÆ÷ÍøÂçµÄ·½°¸½ö½öÊÇ¿ÉÄÜ·½°¸µÄÒ»ÖÖ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÆæÃîµÄLinuxÊÀ½ç £¬ÓÉAlice±à¼­¡¢ÍƼö¡£

ʹÓÃÈÝÆ÷×ÜÊǸоõÏñʹÓÃħ·¨Ò»Ñù¡£¶ÔÓÚÄÇЩÀí½âµ×²ãÔ­ÀíµÄÈËÀ´ËµÈÝÆ÷ºÜºÃÓ㬵«ÊǶÔÓÚ²»Àí½âµÄÈËÀ´Ëµ¾ÍÊǸöجÃΡ£ºÜÐÒÔ˵ÄÊÇ£¬ÎÒÃÇÒѾ­Ñо¿ÈÝÆ÷¼¼ÊõºÜ¾ÃÁË£¬ÉõÖÁ³É¹¦½ÒÃØÈÝÆ÷Ö»ÊǸôÀë²¢ÊÜÏÞµÄ Linux ½ø³Ì£¬ÔËÐÐÈÝÆ÷²¢²»ÐèÒª¾µÏñ£¬ÒÔ¼°ÁíÒ»¸ö·½Ã棬¹¹½¨¾µÏñÐèÒªÔËÐÐһЩÈÝÆ÷¡£

ÏÖÔÚÊÇʱºò½â¾öÈÝÆ÷ÍøÂçÎÊÌâÁË¡£»òÕ߸ü׼ȷµØËµ£¬µ¥Ö÷»úÈÝÆ÷ÍøÂçÎÊÌâ¡£±¾ÎÄ»á»Ø´ðÕâЩÎÊÌ⣺

  • ÈçºÎÐéÄâ»¯ÍøÂç×ÊÔ´£¬ÈÃÈÝÆ÷ÈÏΪ×Ô¼ºÓµÓжÀÕ¼ÍøÂ磿
  • ÈçºÎÈÃÈÝÆ÷ÃÇºÍÆ½¹²´¦£¬Ö®¼ä²»»á»¥Ïà¸ÉÈÅ£¬²¢ÇÒÄܹ»»¥ÏàͨÐÅ£¿
  • ´ÓÈÝÆ÷ÄÚ²¿ÈçºÎ·ÃÎÊÍⲿÊÀ½ç£¨±ÈÈ磬»¥ÁªÍø£©£¿
  • ´ÓÍⲿÊÀ½çÈçºÎ·ÃÎÊij̨»úÆ÷ÉϵÄÈÝÆ÷ÄØ£¨±ÈÈ磬¶Ë¿Ú·¢²¼£©£¿

×îÖÕ½á¹ûºÜÃ÷ÏÔ£¬µ¥Ö÷»úÈÝÆ÷ÍøÂçÊÇÒÑÖªµÄ Linux ¹¦Äܵļòµ¥×éºÏ£º

  • ÍøÂçÃüÃû¿Õ¼ä£¨namespace£©
  • ÐéÄâ EthernetÉ豸£¨veth£©
  • ÐéÄâÍøÂç½»»»»ú£¨ÍøÇÅ£©
  • IP·ÓɺÍÍøÂçµØÖ··­Ò루NAT£©

²¢ÇÒ²»ÐèÒªÈκδúÂë¾Í¿ÉÒÔÈÃÕâÑùµÄÍøÂçħ·¨·¢Éú¡­¡­

ǰÌáÌõ¼þ

ÈÎÒâ Linux ·¢Ðа涼¿ÉÒÔ¡£±¾ÎĵÄËùÓÐÀý×Ó¶¼ÊÇÔÚ vagrant CentOS 8 µÄÐéÄâ»úÉÏÖ´Ðеģº

  1. $ vagrant init centos/8
  2. $ vagrant up
  3. $ vagrant ssh
  4. [vagrant@localhost ~]$ uname -a
  5. Linux localhost.localdomain 4.18.0-147.3.1.el8_1.x86_64

ΪÁ˼òµ¥Æð¼û£¬±¾ÎÄʹÓÃÈÝÆ÷»¯½â¾ö·½°¸£¨±ÈÈ磬Docker »òÕß Podman£©¡£ÎÒÃÇ»áÖØµã½éÉÜ»ù±¾¸ÅÄ²¢Ê¹ÓÃ×î¼òµ¥µÄ¹¤¾ßÀ´´ïµ½Ñ§Ï°Ä¿±ê¡£

network ÃüÃû¿Õ¼ä¸ôÀëÈÝÆ÷

Linux ÍøÂçÕ»°üÀ¨ÄÄЩ²¿·Ö£¿ÏÔÈ»£¬ÊÇһϵÁÐÍøÂçÉ豸¡£»¹ÓбðµÄÂ𣿿ÉÄÜ»¹°üÀ¨Ò»ÏµÁеÄ·ÓɹæÔò¡£²¢ÇÒ²»ÒªÍü¼Ç£¬netfilter hook£¬°üÀ¨ÓÉiptables¹æÔò¶¨ÒåµÄ¡£

ÎÒÃÇ¿ÉÒÔ¿ìËÙ´´½¨Ò»¸ö²¢²»¸´ÔӵĽű¾ inspect-net-stack.sh£º

  1. #!/usr/bin/env bash
  2. echo " > Network devices"
  3. ip link
  4. echo -e "\n > Route table"
  5. ip route
  6. echo -e "\n > Iptables rules"
  7. iptables --list-rules

ÔÚÔËÐнű¾Ç°£¬ÈÃÎÒÃÇÐÞ¸ÄÏ iptable rule£º

  1. $ sudo iptables -N ROOT_NS

ÕâÖ®ºó£¬ÔÚ»úÆ÷ÉÏÖ´ÐÐÉÏÃæµÄ½Å±¾£¬Êä³öÈçÏ£º

  1. $ sudo ./inspect-net-stack.sh
  2. > Network devices
  3. 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
  4. 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. > Route table
  6. default via 10.0.2.2 dev eth0 proto dhcp metric 100
  7. 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100
  8. > Iptables rules
  9. -P INPUT ACCEPT
  10. -P FORWARD ACCEPT
  11. -P OUTPUT ACCEPT
  12. -N ROOT_NS

ÎÒÃǶÔÕâЩÊä³ö¸ÐÐËȤ£¬ÒòΪҪȷ±£¼´½«´´½¨µÄÿ¸öÈÝÆ÷¶¼Óи÷×Ô¶ÀÁ¢µÄÍøÂçÕ»¡£

Äã¿ÉÄÜÒѾ­ÖªµÀÁË£¬ÓÃÓÚÈÝÆ÷¸ôÀëµÄÒ»¸ö Linux ÃüÃû¿Õ¼äÊÇÍøÂçÃüÃû¿Õ¼ä£¨network namespace£©¡£´Ó man ip-netns ¿ÉÒÔ¿´µ½£¬¡°ÍøÂçÃüÃû¿Õ¼äÊÇÍøÂçÕ»Âß¼­ÉϵÄÁíÒ»¸ö¸±±¾£¬ËüÓÐ×Ô¼ºµÄ·ÓÉ£¬·À»ðǽ¹æÔòºÍÍøÂçÉ豸¡£¡±ÎªÁ˼ò»¯Æð¼û£¬ÕâÊDZ¾ÎÄʹÓõÄΨһµÄÃüÃû¿Õ¼ä¡£ÎÒÃDz¢Ã»Óд´½¨ÍêÈ«¸ôÀëµÄÈÝÆ÷£¬¶øÊǽ«·¶Î§ÏÞÖÆÔÚÍøÂçÕ»ÉÏ¡£

´´½¨ÍøÂçÃüÃû¿Õ¼äµÄÒ»ÖÖ·½·¨ÊÇ ip ¹¤¾ß£¬ËüÊÇ iproute2 µÄÒ»²¿·Ö£º

  1. $ sudo ip netns add netns0
  2. $ ip netns
  3. netns0

ÈçºÎʹÓøղŴ´½¨µÄÃüÃû¿Õ¼äÄØ£¿Ò»¸öºÜºÃÓõÄÃüÁî nsenter¡£½øÈëÒ»¸ö»ò¶à¸öÌØ¶¨µÄÃüÃû¿Õ¼ä£¬È»ºóÖ´ÐÐÖ¸¶¨µÄ½Å±¾£º

  1. $ sudo nsenter --net =/var/run/netns/netns0 bash
  2. # н¨µÄ bash ½ø³ÌÔÚ netns0 Àï
  3. $ sudo ./inspect-net-stack.sh
  4. > Network devices 1: lo: < LOOPBACK > mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  5. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  6. > Route table
  7. > Iptables rules
  8. -P INPUT ACCEPT
  9. -P FORWARD ACCEPT
  10. -P OUTPUT ACCEPT

´ÓÉÏÃæµÄÊä³ö¿ÉÒÔÇå³þµØ¿´µ½ bash ½ø³ÌÔËÐÐÔÚ netns0 ÃüÃû¿Õ¼ä£¬Õâʱ¿´µ½µÄÊÇÍêÈ«²»Í¬µÄÍøÂçÕ»¡£ÕâÀïûÓзÓɹæÔò£¬Ã»ÓÐ×Ô¶¨ÒåµÄ iptables chain£¬Ö»ÓÐÒ»¸ö loopback µÄÍøÂçÉ豸¡£

ʹÓÃÐéÄâµÄ Ethernet É豸£¨veth£©½«ÈÝÆ÷Á¬½Óµ½Ö÷»úÉÏ

Èç¹ûÎÒÃÇÎÞ·¨ºÍij¸öרÓеÄÍøÂçջͨÐÅ£¬ÄÇôËü¿´ÉÏÈ¥¾ÍûʲôÓá£ÐÒÔ˵ÄÊÇ£¬Linux ÌṩÁ˺ÃÓõŤ¾ß¡ª¡ªÐéÄâ EthernetÉ豸¡£´Ó man veth ¿ÉÒÔ¿´µ½£¬¡°veth É豸ÊÇÐéÄâ Ethernet É豸¡£ËûÃÇ¿ÉÒÔ×÷ÎªÍøÂçÃüÃû¿Õ¼äÖ®¼äµÄͨµÀ£¨tunnel£©£¬´Ó¶ø´´½¨Á¬½Óµ½ÁíÒ»¸öÃüÃû¿Õ¼äÀïµÄÎïÀíÍøÂçÉ豸µÄÇÅÁº£¬µ«ÊÇÒ²¿ÉÒÔ×÷Ϊ¶ÀÁ¢µÄÍøÂçÉ豸ʹÓᣡ±

ÐéÄâ Ethernet É豸ͨ³£¶¼³É¶Ô³öÏÖ¡£²»Óõ£ÐÄ£¬ÏÈ¿´Ò»Ï´´½¨µÄ½Å±¾£º

  1. $ sudo ip link add veth0 type veth peer name ceth0

ÓÃÕâÌõ¼òµ¥µÄÃüÁÎÒÃǾͿÉÒÔ´´½¨Ò»¶Ô»¥ÁªµÄÐéÄâ Ethernet É豸¡£Ä¬ÈÏÑ¡ÔñÁË veth0 ºÍ ceth0 ÕâÁ½¸öÃû³Æ¡£

  1. $ ip link
  2. 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
  5. link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
  6. 5: ceth0@veth0: < BROADCAST ,MULTICAST,M-DOWN > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  7. link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff
  8. 6: veth0@ceth0: < BROADCAST ,MULTICAST,M-DOWN > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  9. link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff

´´½¨µÄ veth0 ºÍ ceth0 ¶¼ÔÚÖ÷»úµÄÍøÂçÕ»£¨Ò²³ÆÎª root ÍøÂçÃüÃû¿Õ¼ä£©ÉÏ¡£½« netns0 ÃüÃû¿Õ¼äÁ¬½Óµ½ root ÃüÃû¿Õ¼ä£¬ÐèÒª½«Ò»¸öÉ豸ÁôÔÚ root ÃüÃû¿Õ¼ä£¬ÁíÒ»¸öŲµ½ netns0 À

  1. $ sudo ip link set ceth0 netns netns0
  2. # ÁгöËùÓÐÉ豸£¬¿ÉÒÔ¿´µ½ ceth0 ÒѾ­´Ó root Õ»ÀïÏûʧÁË
  3. $ ip link 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
  6. link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
  7. 6: veth0@if5: < BROADCAST ,MULTICAST > mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  8. link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff link-netns netns0

Ò»µ©ÆôÓÃÉ豸²¢ÇÒ·ÖÅäÁ˺ÏÊ浀 IP µØÖ·£¬ÆäÖÐÒ»¸öÉ豸ÉϲúÉúµÄ°ü»áÁ¢¿Ì³öÏÖÔÚÆäÅä¶ÔÉ豸À´Ó¶øÁ¬½ÓÆðÁ½¸öÃüÃû¿Õ¼ä¡£´Ó root ÃüÃû¿Õ¼ä¿ªÊ¼£º

  1. $ sudo ip link set veth0 up
  2. $ sudo ip addr add 172.18.0.11/16 dev veth0

È»ºóÊÇ netns0£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ip link set lo up
  3. $ ip link set ceth0 up
  4. $ ip addr add 172.18.0.10/16 dev ceth0
  5. $ ip link
  6. 1: lo: < LOOPBACK ,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  7. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  8. 5: ceth0@if6: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
  9. link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff link-netnsid 0

¼ì²éÁ¬Í¨ÐÔ£º

  1. # ÔÚ netns0 Àï ping root µÄ veth0
  2. $ ping -c 2 172.18.0.11
  3. PING 172.18.0.11 (172.18.0.11) 56(84) bytes of data.
  4. 64 bytes from 172.18.0.11: icmp_seq = 1 ttl = 64 time = 0 .038 ms
  5. 64 bytes from 172.18.0.11: icmp_seq = 2 ttl = 64 time = 0 .040 ms
  6. --- 172.18.0.11 ping statistics ---
  7. 2 packets transmitted, 2 received, 0% packet loss, time 58ms
  8. rtt min/avg/max/ mdev = 0 .038/0.039/0.040/0.001 ms
  9. # À뿪 netns0
  10. $ exit
  11. # ÔÚrootÃüÃû¿Õ¼äÀïping ceth0
  12. $ ping -c 2 172.18.0.10
  13. PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
  14. 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .073 ms
  15. 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .046 ms
  16. --- 172.18.0.10 ping statistics ---
  17. 2 packets transmitted, 2 received, 0% packet loss, time 3ms
  18. rtt min/avg/max/ mdev = 0 .046/0.059/0.073/0.015 ms

ͬʱ£¬Èç¹û³¢ÊÔ´Ó netns0 ÃüÃû¿Õ¼ä·ÃÎÊÆäËûµØÖ·£¬ËüÊDz»¿ÉÒԳɹ¦µÄ£º

  1. # ÔÚ root ÃüÃû¿Õ¼ä
  2. $ ip addr show dev eth0
  3. 2: eth0: < BROADCAST ,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc fq_codel state UP group default qlen 1000
  4. link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
  5. inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0
  6. valid_lft 84057sec preferred_lft 84057sec
  7. inet6 fe80::5054:ff:fee3:2777/64 scope link
  8. valid_lft forever preferred_lft forever
  9. # ¼ÇסÕâÀï IP ÊÇ 10.0.2.15
  10. $ sudo nsenter --net =/var/run/netns/netns0
  11. # ³¢ÊÔpingÖ÷»úµÄeth0
  12. $ ping 10.0.2.15
  13. connect: Network is unreachable
  14. # ³¢ÊÔÁ¬½ÓÍâÍø
  15. $ ping 8.8.8.8
  16. connect: Network is unreachable

ÕâÒ²ºÜºÃÀí½â¡£ÔÚ netns0 ·ÓɱíÀïûÓÐÕâÀà°üµÄ·ÓÉ¡£Î¨Ò»µÄ entry ÊÇÈçºÎµ½´ï 172.18.0.0/16 ÍøÂ磺

  1. # ÔÚnetns0ÃüÃû¿Õ¼ä:
  2. $ ip route
  3. 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 ÃüÃû¿Õ¼äÒ²ÓÐÁ˸öеķÓÉ£º

  1. # ÔÚrootÃüÃû¿Õ¼ä:
  2. $ ip route
  3. # ... ºöÂÔÎÞ¹ØÐÐ ...
  4. 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11

ÕâÀ¾Í¿ÉÒԻشðµÚÒ»¸öÎÊÌâÁË¡£ÎÒÃÇÁ˽âÁËÈçºÎ¸ôÀ룬ÐéÄ⻯²¢ÇÒÁ¬½ÓLinuxÍøÂçÕ»¡£

ʹÓÃÐéÄâÍøÂç switch£¨ÍøÇÅ£©Á¬½ÓÈÝÆ÷

ÈÝÆ÷»¯Ë¼ÏëµÄÇý¶¯Á¦ÊǸßЧµÄ×ÊÔ´¹²Ïí¡£ËùÒÔ£¬Ò»Ì¨»úÆ÷ÉÏÖ»ÔËÐÐÒ»¸öÈÝÆ÷²¢²»³£¼û¡£Ïà·´£¬×îÖÕÄ¿±êÊǾ¡¿ÉÄܵØÔÚ¹²ÏíµÄ»·¾³ÉÏÔËÐиü¶àµÄ¸ôÀë½ø³Ì¡£Òò´Ë£¬Èç¹û°´ÕÕÉÏÊö veth ·½°¸£¬ÔÚͬһ̨Ö÷»úÉÏ·ÅÖöà¸öÈÝÆ÷µÄ»°»á·¢ÉúÊ²Ã´ÄØ£¿ÈÃÎÒÃdz¢ÊÔÌí¼ÓµÚ¶þ¸öÈÝÆ÷¡£

  1. # ´Ó root ÃüÃû¿Õ¼ä
  2. $ sudo ip netns add netns1
  3. $ sudo ip link add veth1 type veth peer name ceth1
  4. $ sudo ip link set ceth1 netns netns1
  5. $ sudo ip link set veth1 up
  6. $ sudo ip addr add 172.18.0.21/16 dev veth1
  7. $ sudo nsenter --net =/var/run/netns/netns1
  8. $ ip link set lo up
  9. $ ip link set ceth1 up
  10. $ ip addr add 172.18.0.20/16 dev ceth1

¼ì²éÁ¬Í¨ÐÔ£º

  1. # ´Ó netns1 ÎÞ·¨Á¬Í¨ root ÃüÃû¿Õ¼ä!
  2. $ ping -c 2 172.18.0.21
  3. PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
  4. From 172.18.0.20 icmp_seq = 1 Destination Host Unreachable
  5. From 172.18.0.20 icmp_seq = 2 Destination Host Unreachable
  6. --- 172.18.0.21 ping statistics ---
  7. 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 55ms pipe 2
  8. # µ«ÊÇ·ÓÉÊÇ´æÔÚµÄ!
  9. $ ip route
  10. 172.18.0.0/16 dev ceth1 proto kernel scope link src 172.18.0.20
  11. # À뿪 netns1
  12. $ exit
  13. # ´Ó root ÃüÃû¿Õ¼äÎÞ·¨Á¬Í¨ netns1
  14. $ ping -c 2 172.18.0.20
  15. PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
  16. From 172.18.0.11 icmp_seq = 1 Destination Host Unreachable
  17. From 172.18.0.11 icmp_seq = 2 Destination Host Unreachable
  18. --- 172.18.0.20 ping statistics ---
  19. 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 23ms pipe 2
  20. # ´Ónetns0¿ÉÒÔÁ¬Í¨ veth1
  21. $ sudo nsenter --net =/var/run/netns/netns0
  22. $ ping -c 2 172.18.0.21
  23. PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
  24. 64 bytes from 172.18.0.21: icmp_seq = 1 ttl = 64 time = 0 .037 ms
  25. 64 bytes from 172.18.0.21: icmp_seq = 2 ttl = 64 time = 0 .046 ms
  26. --- 172.18.0.21 ping statistics ---
  27. 2 packets transmitted, 2 received, 0% packet loss, time 33ms
  28. rtt min/avg/max/ mdev = 0 .037/0.041/0.046/0.007 ms
  29. # µ«ÊÇÈÔÈ»ÎÞ·¨Á¬Í¨ netns1
  30. $ ping -c 2 172.18.0.20
  31. PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
  32. From 172.18.0.10 icmp_seq = 1 Destination Host Unreachable
  33. From 172.18.0.10 icmp_seq = 2 Destination Host Unreachable
  34. --- 172.18.0.20 ping statistics ---
  35. 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 ÃüÃû¿Õ¼äµÄ·ÓÉ±í£º

  1. $ ip route
  2. # ... ºöÂÔÎÞ¹ØÐÐ... #
  3. 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11
  4. 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 ²ãÍê³ÉÕâЩת·¢µÄ¡£

ÊÔÊÔÕâ¸ö¹¤¾ß¡£µ«ÊÇÊ×ÏÈ£¬ÐèÒªÇå³ýÒÑÓÐÉèÖã¬ÒòΪ֮ǰµÄһЩÅäÖÃÏÖÔÚ²»ÔÙÐèÒªÁË¡£É¾³ýÍøÂçÃüÃû¿Õ¼ä£º

  1. $ sudo ip netns delete netns0
  2. $ sudo ip netns delete netns1
  3. $ sudo ip link delete veth0
  4. $ sudo ip link delete ceth0
  5. $ sudo ip link delete veth1
  6. $ sudo ip link delete ceth1

¿ìËÙÖØ½¨Á½¸öÈÝÆ÷¡£×¢Ò⣬ÎÒÃÇûÓиøÐµÄveth0ºÍveth1É豸·ÖÅäÈκÎIPµØÖ·£º

  1. $ sudo ip netns add netns0
  2. $ sudo ip link add veth0 type veth peer name ceth0
  3. $ sudo ip link set veth0 up
  4. $ sudo ip link set ceth0 netns netns0
  5. $ sudo nsenter --net =/var/run/netns/netns0
  6. $ ip link set lo up
  7. $ ip link set ceth0 up
  8. $ ip addr add 172.18.0.10/16 dev ceth0
  9. $ exit
  10. $ sudo ip netns add netns1
  11. $ sudo ip link add veth1 type veth peer name ceth1
  12. $ sudo ip link set veth1 up
  13. $ sudo ip link set ceth1 netns netns1
  14. $ sudo nsenter --net =/var/run/netns/netns1
  15. $ ip link set lo up
  16. $ ip link set ceth1 up
  17. $ ip addr add 172.18.0.20/16 dev ceth1
  18. $ exit

È·±£Ö÷»úÉÏûÓÐеķÓÉ£º

  1. $ ip route
  2. default via 10.0.2.2 dev eth0 proto dhcp metric 100
  3. 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100

×îºó´´½¨ÍøÇŽӿڣº

  1. $ sudo ip link add br0 type bridge
  2. $ sudo ip link set br0 up

½«veth0ºÍveth1½Óµ½ÍøÇÅÉÏ£º

  1. $ sudo ip link set veth0 master br0
  2. $ sudo ip link set veth1 master br0

¼ì²éÈÝÆ÷¼äµÄÁ¬Í¨ÐÔ£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ping -c 2 172.18.0.20
  3. PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
  4. 64 bytes from 172.18.0.20: icmp_seq = 1 ttl = 64 time = 0 .259 ms
  5. 64 bytes from 172.18.0.20: icmp_seq = 2 ttl = 64 time = 0 .051 ms
  6. --- 172.18.0.20 ping statistics ---
  7. 2 packets transmitted, 2 received, 0% packet loss, time 2ms
  8. rtt min/avg/max/ mdev = 0 .051/0.155/0.259/0.104 ms
  9. $ sudo nsenter --net =/var/run/netns/netns1
  10. $ ping -c 2 172.18.0.10
  11. PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
  12. 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .037 ms
  13. 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .089 ms
  14. --- 172.18.0.10 ping statistics ---
  15. 2 packets transmitted, 2 received, 0% packet loss, time 36ms
  16. rtt min/avg/max/ mdev = 0 .037/0.063/0.089/0.026 ms

Ì«ºÃÁË£¡¹¤×÷µÃºÜºÃ¡£ÓÃÕâÖÖз½°¸£¬ÎÒÃǸù±¾²»ÐèÒªÅäÖà veth0 ºÍ veth1¡£Ö»ÐèÒªÔÚ ceth0 ºÍ ceth1 ¶Ëµã·ÖÅäÁ½¸ö IP µØÖ·¡£µ«ÊÇÒòΪËüÃǶ¼Á¬½ÓÔÚÏàͬµÄ EthernetÉÏ£¨¼Çס£¬ËüÃÇÁ¬½Óµ½ÐéÄâ switchÉÏ£©£¬Ö®¼äÔÚ L2 ²ãÊÇÁ¬Í¨µÄ£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ip neigh
  3. 172.18.0.20 dev ceth0 lladdr 6e:9c:ae:02:60:de STALE
  4. $ exit
  5. $ sudo nsenter --net =/var/run/netns/netns1
  6. $ ip neigh
  7. 172.18.0.10 dev ceth1 lladdr 66:f3:8c:75:09:29 STALE
  8. $ exit

Ì«ºÃÁË£¬ÎÒÃÇѧϰÁËÈçºÎ½«ÈÝÆ÷±ä³ÉÓÑÁÚ£¬ÈÃËüÃÇ»¥²»¸ÉÈÅ£¬µ«ÊÇÓÖ¿ÉÒÔÁ¬Í¨¡£

Á¬½ÓÍⲿÊÀ½ç£¨ IP ·Óɺ͵ØÖ·Î±×°£¨masquerading£©£©

ÈÝÆ÷¼ä¿ÉÒÔͨÐÅ¡£µ«ÊÇËüÃÇÄܺÍÖ÷»ú£¬±ÈÈçrootÃüÃû¿Õ¼ä£¬Í¨ÐÅÂð£¿

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ping 10.0.2.15 # eth0 address
  3. connect: Network is unreachable

ÕâÀïºÜÃ÷ÏÔ£¬netns0 ûÓзÓÉ£º

  1. $ ip route
  2. 172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10

root ÃüÃû¿Õ¼ä²»ÄܺÍÈÝÆ÷ͨÐÅ£º

  1. # Ê×ÏÈʹÓà exit À뿪netns0:
  2. $ ping -c 2 172.18.0.10
  3. PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
  4. From 213.51.1.123 icmp_seq = 1 Destination Net Unreachable
  5. From 213.51.1.123 icmp_seq = 2 Destination Net Unreachable
  6. --- 172.18.0.10 ping statistics ---
  7. 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms
  8. $ ping -c 2 172.18.0.20
  9. PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
  10. From 213.51.1.123 icmp_seq = 1 Destination Net Unreachable
  11. From 213.51.1.123 icmp_seq = 2 Destination Net Unreachable
  12. --- 172.18.0.20 ping statistics ---
  13. 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms

Òª½¨Á¢ root ºÍÈÝÆ÷ÃüÃû¿Õ¼äµÄÁ¬Í¨ÐÔ£¬ÎÒÃÇÐèÒª¸øÍøÇÅÍøÂç½Ó¿Ú·ÖÅä IP µØÖ·£º

  1. $ sudo ip addr add 172.18.0.1/16 dev br0

Ò»µ©¸øÍøÇÅÍøÂç½Ó¿Ú·ÖÅäÁË IP µØÖ·£¬ÔÚÖ÷»úµÄ·ÓɱíÀï¾Í»á¶àÒ»Ìõ·ÓÉ£º

  1. $ ip route
  2. # ...ºöÂÔÎÞ¹ØÐÐ ...
  3. 172.18.0.0/16 dev br0 proto kernel scope link src 172.18.0.1
  4. $ ping -c 2 172.18.0.10
  5. PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
  6. 64 bytes from 172.18.0.10: icmp_seq = 1 ttl = 64 time = 0 .036 ms
  7. 64 bytes from 172.18.0.10: icmp_seq = 2 ttl = 64 time = 0 .049 ms
  8. --- 172.18.0.10 ping statistics ---
  9. 2 packets transmitted, 2 received, 0% packet loss, time 11ms
  10. rtt min/avg/max/ mdev = 0 .036/0.042/0.049/0.009 ms
  11. $ ping -c 2 172.18.0.20
  12. PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
  13. 64 bytes from 172.18.0.20: icmp_seq = 1 ttl = 64 time = 0 .059 ms
  14. 64 bytes from 172.18.0.20: icmp_seq = 2 ttl = 64 time = 0 .056 ms
  15. --- 172.18.0.20 ping statistics ---
  16. 2 packets transmitted, 2 received, 0% packet loss, time 4ms
  17. rtt min/avg/max/ mdev = 0 .056/0.057/0.059/0.007 ms

ÈÝÆ÷¿ÉÄÜÒ²¿ÉÒÔ ping ÍøÇŽӿڣ¬µ«ÊÇËüÃÇ»¹ÊÇÎÞ·¨Á¬½Óµ½Ö÷»úµÄ eth0¡£ÐèҪΪÈÝÆ÷Ìí¼ÓĬÈϵÄ·ÓÉ£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ip route add default via 172.18.0.1
  3. $ ping -c 2 10.0.2.15
  4. PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
  5. 64 bytes from 10.0.2.15: icmp_seq = 1 ttl = 64 time = 0 .036 ms
  6. 64 bytes from 10.0.2.15: icmp_seq = 2 ttl = 64 time = 0 .053 ms
  7. --- 10.0.2.15 ping statistics ---
  8. 2 packets transmitted, 2 received, 0% packet loss, time 14ms
  9. rtt min/avg/max/ mdev = 0 .036/0.044/0.053/0.010 ms
  10. # Ϊ`netns1`Ò²×öÉÏÊöÅäÖÃ

Õâ¸ö¸Ä¶¯»ù±¾ÉϰÑÖ÷»ú±ä³ÉÁË·ÓÉ£¬²¢ÇÒÍøÇŽӿڱä³ÉÁËÈÝÆ÷¼äµÄĬÈÏÍø¹Ø¡£

ºÜºÃ£¬ÎÒÃǽ«ÈÝÆ÷Á¬½Óµ½ root ÃüÃû¿Õ¼äÉÏ¡£ÏÖÔÚ£¬¼ÌÐø³¢ÊÔ½«ËüÃÇÁ¬½Óµ½ÍⲿÊÀ½ç¡£Linux ÉÏĬÈÏ disable ÁËÍøÂç°üת·¢£¨±ÈÈ磬·Óɹ¦ÄÜ£©¡£ÎÒÃÇÐèÒªÏÈÆôÓÃÕâ¸ö¹¦ÄÜ£º

  1. # ÔÚ root ÃüÃû¿Õ¼ä
  2. sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Ôٴμì²éÁ¬Í¨ÐÔ£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ping 8.8.8.8
  3. # hungסÁË...

»¹ÊDz»¹¤×÷¡£ÄÄÀïŪ´íÁËÄØ£¿Èç¹ûÈÝÆ÷¿ÉÒÔÏòÍⲿ·¢°ü£¬ÄÇôĿ±ê·þÎñÆ÷ÎÞ·¨½«°ü·¢»ØÈÝÆ÷£¬ÒòΪÈÝÆ÷µÄIPµØÖ·ÊÇ˽Óеģ¬ÄǸöÌØ¶¨ IP µÄ·ÓɹæÔòÖ»Óб¾µØÍøÂçÖªµÀ¡£²¢ÇÒÓкܶàÈÝÆ÷¹²ÏíµÄÊÇÍêÈ«ÏàͬµÄ˽ÓÐIPµØÖ· 172.18.0.10¡£Õâ¸öÎÊÌâµÄ½â¾ö·½·¨³ÆÎªÍøÂçµØÖ··­Ò루NAT£©¡£ÔÚµ½´ïÍâ²¿ÍøÂç֮ǰ£¬ÈÝÆ÷·¢³öµÄ°ü»á½«Ô´IPµØÖ·Ì滻ΪÖ÷»úµÄÍâ²¿ÍøÂçµØÖ·¡£Ö÷»ú»¹»á¸ú×ÙËùÓÐÒÑÓеÄÓ³É䣬»áÔÚ½«°üת·¢»ØÈÝÆ÷֮ǰ»Ö¸´Ö®Ç°±»Ìæ»»µÄ IP µØÖ·¡£ÌýÉÏÈ¥ºÜ¸´ÔÓ£¬µ«ÊÇÓÐÒ»¸öºÃÏûÏ¢£¡iptables Ä£¿éÈÃÎÒÃÇÖ»ÐèÒªÒ»ÌõÃüÁî¾Í¿ÉÒÔÍê³ÉÕâÒ»ÇУº

  1. $ 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»Í¨¹ýÍøÇŽӿڡ£

¼ì²éÁ¬Í¨ÐÔ£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
  3. 64 bytes from 8.8.8.8: icmp_seq = 1 ttl = 61 time = 43 .2 ms
  4. 64 bytes from 8.8.8.8: icmp_seq = 2 ttl = 61 time = 36 .8 ms
  5. --- 8.8.8.8 ping statistics ---
  6. 2 packets transmitted, 2 received, 0% packet loss, time 2ms
  7. rtt min/avg/max/ mdev = 36 .815/40.008/43.202/3.199 ms

ÒªÖªµÀÕâÀïÎÒÃÇÓõÄĬÈϲßÂÔ¡ª¡ªÔÊÐíËùÓÐÁ÷Á¿£¬ÕâÔÚÕæÊµµÄ»·¾³ÀïÊǷdz£Î£Ïյġ£Ö÷»úµÄĬÈÏ iptables ²ßÂÔÊÇACCEPT£º

  1. sudo iptables -S
  2. -P INPUT ACCEPT
  3. -P FORWARD ACCEPT
  4. -P OUTPUT ACCEPT

Docker ĬÈÏÏÞÖÆËùÓÐÁ÷Á¿£¬Ëæºó½ö½öΪÒÑÖªµÄ·¾¶ÆôÓ÷ÓÉ¡£

ÈçÏÂÊÇÔÚ CentOS 8 »úÆ÷ÉÏ£¬µ¥¸öÈÝÆ÷±©Â¶ÁË¶Ë¿Ú 5005 ʱ£¬ÓÉ Docker daemon Éú³ÉµÄ¹æÔò£º

  1. $ sudo iptables -t filter --list-rules
  2. -P INPUT ACCEPT
  3. -P FORWARD DROP
  4. -P OUTPUT ACCEPT
  5. -N DOCKER
  6. -N DOCKER-ISOLATION-STAGE-1
  7. -N DOCKER-ISOLATION-STAGE-2
  8. -N DOCKER-USER
  9. -A FORWARD -j DOCKER-USER
  10. -A FORWARD -j DOCKER-ISOLATION-STAGE-1
  11. -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  12. -A FORWARD -o docker0 -j DOCKER
  13. -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
  14. -A FORWARD -i docker0 -o docker0 -j ACCEPT
  15. -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
  16. -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
  17. -A DOCKER-ISOLATION-STAGE-1 -j RETURN
  18. -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
  19. -A DOCKER-ISOLATION-STAGE-2 -j RETURN
  20. -A DOCKER-USER -j RETURN
  21. $ sudo iptables -t nat --list-rules
  22. -P PREROUTING ACCEPT
  23. -P INPUT ACCEPT
  24. -P POSTROUTING ACCEPT
  25. -P OUTPUT ACCEPT
  26. -N DOCKER
  27. -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
  28. -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
  29. -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
  30. -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
  31. -A DOCKER -i docker0 -j RETURN
  32. -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5005 -j DNAT --to-destination 172.17.0.2:5000
  33. $ sudo iptables -t mangle --list-rules
  34. -P PREROUTING ACCEPT
  35. -P INPUT ACCEPT
  36. -P FORWARD ACCEPT
  37. -P OUTPUT ACCEPT
  38. -P POSTROUTING ACCEPT
  39. $ sudo iptables -t raw --list-rules
  40. -P PREROUTING ACCEPT
  41. -P OUTPUT ACCEPT

ÈÃÍⲿÊÀ½ç¿ÉÒÔ·ÃÎÊÈÝÆ÷£¨¶Ë¿Ú·¢²¼£©

´ó¼Ò¶¼ÖªµÀ¿ÉÒÔ½«ÈÝÆ÷¶Ë¿Ú·¢²¼¸øÒ»Ð©£¨»òÕßËùÓУ©Ö÷»úµÄ½Ó¿Ú¡£µ«ÊǶ˿ڷ¢²¼µ½µ×ÊÇʲôÒâË¼ÄØ£¿

¼ÙÉèÈÝÆ÷ÄÚÔËÐÐ×Å·þÎñÆ÷£º

  1. $ sudo nsenter --net =/var/run/netns/netns0
  2. $ python3 -m http.server --bind 172.18.0.10 5000

Èç¹ûÎÒÃÇÊÔ×Å´ÓÖ÷»úÉÏ·¢ËÍÒ»¸öHTTPÇëÇóµ½Õâ¸ö·þÎñÆ÷£¬Ò»Çж¼¹¤×÷µÃºÜºÃ£¨rootÃüÃû¿Õ¼äºÍËùÓÐÈÝÆ÷½Ó¿ÚÖ®¼äÓÐÁ´½Ó£¬µ±È»¿ÉÒÔÁ¬½Ó³É¹¦£©£º

  1. # ´Ó root ÃüÃû¿Õ¼ä
  2. $ curl 172.18.0.10:5000
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
  4. # ... ºöÂÔÎÞ¹ØÐÐ ...

µ«ÊÇ£¬Èç¹ûÒª´ÓÍⲿ·ÃÎÊÕâ¸ö·þÎñÆ÷£¬Ó¦¸ÃʹÓÃÄĸöIPÄØ£¿ÎÒÃÇÖªµÀµÄΨһ IP ÊÇÖ÷»úµÄÍⲿ½Ó¿ÚµØÖ· eth0£º

  1. $ curl 10.0.2.15:5000
  2. curl: (7) Failed to connect to 10.0.2.15 port 5000: Connection refused

Òò´Ë£¬ÎÒÃÇÐèÒªÕÒµ½·½·¨£¬Äܹ»½«µ½´ïÖ÷»ú eth0 5000¶Ë¿ÚµÄËùÓаüת·¢µ½Ä¿µÄµØ 172.18.0.10:5000¡£ÓÖÊÇi ptablesÀ´°ï棡

  1. # ÍⲿÁ÷Á¿
  2. 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
  3. # ±¾µØÁ÷Á¿ (ÒòΪËüûÓÐͨ¹ý PREROUTING chain)
  4. 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Äܹ»ÔÚÇŽÓÍøÂçÉϽػñÁ÷Á¿£º

  1. sudo modprobe br_netfilter

²âÊÔ£º

  1. curl 10.0.2.15:5000
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
  3. # ... ºöÂÔÎÞ¹ØÐÐ ...

Àí½â 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]¡£Òò´Ë£¬ÈÝÆ÷»¯¿ÉÒÔÈÏΪÊÇÒ»ÖÖÐéÄ⻯¼¼Êõ¡£

 

   
1164 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
ÔÆÔ­Éú¼Ü¹¹¸ÅÊö
K8S¸ß¿ÉÓü¯Èº¼Ü¹¹ÊµÏÖ
ÈÝÆ÷ÔÆ¹ÜÀíÖ®K8S¼¯Èº¸ÅÊö
k8s-ÕûÌå¸ÅÊöºÍ¼Ü¹¹
Ê®·ÖÖÓѧ»áÓÃdocker²¿Êð΢·þÎñ
×îпγÌ
ÔÆ¼ÆË㡢΢·þÎñÓë·Ö²¼Ê½¼Ü¹¹
Æóҵ˽ÓÐÔÆÔ­ÀíÓë¹¹½¨
»ùÓÚKubernetesµÄDevOpsʵ¼ù
ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦Ó㨰¢ÀïÔÆ£©
Docker²¿Êð±»²âϵͳÓë×Ô¶¯»¯¿ò¼Üʵ¼ù
³É¹¦°¸Àý
±±¾© ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ùÅàѵ
ij¾ü¹¤Ñо¿µ¥Î» MDA£¨Ä£ÐÍÇý¶¯¼Ü¹¹£©
ÖªÃûÏû·Ñ½ðÈÚ¹«Ë¾ ÁìÓòÇý¶¯Éè¼Æ
ÉîÛÚijÆû³µÆóÒµ Ä£ÐÍÇý¶¯µÄ·ÖÎöÉè¼Æ