虚机中访问外网;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之后,出包和进包的一个流程

http://blog.csdn.net/lickylin/article/details/36740207
当数据到达路由器的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

时间: 2024-08-29 02:25:57

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

VMware10中的Linux系统利用NAT网络连接方式访问外网配置

一.描述 在VMware10中 提供常见的三种网络连接方式 : 1.Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,与linux下一个网卡绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力. 在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了我们真实物理网卡所在的网络上,相当于虚拟机和真实主机处于对等的地位,在网络关系上是平等的,没有谁在谁后面的问题.使用这种方式很简单,前提是你有1个以上的IP地址,这个不太适合使用. 2.na

让devstack中的vm访问外网

devstack默认会建立一个Public网络,地址为172.24.4.0/24,但是这个网络并不是运营商分配给我们的网络,所以只能通过nat的方式让devstack建立的虚拟机访问外网. br-ex和br-phy都不需要绑定到任何的物理网卡,所有网络都是内部的. 想让vm通过Public访问外部网络,需要执行如下命令: ifconfig br-ex 172.24.4.1/24 iptables -t nat -I POSTROUTING -s 172.24.4.0/24 -j MASQUERA

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

最近搭建kubernetes集群环境时遇到一个问题,CentOS7在重启后IP发生变化导致集群中etcd服务无法启动后集群环境变得不可用,针对这种情况,必须要对CentOS7设置固定IP且可以访问外网(下载镜像用). 首先关闭VMware的DHCP: 选择编辑-->虚拟网络编辑器 选择VMnet8,去掉使用本地DHCP服务将IP地址分配给虚拟机(D)选项.点击NAT 设置(S)查看一下GATEWAY地址: 设置完,点击OK就可以了. 设置CentOS静态IP: 涉及需要修改的配置文件有:   /

QT 中间断访问外网(保持3G网卡在线)

在QT中,为了实现3G网卡不连接网络时会掉线,所以定时访问外网(ping). sysytem的方式调用,同时会调用出黑色控制台窗口,并不是理想的效果 . 最终方式: 头文件包含#include <windows.h> ShellExecute(NULL, L"open", L"ping.exe", L"www.baidu.com", NULL, SW_HIDE); 最终一个参数SW_HIDE是隐藏执行,就是想要的效果. 如果改成SW_

公司内虚拟机装Linux系统且以NAT模式访问外网

在公司用VMware装centos,以NAT模式访问外网.虚拟机dhclient获取IP为192.168.202.128,因此将网关设置为192.168.202.1,但是怎么都访问不到外网.可以ping通内网. 解决方法如下: 查看虚拟机NAT设置: VMware->编辑->虚拟网络编辑器->NAT模式->NAT设置 在NAT设置界面中可查看网关地址是192.168.202.2:并不是192.168.202.1: 编辑虚拟机配置: [[email protected] ~]# vi

vmware虚拟机网络配置(物理机能用ssh连接虚拟机, 虚拟机能共享物理机网卡上外网)仅主机模式,nat模式应该也可以

1.环境: 物理机:windows7 虚拟机:centos7  ...xx.xx.x 虚拟化软件:vmware 13 2.准备阶段: vmware安装centos操作系统(easy),网卡地址简单配置,虚拟网卡连接方式先设置为“仅主机模式”. 3.物理机配置 在物理机win7中, win+r,  services.msc,  找到windows firewall 服务,启动防火墙: 在物理机win7中, 打开“网络和共享设置”,适配器设置,如果物理机用的是无线网卡上网,就在“无线网络连接”选中属

NAT静态路由内网访问外网(华为)

1,实验名称:NAT静态路由内网访问外网(华为)2,实验目的:将私有地址转换为合法的IP地址,并解决IP地址不足的问题,而且还能有效的避免来自网络外的攻击.让内网可以访问外网,而外网不可以访问内网,起到内网安全保护数据的作用:3,实验拓扑: ,配置环境:① 先准备环境 2台PC机 1台交换机4台路由器② 先将PC机配置IP地址及子网掩码和网关(网关配置在路由器R1与交换机端口)③ 在路由器R1->R2端口配置不同网段IP:R1->R2->R3共两个不同网段④ 在R1->PC上的不同

&#8203;随时笔记---修改ip访问外网

随时笔记---修改ip访问外网 Linux环境: 网卡上增加一个IP: ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0 删除网卡的第二个IP地址: ip addr del 192.168.0.1 dev eth0 这种方式增加的虚拟IP,可以通过ifconfig查看 另一种增加虚拟IP的方法(ifconfig查看不到): 增加虚拟IP: ip -f inet addr add 192.168.146.229/32 brd 192.168.146

linux内网机器访问外网代理设置

1.检查机器 在操作中发现访问外网的机器本身不能使用yum 安装软件,故需要配置yum安装源.如果可以的,这步可忽略. [[email protected] test]# lsb_release -a LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.