1、Linux中的网卡
1.1、查看网卡[网络接口]
- ip link show
- ls /sys/class/net
- 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
(6)此时想让两个namespace网络连通起来 veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
(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
(2)进入到两个容器中,并且查看ip
docker exec -it tomcat01 ip a docker exec -it tomcat02 ip a
(3)互相ping一下是可以ping通的<br />此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的?注意这里并没有veth-pair技术