×

linux虚拟网络

hqy hqy 发表于2019-05-09 14:40:45 浏览2065 评论0

抢沙发发表评论

linux虚拟网络

neutron的使命 ‘实现服务和相关库以提供按需、可伸缩和技术无关的网络抽象’

tap

操作系统内核中的的虚拟网络设备  位于数据链路层
tap和数据链路层主要协议中的以太网协议Ethernet对应,所以也被成为 虚拟以太网设备

modinfo tun         #检查内核模块
lsmod | grep tun    #检查模块是否加载
modprobe tun        #加载模块

http://li.nux.ro/download/nux/misc/el7/x86_64/      yum源
yum install tunctl  #安装tunctl命令行工具

tunctl -t tap-test  #创建虚拟网卡
ip link show        #查看二层设备
ifconfig -a         #查看所有网卡

ip addr add local 192.168.150.1/24 dev tap-test
ifconfig tap-test 10.10.10.10/24    #绑定ip 上同

namespace

linux许多资源是全局的,namespace首先就是要让这些资源做资源隔离
linux可以在一个host中做多个namespace,而且不同的namespace的资源相互不可见相互透明

namespace隔离的资源
uts_ns  Unix分时系统 各种底层的信息
ipc_ns  进程间通信
mnt_ns  当前装载的文件系统
pid_ns  进程ID的相关信息
user_ns 资源配额
net_ns  网络信息

从网络视角看namespace提供了一份独立的网络协议栈网络设备接口、IPv4、IPv6、路由、防火墙
一个设备只能位于一个namespace中,不同的设备可以通过veth pair进行桥接

ip netns list                           #查看命名空间列表
ip netns add ns_test                    #创建一个新的命名空间

ip link set tap-test netns ns_test      #将现有的虚拟网卡转移到namespace

ip netns exec ns_test ip link show      #查看namespace内的网卡信息
ip netns exec ns_test ifconfig tun-test 192.168.150.1/24 up #绑定ip
ip netns exec ns_test ifconfig -a       #查看ip

veth pair

veth pair 不是一个设备,而是一对设备,以连接两个虚拟以太网端口
操作veth pair 需要和 namespace 一起使用

ip link add tap1 type veth peer name tap2  #创建一对veth pair设备
#不指定name会从veth0开始

ip link show   #查看链路层
ip link set tap1 netns ns1     #将设备转移到命名空间
ip link set tap2 netns ns2     #转移到另一个命名空间
ip netns exec ns1 ifconfig tap1 10.10.10.10/24 up      #添加ip
ip netns exec ns1 ifconfig -a
...... #重复操作
ip netns exec ns2 ping 10.10.10.10     #在相互隔离的命名空间相互可访

以上就是两个namespace之间的连接方法
假设连接两个以上的命名空间呢   这时候最好的办法就是bridge

Bridge

linux现实bridge功能的是brctl命令,如果没有用以下方法安装
yum install bridge-utils

现在假设有四个namespace,需要互相通信
1、创建四个 veth pair
ip link add tap0 type veth peer
ip link add tap1 type veth peer
ip link add tap2 type veth peer
ip link add tap3 type veth peer
ip link show

2、创建四个namespace
ip netns add ns0
ip netns add ns1
ip netns add ns2
ip netns add ns3
ip netns list

3、迁移veth设备并添加ip
ip link set veth0 netns ns0
ip link set veth1 netns ns1
ip link set veth2 netns ns2
ip link set veth3 netns ns3
ip netns exec ns0 ifconfig veth0 10.10.10.10/24 up
ip netns exec ns1 ifconfig veth1 10.10.10.11/24 up
ip netns exec ns2 ifconfig veth2 10.10.10.12/24 up
ip netns exec ns3 ifconfig veth3 10.10.10.13/24 up

4、创建bridge
brctl addbr br0
brctl show
5、将tap添加到bridge并启用tap设备
brctl addif br0 tap0
brctl addif br0 tap1
brctl addif br0 tap2
brctl addif br0 tap3
brctl show

ip link set br0 up
ip link set tap0 up
ip link set tap1 up
ip link set tap2 up
ip link set tap3 up

6、测试
ip netns exec ns[0-3] ping 10.10.10.1[0-3]
为什么本地的namespace中的ip不可达

Router

1、查看内核ip转发状态
cat /proc/sys/net/ipv4/ip_forward
sysctl -a |grep "ip_forward"
grep -R net.ip /usr/lib/sysctl.d/

2、开启转发
net.ipv4.ip_forward = 1      #开启路由转发
/etc/sysctl.conf         #写入配置文件
sysctl -p                #生效配置

例:
1、创建两个namespace,并创建两对veth pair设备迁移到namespace
ip netns add ns0
ip netns add ns1
ip netns list

ip link add tap0 type veth peer name tap_peer0
ip link add tap1 type veth peer name tap_peer1
ip link show

ip link set tap0 netns ns0
ip link set tap1 netns ns1
ip link show

2、给各个设备配置ip地址、启用设备
ip addr add local 10.10.10.10/24 dev tap_peer0
ip addr add local 10.10.11.10/24 dev tap_peer1
ip netns exec ip addr add local 10.10.10.20/24 dev tap0
ip netns exec ns0 ip addr add local 10.10.10.20/24 dev tap0
ip netns exec ns1 ip addr add local 10.10.11.20/24 dev tap1

ip link set tap_peer0 up
ip link set tap_peer1 up
ip netns exec ns0 ip link set tap0 up
ip netns exec ns1 ip link set tap1 up

3、在namespace中添加路由
ip netns exec ns0 route add -net 10.10.11.0/24 gw 10.10.10.10
ip netns exec ns1 route add -net 10.10.10.0/24 gw 10.10.11.10

ip netns exec ns0 ping 10.10.11.20
ip netns exec ns1 ping 10.10.10.20

ns0中的网卡10.20通过veth ns0通过自身路由表发现到达11.20需要通过10.10,ns0通过pair设备可以直接访问到10.10,数据包通过内核转发到veth1设备,最终到达ns1的11.20,ns1接受到ICMP协议通过路由表发现回复数据要通过11.10,于是就讲数据直接丢给11.10,内核接受到数据将数据发往veth0设备,完成访问过程。

tun

tun是网络层的点对点设备,它启用了IP层隧道功能。
linux原生支持三层隧道

ipip
IP IN IP在IPv4报文的基础上再封装一个IPv4bao wen
gre 通用路由封装
在任意一种网络层协议上封装任意一个其他网络层的协议
sit
类似IPIP,IPv4的头封装一个IPv6的报文
isatap
站内自动隧道寻址协议
vti
IPsec隧道提供一个可路由的接口类型

modprobe ipip
lsmod | grep ipip

iptables

iptables 是一个运行在用户空间的命令行工具
netfilter 内核空间的模块iptables所有功能的实现

四张表
mangle  修改数据包的内容,用来做流量整形    包标记表
filter  数据过滤表
nat     地址装换表
raw     状态跟踪表

五个链条
INPUT           入站
OUTPUT          出站
FORWARD         转发
PRERROUTING     路由前
POSTROUTING     路由后

从报文进入host的那一刻起,到报文离开本机的那一刻止,中间这段时间,或者是发自本机的报文,从报文准备发送的那一刻止,中间的这段时间,netfilter会在某些时刻点插入处理模块,这些模块根据相应的策略和规则对报文进行处理。



作者:thread_red
链接:https://www.jianshu.com/p/9770fe312453
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


打赏

本文链接:https://www.kinber.cn/post/679.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客