1、Linux中的网卡

1.1、查看网卡[网络接口]

  1. ip link show
  2. ls /sys/class/net
  3. ip a

1.2、网卡解读

ip a解读

状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:指定的ip地址

配置文件

在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可
比如:cat /etc/sysconfig/network-scripts/ifcfg-eth0

给网卡添加IP地址

1、可以直接修改ifcfg-*文件
2、命令修改
(1)ip addr add 192.168.0.100/24 dev eth0
(2) 删除ip地址
ip addr delete 192.168.0.100/24 dev eth0

网卡启动与关闭

重启网卡:service network restart 或者 systemctl restart network
启动/关闭某个网卡:ifup/ifdown eth0 或者 ip link set eth0 up/down

1.3、Network Namespace

在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的
ip netns list:查看当前机器上的network namespace

ip netns list #查看 ip netns add ns1 #添加 ip netns delete ns1 #删除

1.3.1、namespace实战

(1)创建一个network namespace ip netns add ns1 (2)查看该namespace下网卡的情况 ip netns exec ns1 ip a (3)启动ns1上的lo网卡 ip netns exec ns1 ifup lo or ip netns exec ns1 ip link set lo up (4)再次查看 可以发现state变成了UNKOWN ip netns exec ns1 ip a (5)再次创建一个network namespace ip netns add ns2 image.png (6)此时想让两个namespace网络连通起来 veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能 image.png (7)创建一对link,也就是接下来要通过veth pair连接的link ip link add veth-ns1 type veth peer name veth-ns2 (8)查看link情况 ip link (9)将veth-ns1加入ns1中,将veth-ns2加入ns2中 ip link set veth-ns1 netns ns1 ip link set veth-ns2 netns ns2 (10)查看宿主机和ns1,ns2的link情况 ip link ip netns exec ns1 ip link ip netns exec ns2 ip link (11)此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件 ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1 ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2 (12)再次查看,发现state是DOWN,并且还是没有IP地址 ip netns exec ns1 ip link ip netns exec ns2 ip link (13)启动veth-ns1和veth-ns2 ip netns exec ns1 ip link set veth-ns1 up ip netns exec ns2 ip link set veth-ns2 up (14)再次查看,发现state是UP,同时有IP ip netns exec ns1 ip a ip netns exec ns2 ip a (15)此时两个network namespace互相ping一下,发现是可以ping通的 ip netns exec ns1 ping 192.168.0.12 ip netns exec ns2 ping 192.168.0.11

1.3.2、Container的NS

按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入
到容器中进行验证.
(1)不妨创建两个container看看?

docker run -d —name tomcat01 -p 8081:8080 tomcat docker run -d —name tomcat02 -p 8082:8080 tomcat

  1. (2)进入到两个容器中,并且查看ip

docker exec -it tomcat01 ip a docker exec -it tomcat02 ip a

  1. (3)互相ping一下是可以ping通的<br />此时tomcat01tomcat02属于两个network namespace,是如何能够ping通的?注意这里并没有veth-pair技术