當前位置:首頁 » 安全設置 » 網路協議棧空間如何設置

網路協議棧空間如何設置

發布時間: 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/