虚机中访问外网;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.mzph.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; 水平分表平均的将数据按照特定方式分配到多个表中。理论上每个表的访问频次和数据量都是同一水平…