当前位置:首页 » 安全设置 » 网络协议栈空间如何设置

网络协议栈空间如何设置

发布时间: 2022-10-20 00:51:11

‘壹’ C++中怎样手动扩大系统分配的栈空间

如果用Visual C++的话,可以在链接选项中设:/STACK:reserve[,commit]/STACK 选项设置堆栈的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。该选项指定虚拟内存中的总的堆栈分配。默认堆栈大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。commit 取决于操作系统所作的解释。在 Windows NT 和 Windows 2000 中,它指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆栈空间时可节省时间,但会增加内存需求并有可能延长启动时间。以十进制或 C 语言表示法指定 reserve 值和 commit 值。

‘贰’ bios中网络协议栈开启会怎么

Network
stack:网络协议栈。开启/关闭UEFI网络协议栈。开启Network
stack后可以设置下面2个选项。
Ipv4
PXE
Support:开启/关闭Ipv4(互联网协议第4版)
PXE支持。
Ipv6
PXE
Support:开启/关闭Ipv6(互联网协议第6版)
PXE支持。

‘叁’ TCP/IP协议栈中TCP协议如何进行流量控制

通过窗口机制来实现。
当接收方的缓存空间开始吃紧,则在发送确认报文时,将其中的窗口值调小甚至变成0,这样就限制了发送方发送报文的速度了~

‘肆’ 如何设置堆栈空间在中断响应时哪些变量值要入栈

切换任务可以看做是一种中断服务程序指针局存器,数据寄存器是必须要保存到堆栈的,在中断任务完成之后在出栈继续工作。i/o寄存器有内部锁存功能,所以不必保存。

针对栈这种数据结构的基本操作有两种:压栈和弹出,在栈帧中包含两个标志----栈底和栈顶,其中栈顶标识着要push或pop的数据的地址,而栈底则表示栈帧中最后一个数据的内存地址。

在Win32中,寄存器esp存放着栈底指针,栈是向低地址方向生长,因此esp指向栈顶元素堆栈对比(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。

堆栈

是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。堆这个存储区存入的数据,是一种特殊的数据结构。

所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。

‘伍’ 如何增加栈(stack)空间的大小

系统自动分配大小,当当前栈的空间不足时,会自动开辟一段两倍于当前大小的空间,并将数据转移,释放当前空间。

‘陆’ 如何在internet上建立网络空间

其实~无特殊要求的话系统默认的就行了~~~若需修改:网络协议中最重要的是tcp/ip协议~右键点“网络邻居”选属性,出现“网络连接”窗口。1、若你是通过路由上网,则右键点“本地连接”属性,里面就有tcp/ip~双击就可该其属性,当然,路由器也需要设置,若需要路由器设置请再留言。2、若你是adsl拨号上网,那在网络连接窗口需要新增,窗口左边菜单里有选,根据向导设置即可。要修改协议的话在配置好宽带连接后,右键点此连接选属性,后面方法和本地连接一样。

‘柒’ 计算机网络-k8s网络

K8S网络模型设计:扁平的可连通的网络

K8S的网络是一个极其复杂的网络,如果想要用两个简单的词来描述K8S网络,那么我觉得扁平和可连通是K8S网络最大的特点(不懂隔离性)。

何为连通呢?

二层网络的连通:如果能够直接通过MAC帧直接通信的网络便是二层连通的网络,LAN就是这种网络

比如无限WIFI网络,比如以太网

三层网络的连通:如果能够通过IP报直接通信的网络便是三层连通的网络,便是三层连通

三层网络的连通分为两个部分,第一个部分是三层网络中的每一个LAN都是二层连通的,其次需要存在能够连通的路由来保证;这里可以简单回顾下三层网络通信的流程

通过路由表确定目标ip是否在链路上

如果在链路上,通过arp协议获取对应主机的mac地址,发送mac帧到链路上;

如果不在同一个链路上,通过本地路由表发送mac帧给下一跳,然后下一跳解析mac帧,分析ip报,继续路由直到最终跳到目标网络再次通过mac帧发送到目标主机或者到达ttl消失。

假如其中任何一个步骤不满足或者出问题,三层网络就无法连通

何为扁平呢?

就是希望可以在pod内直接通过IP进行互相通信而不需要在pod内部使用vpn之类的东西来连接其他pod(基础架构化),具体的可以看下k8s对网络的设计与要求。

k8s在设计其网络时,就希望网络对运行在其中的pod是透明的,因此提出了以下的一些要求与原则

k8s组网要求

所有的Pods之间可以在不使用 NAT网络地址转换 的情况下相互通信

所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信

每个Pod自己看到的自己的ip和其他Pod看到的一致

k8s网络模型设计原则

每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。

不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。

设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

而要想深入了解K8S的网络,就不得不去了解Linux操作系统中的网络以及计算机网络协议栈和一些网络技术

其中关于计算机网络协议栈道部分上次分享已经分享过了,所以本次的主题更多是Linux操作系统的网络以及一些网络技术

Linux操作系统中的网络

首先,我们来看下基本的linux网络,如下图所示

一个APP生成socket数据,然后经过网络协议栈包装IP报文,然后封装成MAC帧,在经过网络协议栈的过程中,会存在netfilters对数据进行一定的处理,同时也会存在路由的过程,

如果在同一个物理链路内,将直接通过ARP协议获取目标IP地址的MAC地址最终发送出去;

如果不在同一个物理链路则通过路由表确定下一跳的MAC地址,封装成MAC帧发送到目标地址。

在这个过程中,会根据路由表选择对应的端口,如果是lo端口,则会将帧原封不动的返回计算机网络协议栈,然后回到监听对应端口的SOCKET里。

如果是以太网端口则走以太网端口,如果是蓝牙或者无线网端口同理。

iptables与netfilters

iptables是一个用户空间的应用程序,通过该程序可以修改一些配置文件,这些文件定义了防火墙的一些行为,netfilters是操作系统内核的一部分,netfilters里有5个回调钩子会触发iptables里的规则;iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是

netfilter,它是Linux内核中实现包过滤的内部结构。

这里不具体讲述其实现的原理,仅仅列出netfilters的一些功能:

1)filter表——三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包 内核模块:iptables_filter.

2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

4)Raw表——两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

虚拟网络设备 tap/tun

TUN 和 TAP 设备是 Linux 内核虚拟网络设备,纯软件实现。TUN(TUNnel)设备模拟网络层设备,处理三层报文如 IP

报文。TAP 设备模拟链路层设备,处理二层报文,比如以太网帧。TUN 用于路由,而 TAP 用于创建网桥。OS 向连接到 TUN/TAP

设备的用户空间程序发送报文;用户空间程序可像往物理口发送报文那样向 TUN/TAP 口发送报文,在这种情况下,TUN/TAP

设备发送(或注入)报文到 OS 协议栈,就像报文是从物理口收到一样。

虚拟网络设备 veth-pairs

虚拟以太网电缆。使用双向有名管道实现。常用于不同 namespace 之间的通信,即 namespace 数据穿越或容器数据穿越。

虚拟网络设备 bridge

bridge是linux自带的虚拟交换机(网桥),其可以连接多个以太网设备,拥有智能处理MAC帧的能力,流向交换机的MAC帧将智能的被传输到相应的二层链路

网络命名空间

在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。

从用户的角度来看,我们只需使用工具ip(package is iproute2)来创建一个新的持久网络命名空间。

从系统实现来说,就是原本一个数据结构是static公共的,后来变成进程私有的,在PCB里存在一个命名空间的结构,命名空间里有着网络命名空间,网络命名空间拥有着所有跟网络相关的配置数据

默认空的网络命名空间可能只有一个未启动的lo回环网卡。

两个网络命名空间可以通过以太网揽直接连着两个网络命名空间的网卡,也可以通过以太网网桥连接。

通过以太网网桥或者以太网揽连接的两个网络命名空间只能说是在二层连通的,如果希望在三层连通,还需要给每个网络命名空间配置相应的路由表规则以及分配IP地址。

如何使用虚拟网络设备联通网络命名空间

SingleHost容器网络

none模式

本质上就是创建一个网络命名空间,里面没有路由表,也没有通过veths-pair连接任何链路,外部无法访问这个容器,容器也无法访问外部

host模式

本质上就是使用宿主机的默认网络命名空间

container模式

本质上就是将当前容器部署在另一个容器所在的网络命名空间,这样发给本地的报文最终通过回环网卡回到了本机,这是同一个网络命名空间可以互通的原因

bridge模式

桥接模式就是在这些网络命名空间通过veth-pairs连接到同一个虚拟交换机上(二层连通),同时在对应的命名空间配置对应的路由表规则,但是从图片中可以看到交换机另一端连的上网络协议栈。

也就是那些MAC帧都会被宿主机接收,但是宿主机接收并不一定会处理,比如并没有开启ip转发功能(工作于路由器模式还是主机模式),那么不是本地ip的报文都会被丢弃;或者说netfilters拒绝处理

这些奇怪的报文。

理论上,这些容器发送给其他容器的mac报文是会被虚拟交换机智能转发到对应的容器的,这是同一主机不同容器互相连通的原因

假如宿主机配备了相应的路由规则和防火墙规则,那么容器的报文说能够通过路由最终转发出去的,这也是容器访问互联网的原理

但是这种模式是没法运用在多主机的情况下,因为宿主机不知道其他宿主机里的虚拟网络的路由,当相关ip报到达宿主机时,这些ip报将会被宿主机交给默认路由(下一跳:路由器)

最终路由器会把相关的ip报丢失或者到达ttl最终丢失

MultiHost容器网络

路由方案

回顾docker的单机网络模型,我们发现多主机不能通行的原因就在于你只能给当前主机配置路由规则和防火墙规则,而其他主机并不知道这些ip在你的虚拟网络中,假如能够将这些路由信息同步到其他

宿主机,那么网络便会打通。比较直接的想法就是给每台宿主机配置路由规则。而路由规则要求下一跳必须在当前网络,所以假如宿主机是二层互联的,那么通过给这些宿主机同步这些路由规则便能够

实现一个扁平的连通的网络。

其中布置在每一台宿主机可以通过k8s的daemonSet实现,而这种数据的管理可以交给etcd来实现。

这类方案便是基于路由,基于这个方案的实现有基于静态路由的flannel的host-gateway,以及基于动态路由的calico(使用边际路由协议以及一堆深奥的名词的实现)。

下面来看看Flannel的host-gateway原理(每一台宿主机都相当于本机容器网络的路由器):

通过路由方案构建的网络,宿主机也能访问这些虚拟网络里的Pod

询问基德大佬得知国际化sit环境的k8s网络接口实现就是Flannel的Host-gateway,而我们的办公网络和集群网络之间的路由是搭建好的,所以我们应该可以直接通过podId访问pod里的服务

下面是sit环境的两个服务

跟踪路由发现符合猜想

其中10.1.9.56和10.1.1.24就是宿主机的ip,这些宿主机在一个LAN里,这些宿主机相当于虚拟网络中的路由器;

猜测我们办公网和qunhe集群在一个VLAN里(二层可达)

隧道方案

隧道方案比较典型的就是UDP和XVLAN,两者都是使用Overlay网络(覆盖网络,所谓的大二层技术);其实用隧道技术最多的是VPN应用

其中UDP是XVLAN的替代品(早期Linux没有支持XVLAN协议,通过tun/tap技术将流量引到用户空间然后解包生成包再发,因为发生在用户空间而且多次导致性能较差,所以一般不推荐,除非你的linux版本比较低没法用xvlan)

下面就简单介绍下XVLAN技术的大概原理,下图是XVLAN的报文格式,可以发现就是在高层协议的报文里塞了二层报文

其中XVLAN头里有一个关键的字段,VNID这是个24位的字段,每个虚拟的网络主机都有一个自身的VNID作为标识,理论上支持2的24次方个虚拟网络。

在docker的桥接网络里,是使用docker0网桥,在Flannel的xvlan方案里则是使用cni0作为网桥(和docker0没啥区别),主要的不同是cni网桥后面连接的是flannel.1这个网络设备,应该是一个虚拟网卡

这个网卡将原始报文包装成XVLAN报文(linux高版本支持xvlan报文)

这时需要的信息有 源nodeId,目标nodeId,源vnid,源macId,目标macId,源podId,目标podId

其中目标nodeId,目标macId这两个信息是不存在的;因此需要有个方式根据目标podId获取目标nodeId以及目标macId

因此需要记录如何根据目标podId获取目标macId以及目标nodeId即可

这些数据是可以托管在某个地方的,Flannel就是将这些信息记录在etcd上

在每个node上的flannel.1网络设备通过etcd来通过对方的podId获取nodeId和macId

这样最终报文就变成了一个源ip是源nodeIp,目标ip是目标nodeIp的IP报文了(两台宿主机三层可达)

原本经过虚拟网桥是直接连接网络协议栈,但在xvlan模式下,则改为连接一个flannel1,在flannel1中将对原始报文封装成overlay报文转发

udp模式类似,只是udp转发报文说通过tap连通到用户空间,用户空间对报文进行处理然后发送(因为多次内核态用户态切换且数据问题,性能较差,仅在不支持xvlan的低版本linux中使用)

当然xvlan是一个技术,上面只是简单介绍最简单的形式

参考:

开发内功修炼之网络篇: https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5Njg5NDgwNA==&action=getalbum&album_id=1532487451997454337&scene=173&from_msgid=2247485270&from_itemidx=1&count=3&nolastread=1#wechat_redirect

K8S知识图谱: https://zhaohuabing.com/post/2020-02-22-k8s-mindmap/

VXLAN协议原理简介: https://cizixs.com/2017/09/25/vxlan-protocol-introction/

‘捌’ 问Linux在哪儿设置栈的大小

在/etc/profile 的最后面添加ulimit -s unlimited 保存,source /etc/profile使修改文件生效

linux查看修改线程默认栈空间大小 :ulimit -s
1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M
3、可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小
4、在/etc/security/limits.conf 中也可以改变栈空间大小:
#<domain> <type> <item> <value>
* soft stack 102400
重新登录,执行ulimit -s 即可看到改为102400 即100M

‘玖’ linux 网络路径中网络协议栈有几种

1.总述
Linux中用户空间的网络编程,是以socket为接口,一般创建一个sockfd = socket(family,type,protocol),之后以该sockfd为参数,进行各种系统调用来实现网络通信功能。其中family指明使用哪种协议域(如INET、UNIX等),protocol指明该协议域中具体哪种协议(如INET中的TCP、UDP等),type表明该接口的类型(如STREAM、DGRAM等),一般设protocol=0,那么就会用该family中该type类型的默认协议(如INET中的STREAM默认就是TCP协议)。
Linux中利用mole机制,层次分明地实现了这套协议体系,并具有很好的扩展性,其基本模块构成如下:
先看右边,顶层的socket模块提供一个sock_register()函数,供各个协议域模块使用,在全局的net_family[]数组中增加一项;各个协议域模块也提供一个类似的register_xx_proto()函数,供各个具体的协议使用,在该协议域私有的xx_proto[]数组中增加一项。这两个数组中的存放的都是指针,指向的数据结构如下图所示:

很明显它们是用来创建不同类型的socket接口的,且是一种分层次的创建过程,可想而知,顶层socket_create()完成一些共有的操作,如分配内存等,然后调用下一层create;协议域内的create()完成一些该协议域内共有的初始化工作;最后具体协议中的create()完成协议特有的初始化。具体的下一节讲。
再来看上图右边的,也是顶层socket模块提供的4个函数,前两个一般由具体协议模块调用,由于协议栈与应用层的交互,具体的后面会讲到。后两个一般有协议域模块调用,用于底层设备与协议栈间的交互。但这也不绝对,如在PPPOE协议中,这4个函数都由具体协议模块调用,这是因为PPPOX协议域内的共有部分不多,各个协议间几乎独立。这4个函数的功能及所用到的数据结构,在后面具体用到时会详细说明。
2.socket插口创建
首先来看一下最终创建好的socket插口由哪些部分组成,该结构是相当庞大的,这里只给出框架:

基本属性有state(listen、accept等),flags标志(blocked等),type类型,这里family和protocol都没有了,因为它们再创建时使用过了,已经被融入到socket结构中。
File指针指向一个file结构,在Linux中一个socket也被抽象为一个文件,所以在应用层一般通过标准的文件操作来操作它。
Ops指向一个struct proto_ops结构,它是每种协议特有的,应用层的系统调用,最终映射到网络栈中具体协议的操作方法。
Sk指向一个struct sock结构,而该结构在分配空间时,多分配了一点以作为该协议的私有部分,这里包含了该协议的具体信息,内容相当多。首先是一个struct sock_common结构,包含了协议的基本信息;然后是一个sk_prot_create指针,指向一个struct proto结构体,该结构体就是第一节中所述的,用proto_regsiter()注册到内核中的,它包含应用层到协议栈的交互操作和信息(也可以说成是Appà transport layer的交互信息);然后还有一个sk_backlog_rcv函数指针,所指函数在协议栈处理完接收到的包之后调用,一般仅是把数据包放到该socket的接收队列中,等待APP读取;最后协议的私有部分里存放该协议的私有信息,如pppoe的sessionID、daddr,tcp的连接4元组等,这些信息很重要,利用它们来区分同一个协议中的多个socket。

附上出处链接:http://blog.csdn.net/vfatfish/article/details/9296885

‘拾’ 网络命名空间ip netns

namespace和cgroup是软件容器化趋势中的两个主要内核技术。简单来说,cgroup是一种对进程进行统一的资源监控和限制,控制着使用多少系统资源(CPU,内存等)。而namespace是对全局系统资源的一种封装隔离,它通过Linux内核对系统资源进行隔离和虚拟化的特性。

Linux内核2.4仅实现了mount namespace,从内核 2.6开始实现了,在内核 3.8 中才宣布完成6种类型的命名空间:Process ID  (pid)、Mount (mnt)、Network (net)、InterProcess Communication (ipc)、UTS、User ID (user)。随着Linux自身的发展以及容器技术持续发展带来的需求,会支持有新的namespace,比如在内核 4.6 中添加了Cgroup namespace。

Linux提供多个API用来操作namespace,分别是clone()、setns() 和unshare() 函数,为了确定隔离的namespace,在使用这些 API 时,通常要指定调用参数:CLONE_NEWIPC 、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS和CLONE_NEWCGROUP。

从Linux 3.8的内核开始,/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息。

pid命名空间会使得进程只能看到同一pid命名空间中的进程。mnt命名空间,可以将进程附加到自己的文件系统(如chroot)。本文只关注网络命名空间 Network (net)。

网络命名空间为命名空间内的所有进程提供了全新隔离的网络协议栈。这包括网络接口,路由表和iptables规则。通过使用网络命名空间可以实现网络虚拟环境,实现彼此之间的网络隔离,这对于云计算中租户网络隔离非常重要,Docker中的网络隔离也是基于此实现的。

备注:ip命令要以root用户身份运行。

1.新增一个网络命名空间(名称netns0)

# ip netns add netns0

从系统的角度来看,当通过clone()系统调用创建一个新进程时,传递CLONE_NEWNET标志,在新进程中创建一个全新的网络命名空间。从用户的角度来看,使用ip命令创建一个新的名为netns0的持久网络命名空间。创建命名空间后,ip命令会在/var/run/netns目录下增加一个netns0文件。

列出系统中可用的命名空间:

# ip netns show 或ip netns list

2. 网络命名空间包含自己的网络资源:接口,路由表等。默认添加的网络命名空间netns0中会自动添加一个loopback(回环)接口但要手工开启回环口lo网卡

# ip netns exec netns0 ip link set lo up

查看网络lo回环口信息:

# ip netns exec netns0 ip a

# ip netns exec netns0 ping 127.0.0.1 -c 3

1) 创建2个网络命名空间

# ip netns add netns0

# ip netns add netns1

2) 模拟创建一根网线:

2.1) 先创建1对veth虚拟网络设备

# ip link add name vnet0 type veth peer name vnet1

# ip addr show

1: vnet1@vnet0: <BROADCAST,MULTICAST, M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000

link/ether 52:42:c3:02:54:38 brd ff:ff:ff:ff:ff:ff

2: vnet0@vnet1: <BROADCAST,MULTICAST, M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000

link/ether a6:20:57:dc:c6:dd brd ff:ff:ff:ff:ff:ff

注意:这两个虚拟网络设备都属于“default” 或“global”命名空间,和物理网卡一样。

2.2) 把veth0设置到netns0命名空间,把veth1设置到netns1命名空间:

# ip link set vnet0 netns netns0

# ip link set vnet1 netns netns1

2.3) 给两个主机分别配置ip(进入命名空间启动网卡然后给网卡配置ip),然后互ping

# ip netns exec netns0 ip link set vnet0 up

# ip netns exec netns1 ip link set vnet1 up

# ip netns exec netns0 ip a add 192.168.0.2 dev vnet0

# ip netns exec netns1 ip a add 192.168.0.3 dev vnet1

# ip netns exec netns0 ping 192.168.0.3

connect: 网络不可达

2.4) 添加路由(互相配置对端ip为网关,为什么?)

# ip netns exec netns0 ip route add 192.168.0.3 dev vnet0

# ip netns exec netns1 ip route add 192.168.0.2 dev vnet1

在netns0中去ping netns1主机

# ip netns exec netns0 ping 192.168.0.3 -c 2

PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.

64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.021 ms

64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.047 ms

--- 192.168.0.3 ping statistics ---

以上仅限于同一主机上网络可达,但不同主机上的网络不通。

3) 在主机上配置ip转发,并且在 iptables 设置伪装。

ip转发指:当Linux主机存在多个网卡的时候,允许一个网卡的数据包转发到另外一张网卡。 iptables的介绍,请点我点我哦 。

3.1) 开启ip转发

echo 1 > /proc/sys/net/ipv4/ip_forward

3.2) 刷新forward规则

iptables -F FORWARD

iptables -t nat -F

3.3) 刷新nat规则

iptables -t nat -L -n

3.4) 告诉iptables伪装起来

iptables -t nat -A POSTROUTING -s  192.168.0.3/255.255.255.0 -o eth0 -j  MASQUERADE # eth0连接外网

3.5) 允许veth0和eth0之间的转发

iptables -A FORWARD -i eth0 -o veth0 -j  ACCEPT

iptables -A FORWARD -o eth0 -i veth0 -j  ACCEPT

https://zhuanlan.hu.com/p/65566171

https://blog.csdn.net/guotianqing/article/details/82356096

https://www.cnblogs.com/sparkdev/p/9365405.html 对namespace api的介绍

https://segmentfault.com/a/1190000006908272

https://man7.org/linux/man-pages/man7/namespaces.7.html

https://lwn.net/Articles/580893/