看下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 -->

虚机中访问外网;NAT中的POSTROUTING是怎么搞的?的更多相关文章

  1. Docker: 解决Docker无法在电信网络中访问外网

    在电信网络中,Docker在build和run时会无法访问外网,原因是docker的默认dns地址是8.8.8.8,由于众所周知的原因,我们需要改写这个地址,方法如下: 修改/etc/sysconfi ...

  2. OpenStack创建网络和虚拟机、dhcp设备、虚拟路由器、虚拟机访问外网原理分析

    创建网络和虚拟机流程: 1.创建网络和子网 背后发生了什么: Neutron让控制节点上针对此子网的dhcp(虚拟设备)启动,用于给该子网下的实例分配ip 2.生成虚拟机 背后发生了什么: 用户通过G ...

  3. docker 不能访问外网

    如果之前docker能访问外网,现在不能访问, 同时宿主机可以访问外网,那就重启docker.

  4. VirtualBox中安装的CentOS开启SSH并设置访问外网

    1.全局设置NAT网络 打开VirtualBox->管理->全局设定 网络->添加按钮->添加一个NAT网络(使用默认的就行,不用改动) 2.设置用来本机于VirtualBox ...

  5. VMWare中CentOS7 设置固定IP且能够访问外网

    最近搭建kubernetes集群环境时遇到一个问题,CentOS7在重启后IP发生变化导致集群中etcd服务无法启动后集群环境变得不可用,针对这种情况,必须要对CentOS7设置固定IP且可以访问外网 ...

  6. 利用iptables的NAT代理实现内网访问外网

    利用NAT代理实现内网访问外网 背景及原理 若局域网中的两台计算机只能有一台能够访问外网,而这两台计算机之间能相互通信,那么可以配置能访问外网的那台服务器实现路由器的功能,即实现其他机器的NAT转换, ...

  7. 在VMWare下为CentOS设置静态IP通过NAT访问外网

    一.背景 安装好的CentOS系统默认是通过DHCP自动分配地址来共享主机的IP以达到访问外网的目的,但是因为莫名的原因无法访问外网.只好改为通过静态IP的方式访问外网. 二.操作步骤 2.1 确认开 ...

  8. 本地虚拟机NAT模式下怎么设置才可以访问外网

    记:因为我要在本机虚拟机上安装Docker,结果发现虚拟机环境不能上网,是主机模式.我要调成net模式下才可以访问外网,这就需要怎么设置.下面文章记录一下. 在本机安装VMware软件后,系统中会自动 ...

  9. VMware安装Ubuntu配置NAT模式下静态IP,解决访问外网问题

    安装好VMware后,打开网络连接可以看到有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两个网络适配器,VMnet1是针对桥接 ...

随机推荐

  1. C# 变量与常量

    变量表示存储位置,变量必须有确定的数据类型.C#的类型安全的含义之一就是确保变量的存储位置容纳着合适的类型.可以将C#中的变量分为静态变量,实例变量,传值参数,引用参数,输出参数,数组参数和本地变量共 ...

  2. C#继承的多态性

    C#继承的多态性 当一个类A派生出新类B时,这个基类A在新类B中可以表现为不同的类型:用作它自己的类型.基类型,或者在实现接口时用作接口类型,我们将这种情况称为多态性. C#中的每种类型都是多态性的, ...

  3. 控制元素的div属性

    1.需求分析 改变元素的宽.高.颜色.显示.重置等属性. 2.技术分析 基础的css.html.js 3.详细分析 如图,单击按钮,改变元素属性: 3.1 HTML部分 根据视图不难发现,内容分两大不 ...

  4. JAVAWEB开发中过滤器的概述及使用

    1.什么是过滤器? 过滤器是向WEB应用程序的请求和响应添加功能的WEB服务组件 2.过滤器的作用 1)可以统一的集中处理请求和响应 2)可以实现对请求数据的过滤 3.过滤器的工作方式 4.使用场合 ...

  5. js、jquery初始化加载顺序

    // ready 这个方法只是在页面所有的DOM加载完毕后就会触发 // 方式1 $(function(){ // do something }); // 方式2 $(document).ready( ...

  6. Ubuntu安装MySQL及使用Xshell连接MySQL出现的问题(2003-Can't connect to MySql server及1045错误)

    不管在什么地方,什么时候,学习是快速提升自己的能力的一种体现!!!!!!!!!!! 以下所有的命令都是在root用户下操作(如果还没有设置root密码)如下: 安装好Ubuntu系统之后,打开终端先设 ...

  7. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  8. php-5.6.26源代码 - opcode列表

    文件 php-5.6.26/Zend/zend_vm_opcodes.h #ifndef ZEND_VM_OPCODES_H #define ZEND_VM_OPCODES_H BEGIN_EXTER ...

  9. PHP表单安全过滤和防注入 htmlspecialchars() 和test_input()

    什么是 htmlspecialchars() 函数? htmlspecialchars() 函数把特殊字符转换为 HTML 实体.这意味着 < 和 > 之类的 HTML 字符会被替换为 & ...

  10. Open source cryptocurrency exchange

    Peatio: https://github.com/peatio/peatio ViaBTC: https://github.com/viabtc/viabtc_exchange_server