ip操作物理网卡

参考: http://www.cnblogs.com/iiiiher/p/8056930.html
- 查看mac/操作物理网卡
ip link - 查看ip/mac
ip a - 查看路由表
ip route

ip操作netns

- 操作netns
$ ip netns help
Usage: ip netns list
ip netns add NAME
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd ...
ip netns monitor
ip netns list-id

- 创建两个ns
ip netns add red
ip netns add green - 查看/删除ns
ip netns
ll /var/run/netns
ip netns del red - 查看ns里的配置-网卡
里面只有个lo接口,且处于down状态
$ ip netns exec red ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 $ ip netns exec red ip link set lo up - 进入ns执行命令
ip netns exec net1 bash
exit

参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace

network namespace 之间通信

实现如下图所示

- 创建两个ns
ip netns add net0
ip netns add net1 1. 有了不同 network namespace 之后,也就有了网络的隔离,但是如果它们之间没有办法通信,也没有实际用处。
2. 要把两个网络连接起来,linux 提供了 veth pair
3. 可以把 veth pair 当做是双向的 pipe(管道),从一个方向发送的网络数据,可以直接被另外一端接收到; - 创建管道(一对 veth pair)
$ ip link add type veth
$ ip link
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff 注意:
1. veth pair 无法单独存在,删除其中一个,另一个也会自动消失。
2. 创建 veth pair 的时候可以自己指定它们的名字,比如 ip link add vethfoo type veth peer name vethbar 创建出来的两个名字就是 vethfoo 和 vethbar
3. 如果未指定名字,使用系统自动生成的名字
4. 如果 pair 的一端接口处于 DOWN 状态,另一端能自动检测到这个信息,并把自己的状态设置为 NO-CARRIER。 - 把这对 veth pair 分别放到已经两个 namespace 里面 $ ip link set veth0 netns net0
$ ip link set veth1 netns net1 $ ip netns exec net0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff $ ip netns exec net1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff - 给veth pair 配置上 ip 地址
$ ip netns exec net0 ip link set veth0 up
$ ip netns exec net0 ip addr add 10.0.1.1/24 dev veth0
$ ip netns exec net0 ip route
10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.1 $ ip netns exec net1 ip link set veth1 up
$ ip netns exec net1 ip addr add 10.0.1.2/24 dev veth1 - 测试2个namespace之间的连通性
$ ip netns exec net0 ping -c 3 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.039 ms

使用 bridge 连接不同的 namespace

虽然 veth pair 可以实现两个 network namespace 之间的通信,但是当多个 namespace 需要通信的时候,就无能为力了。 讲到多个网络设备通信,我们首先想到的交换机和路由器。因为这里要考虑的只是同个网络,所以只用到交换机的功能。linux 当然也提供了虚拟交换机的功能,我们还是用 ip 命令来完成所有的操作。

下图是这部分网络的拓扑结构,如果对 docker 网络熟悉的话,其实这和 docker 默认的 bridge 网络模型非常相似。当然要实现每个 namespace 对外网的访问还需要额外的配置(设置默认网关,开启 ip_forward,为网络添加 NAT 规则等)。

NOTE:和 bridge 有关的操作也可以使用命令 brctl,这个命令来自 bridge-utils 这个包,读者可以根据自己的发行版进行安装,使用方法请查阅 man 页面或者相关文档。

首先我们来创建需要的 bridge,简单起见名字就叫做 br0。

$ ip link add br0 type bridge
$ ip link set dev br0 up
下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair: $ ip link add type veth 下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair: $ ip link add type veth
把其中一个 veth(veth1) 放到 net0 里面,设置它的 ip 地址并启用它: $ ip link set dev veth1 netns net0
$ ip netns exec net0 ip link set dev veth1 name eth0
$ ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
$ ip netns exec net0 ip link set dev eth0 up
最后,把另一个 veth(veth0)连接到创建的 bridge 上,并启用它: $ ip link set dev veth0 master br0
$ ip link set dev veth0 up $ ip netns exec net0 ping -c 3 10.0.1.3
PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.
64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.251 ms

参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace

实现bridge之间的通信-一台主机

############################################

ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0 ip netns add net0
ip link add type veth
ip link set dev veth1 netns net0 ip netns exec net0 ip link set dev veth1 name eth0
ip netns exec net0 ip addr add 10.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0 ip link set dev veth0 master br0
ip link set dev veth0 up
ip netns exec net0 ping 10.1.1.1 ############################################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1 ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1 ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0 ip link set dev veth0 master br1
ip link set dev veth0 up ip netns exec net1 ping 20.1.1.1

实现bridge之间的通信-两台主机

#####################在n1操作######################

ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0 ip netns add net0
ip link add type veth
ip link set dev veth1 netns net0 ip netns exec net0 ip link set dev veth1 name eth0
ip netns exec net0 ip addr add 10.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0 ip link set dev veth0 master br0
ip link set dev veth0 up
ip r a 20.1.1.0/24 via 192.168.14.133
ip netns exec net0 ping 10.1.1.1 ########################在n2操作##################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1 ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1 ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0 ip link set dev veth2 master br1
ip link set dev veth2 up
ip r a 10.1.1.0/24 via 192.168.14.132
ip netns exec net1 ping 20.1.1.1

容器直接路由模式参考:

http://www.cnblogs.com/iiiiher/p/8065415.html

[svc]通过bridge连接单机的多个网络namespace的更多相关文章

  1. Android中判断网络连接是否可用及监控网络状态

    Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...

  2. NAT模式下远程连接centos6虚拟机与虚拟机网络配置

    最近装了centos,但是没有网络,也无法远程连接.关键是虚拟机中没有ip地址. 网上方法很多,但是每个人情况不一样,所以不尽适用. 1.解决这个问题,首先保证你的vmware的dhcp服务和net服 ...

  3. (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)

    环境准备: redis-4.0.9,最新版了 ruby:redis-x.x.x.gem    这个gem什么版本都行,我redis4用3.0.0的gem正常跑 jedis-2.9.0.jar,最新版 ...

  4. [svc]linux bridge&docker0&k8s pod网络模型通俗演义

    linux namespace&bridge通俗演义 linux接口类型 br0 eth0: 一个接口 veth : 一对接口,类似一跟网线,一头有地址,另一头连到别处, linux 2个na ...

  5. ubuntu16.04连接android手机蓝牙共享网络热点

    最近的想要用android手机蓝牙共享wifi网络给ubuntu16.04系统用,查了好多资料,发现网上很少有有用的.自己实践后分享如下. 第一步:手机与电脑配对:         该步骤比较简单,网 ...

  6. 运行在VMware上的Linux虚拟机如何使用NAT模式连接物理机的外部网络

    在VMware Workstation中,默认有3个虚拟交换机,分别是VMnet0(使用桥接网络).VMnet1(仅主机网络)和VMnet8(NAT网络). 首先说一下为什么要用NAT模式,如果你的物 ...

  7. SQL Server 2008连接字符串写法大全(摘自网络)

    一..NET Framework Data Provider for SQL Server 类型:.NET Framework类库使用:System.Data.SqlClient.SqlConnect ...

  8. [Android] [putty连接Android设备] [Android设备网络调试]

    file: system/core/adb/adb.c line: 921 /* for the device, start the usb transport if the ** android u ...

  9. 让手机连接到指定的WIFI网络,适用于之前已经连过的网络

    这个例子是从网上找的,我给重新优化了下.这里有个问题是只能连接到之前已经连接过的wifi,目前还没找到连接到陌生wifi(有/无密码)的方法.总之慢慢来吧~ 说下思路: 1.通过wifiManager ...

随机推荐

  1. HDU 3625 Examining the Rooms【第一类斯特灵数】

    <题目链接> <转载于 >>> > 题目大意:有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙.你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打 ...

  2. 不一样的go语言-不同的OO

    前言   go语言因为产生时代的原因,大神们在设计go时,不得不考虑业界的流行趋势(编程理念),使得go既可以面向过程编程,也可以面向对象编程.这里不探讨两者的优劣,存在即是合理,面向过程编程经久不衰 ...

  3. flask-include标签使用标签

      [footer.html] <footer> 这是底部 </footer> [header.html] <style> .nav ul{ overflow: h ...

  4. NOIP 竞赛注意事项

    <一>程序习惯注意 一.Linux与Windows的区别 a) 大小写敏感 i.   在Windows下,文件名大小写不敏感,例如A.c 与 a.c 与和a.C与A.C和没有区别. ii. ...

  5. Leaflet_创建地图(官网示例,可以直接运行)(2017-10-20)

    官网:http://leafletjs.com/examples.html 快速启动指南 http://leafletjs.com/examples/quick-start/example.html ...

  6. 关于Oracle游标out参数多层调用的BUG,ORA-06504

    数据库版本 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit 测试代码 declare p_cur sys_refcu ...

  7. C++学习笔记40:进程应用

    进程创建 system()函数:用于在程序中执行一条命令 如果shell不能运行,返回127,如果发生其他错误返回-1: 例子:int ret_val = system(“ls -l /”); for ...

  8. ESAPI学习笔记

         ESAPI是owasp提供的一套API级别的web应用解决方案,本人通过对ESAPI和其提供的demo源码学习发现,关键的不是对其所提供的API的使用,而是其web应用安全防御体系的构建的思 ...

  9. VC在线程中操作界面

    http://blog.csdn.net/tingsking18/article/details/4399199 多线程是我们在编程中经常遇到的问题,线程执行完后往往要把执行的结果传给主线程,但是MF ...

  10. Servlet第五课:Cookie的使用

    目标规划: 通过这一节课,我们能够懂得怎样使用Cookie.以及怎样获取Cookie中的内容. 插播广告:博客之星评选.点击投我一票.谢谢. Cookie的具体概述. 1. Cookie 是保存在cl ...