虛機中訪問外網;NAT中的POSTROUTING是怎么搞的?

看下docker中是怎么配置的網絡

在虛機中訪問外網:設定了qemu,在主機上添加路由:sudo iptables -t nat -I POSTROUTING -s 192.168.1.110 -j SNAT --to-source 192.168.0.108

設置了這句話就可以訪問外網了。

設置了兩個虛擬機:

tap0 (192.168.129.1) --->

tap1 (192,168.130.1) --->

增加nat的NAT的表項設置: sudo iptables -t nat -I POSTROUTING -s 192.168.128.0/20 -j SNAT --to-source 192.168.0.108

同時去訪問我的云主機:121.X.X.X,從兩個主機中都能ping得通,這說明在NAT記錄了這個地址,記錄著

兩個典型包:

192.168.129.110 --->云主機?? ( 192.168.0.108 ---> 云主機)

192.168.130.110 --->云主機?? ( 192.168.0.108 ---> 云主機)

NAT內部是怎么記錄的這個轉換?是記錄咋的?從云主機IP中回來了一個包,目的地址是192.168.0.108,怎么分別分流到 192.168.129.110 和 192.168.130.110 兩個 IP地址中。

難道是端口的信息在里面?接受數據包的流程

#0  icmp_rcv (skb=0xffff88007c9efc00) at net/ipv4/icmp.c:973
#1  0xffffffff816d97af in ip_local_deliver_finish (net=0xffffffff81ed8680 <init_net>, sk=<optimized out>, skb=0xffff88007c9efc00) at net/ipv4/ip_input.c:216
#2  0xffffffff816d9e45 in NF_HOOK_THRESH (thresh=<optimized out>, okfn=<optimized out>, out=<optimized out>, in=<optimized out>, skb=<optimized out>, sk=<optimized out>, net=<optimized out>, hook=<optimized out>, pf=<optimized out>)at ./include/linux/netfilter.h:232
#3  NF_HOOK (okfn=<optimized out>, out=<optimized out>, in=<optimized out>, skb=<optimized out>, sk=<optimized out>, net=<optimized out>, hook=<optimized out>, pf=<optimized out>)at ./include/linux/netfilter.h:255
#4  ip_local_deliver (skb=0xffff88007c9efc00)at net/ipv4/ip_input.c:257
#5  0xffffffff816d9a7b in dst_input (skb=<optimized out>)at ./include/net/dst.h:507
#6  ip_rcv_finish (net=0xffffffff81ed8680 <init_net>, sk=<optimized out>, skb=0xffff88007c9efc00)at net/ipv4/ip_input.c:396
#7  0xffffffff816da11e in NF_HOOK_THRESH (thresh=<optimized out>, okfn=<optimized out>, out=<optimized out>, in=<optimized out>, skb=<optimized out>, sk=<optimized out>, net=<optimized out>, hook=<optimized out>, pf=<optimized out>)at ./include/linux/netfilter.h:232
#8  NF_HOOK (okfn=<optimized out>, out=<optimized out>, in=<optimized out>, skb=<optimized out>, sk=<optimized out>, net=<optimized out>, hook=<optimized out>, pf=<optimized out>)at ./include/linux/netfilter.h:255
#9  ip_rcv (skb=0xffff88007c9efc00, dev=0xffff88007c530000, pt=<optimized out>, orig_dev=<optimized out>)at net/ipv4/ip_input.c:487
#10 0xffffffff81684eea in __netif_receive_skb_core (skb=0xffff88007c9efc00, pfmemalloc=<optimized out>)at net/core/dev.c:4211
#11 0xffffffff816878cd in __netif_receive_skb (skb=<optimized out>)at net/core/dev.c:4249
#12 0xffffffff8168793d in netif_receive_skb_internal (skb=0xffff88007c9efc00) at net/core/dev.c:4277
#13 0xffffffff81688582 in napi_skb_finish (skb=<optimized out>, ret=<optimized out>) at net/core/dev.c:4626
---Type <return> to continue, or q <return> to quit---
#14 napi_gro_receive (napi=0xffff88007c530b70, skb=0xffff88007c9efc00)at net/core/dev.c:4658
#15 0xffffffff81532db1 in e1000_receive_skb (skb=<optimized out>, vlan=<optimized out>, status=<optimized out>, adapter=<optimized out>)at drivers/net/ethernet/intel/e1000/e1000_main.c:4035
#16 e1000_clean_rx_irq (adapter=0xffff88007c5308c0, rx_ring=<optimized out>, work_done=<optimized out>, work_to_do=<optimized out>)at drivers/net/ethernet/intel/e1000/e1000_main.c:4491
#17 0xffffffff81531bb0 in e1000_clean (napi=0xffff88007c530b70, budget=64) at drivers/net/ethernet/intel/e1000/e1000_main.c:3836
#18 0xffffffff8168968a in napi_poll (repoll=<optimized out>, n=<optimized out>) at net/core/dev.c:5158
#19 net_rx_action (h=<optimized out>) at net/core/dev.c:5223
#20 0xffffffff8187c0d9 in __do_softirq () at kernel/softirq.c:284
#21 0xffffffff81058f70 in invoke_softirq () at kernel/softirq.c:364
#22 irq_exit () at kernel/softirq.c:405
#23 0xffffffff8187be94 in exiting_irq ()at ./arch/x86/include/asm/apic.h:659
#24 do_IRQ (regs=0xffffc9000006be08) at arch/x86/kernel/irq.c:251
#25 0xffffffff8187a4bf in common_interrupt ()at arch/x86/entry/entry_64.S:520
#26 0xffffc9000006be08 in ?? ()
#27 0x0000000000000000 in ?? ()

?設置完SNAT后接收icmp包: NAT是

當服務器14.17.88.99回復了一個數據包后(src=14.17.88.99 dst=115.22.112.12),進入到wan側接口的PRE_ROUTING鏈時,
則在調用其nat相關的hook函數后,會調用函數ip_nat_packet獲取到 origin tuple 值,然后再根據 origin tuple,計算出反方向的tuple,
即為new_tuple.src = 14.17.88.99 new_tuple.dst = 192.168.1.123,然后就會根據這個新的tuple修改其目的ip地址,
修改后的數據包的目的地址即為192.168.1.123 。然后再查找路由,將數據發送到正常的lan口。這就是nat的De-SNAT

?路由地址:

ipt_do_table -->

nf_nat_ipv4_fn

?在nf_nat_ipv4_fn函數中,首先上來是:nf_ct_get,ct: conntrack, 其中涉及到的數據結構有:

ip_conntrace_info / nf_conn_nat

下面的鏈接中有一個,詳細解釋了當設置SNAT之后,出包和進包的一個流程

?

當數據到達路由器的wan0口,進入到PRE_ROUTING時,會先建立一個nf_conn結構,和兩個nf_conntrack_tuple(origin 與reply)

問題

1)prerouting 在哪里?

2)postrouting的代碼在哪里?

nf_conntrack_l3proto_ipv4_init 初始化的啥東西?

鏈接跟蹤正是在相應的函數中注冊了相應的函數:nf_conntrack_l3proto_ipv4_init函數,

ipv4_conntrack_in -->

轉載于:https://www.cnblogs.com/honpey/p/8454236.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453451.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Fragment結合ViewPager之懶加載

什么是懶加載&#xff1f;為什么要用懶加載&#xff1f;### 1、什么是懶加載 懶加載就是當ViewPager和Fragment結合在一起使用時&#xff0c;Fragment呈現在用戶面前時才加載數據&#xff0c;當其從未被呈現在用戶面前時&#xff0c;不會執行加載數據的代碼。這就是我所理解的懶…

WCF和webservice的區別

微軟論壇的斑竹回答如下&#xff1a; 腦內&#xff1a;果然是高大上啊 1.WebService&#xff1a;嚴格來說是行業標準&#xff0c;不是技術&#xff0c;使用XML擴展標記語言來表示數據&#xff08;這個是夸語言和平臺的關鍵&#xff09;。微 軟的Web服務實現稱為ASP.NET Web Ser…

職場不得不明白的十大定律

帕金森定律 美國著名歷史學家諾斯古德?帕金森通過長期調查研究&#xff0c;寫了一本名叫《帕金森定律》的書&#xff0c;他在書中闡述了機構人員膨脹的原因及后果&#xff1a;一個不稱職的官員&#xff0c;可能有三條出路。第一是申請退職&#xff0c;把位子讓給能干的人&am…

php控制器教程,laravel基礎教程 -- 控制器

HTTP 控制器簡介控制器允許你將相應的路由業務邏輯封裝在控制器類中進行有效的管理&#xff0c;這樣你不必將所有的路由邏輯集中到routes.php文件中&#xff0c;導致代碼的臃腫與難以維護。所有的控制器類都被存儲在app/Http/Controllers目錄中.基本控制器一個基本的控制器應該…

org.apache.jasper.JasperException: Unable to compile class for JSP:

報錯信息&#xff1a; org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

關于自增自減運算&#xff0c;很多書籍沒有把問題講清楚,在C語言里是這樣的&#xff1a; 1.后置運算&#xff1a;k表示先運算&#xff0c;后自加。 意思是遇到k了&#xff0c;我先把當前的k的值拿來參加運算&#xff0c;后面再去管它的自加。 那么&#xff0c;“后面”后到什么…

什么樣的項目經歷會讓面試官眼前一亮

很多同學都問過我類似的問題&#xff1a; 咱們《C語言也能干大事》中講的自己動手寫windows優化大師、自己動手寫計算器等東西只是寫著玩的小玩具而已&#xff0c;這些能用來以后找工作時寫到簡歷中的作品嗎&#xff1f;看別人的簡歷寫的“圖書管理系統”、“教務選課系統”多有…

matlab采樣頻譜,Matlab對采樣數據進行頻譜分析

使用Matlab對采樣數據進行頻譜分析1、采樣數據導入Matlab采樣數據的導入至少有三種方法。第一就是手動將數據整理成Matlab支持的格式&#xff0c;這種方法僅適用于數據量比較小的采樣。第二種方法是使用Matlab的可視化交互操作&#xff0c;具體操作步驟為&#xff1a;File --&g…

鏈表和順序表的一些區別

順序表與鏈表是非常基本的數據結構&#xff0c;它們可以被統稱為線性表。 線性表&#xff08;Linear List&#xff09;是由 n&#xff08;n≥0&#xff09;個數據元素&#xff08;結點&#xff09;a[0]&#xff0c;a[1]&#xff0c;a[2]…&#xff0c;a[n-1] 組成的有限序列。…

ANCS推送簡介

總體原理 ANCS通過藍牙BLE 4.0實現&#xff0c;僅支持iPhone 4S及以上且系統版本在IOS 7以上的手機&#xff0c;同時在外設端需要支持藍牙4.0協議。 1、外設端進行廣播&#xff0c;手機打開藍牙&#xff0c;搜索外設&#xff0c;連接外設&#xff0c;之后進行綁定&#xff08;這…

好記性不如爛筆頭,記錄幾個常用的Linux操作

作者&#xff1a;老王Shell公共函數庫Linux系統里有一些公共的Shell函數庫可供使用&#xff0c;最重要的是/etc/rc.d/init.d/functions&#xff0c;在/etc/init.d目錄下有很多腳本都用到了這個函數庫&#xff0c;里面提供了很多有用的方法&#xff0c;比如&#xff1a;killproc…

用matlab簡單電路模型,基于MATLAB的電路模型仿真應用

基于MATLAB的電路模型仿真應用實驗指導書一、實驗目的1、掌握采用M文件及SIMULINK對電路進行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模塊集的調用、設置方法。3&#xff0e;進一步熟悉M腳本文件編寫的方法和技巧。二、實驗原理1、通過M文件實現電路仿真的一般仿真步驟為&…

春節期間小游戲同時在線人數最高達2800萬人/小時

微信官方發布2018年春節期間微信數據報告&#xff1a;除夕至初五&#xff0c;總共有2,297億條微信消息&#xff0c;28億條微信朋友圈成功發出&#xff0c;音視頻通話總時長175億乙分鐘。其中&#xff0c;90后用廣的消息發送量占總量的42.5%&#xff0c;80后用戶25.9%&#xff0…

C語言中* 和

&x是對x變量取地址&#xff0c;也就是返回的是x的地址。 int *i;這里面的*說明變量i是一個指針&#xff0c;存的是一個地址。 而 *i整體代表的是一個數值&#xff0c;例如可以int *i 5 這里整體的*i代表的是5&#xff0c;而i代表的是這個值存儲的地址

餐館的故事-淺析職責鏈模式

我們在餐館吃飯的時候&#xff0c;一般都是在拿到菜單后&#xff0c;選擇喜歡的菜&#xff0c;然后通知服務員。服務員會將我們的定單交給大廚&#xff0c;大廚可能會親自去做這道菜&#xff0c;也可能安排給小廚來做&#xff0c;總之&#xff0c;我們不用擔心他們沒有人做菜&a…

JDBC數據對象存儲

一&#xff1a;將查詢的結果生成對象&#xff0c;儲存在數組中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

個人工作13年的一些人生真實領悟

此文不定期的更新&#xff0c;想起來就寫一些&#xff0c;我都忘了我曾經會過什么了。你可能會在許多的文章里看到類似的&#xff0c;但這些是我個人的真實體會。 1 技術服從于業務 此問題以前的一個文章提過&#xff0c;不再多說。 適用于大多數對技術的盲目崇拜者。在絕大…

matlab非齊次方程組的通解,用matlab求非齊次線性方程組的通解?

先向大家介紹一下非齊次線性方程組。所謂非齊次線性方程組就是方程組等號右邊的常數項不全為零的線性方程組。全部等于零時&#xff0c;就稱為齊次線性方程組。下面我們就講解一下如何利用matlab快速求非齊次線性方程組的通解。工具/材料matlab電腦操作方法01線性方程組Axb的求…

Linux 終端仿真程序Putty

PuTTY是一個Telnet、SSH、rlogin、純TCP以及串行接口連接軟件。較早的版本僅支持Windows平臺&#xff0c;現在的版本中開始支持各類Unix平臺。 用linux作為桌面系統&#xff0c;身為工程師很多時候需要通過Telnet、SSH協議進行遠程管理&#xff0c;通過串口進行設備配置。Putty…

Mysql 數據庫水平分表 存儲過程

數據庫存儲量達到一定程度的時候&#xff0c;就需要進行分表以減輕檢索的消耗。 常用的分表方式包括水平和垂直分表。本次進行的是按照uid進行水平分表。 ##分表思路&#xff1a; 水平分表平均的將數據按照特定方式分配到多個表中。理論上每個表的訪問頻次和數據量都是同一水平…