描述

在很多业务场景下,会遇上很多诡异的需求,不仅限于文章提及的需求,还有各种五花八门的需求,大部份的这些需求的产生都是来源于以前设计、规划上导致的问题。所以我们都会想尽办法为客户解决问题,维护好客户的关系。

环境信息
VM 主机A IP 网卡 网卡通途 默认路由
10.0.43.15 eth0 管理网 yes
VM 主机B IP 网卡 网卡用途 默认路由
10.0.44.63 eth0 业务网 yes
10.0.43.101 eth1 管理网 no
需求

因特殊原因。用户需要在主机A访问到10.0.44.0/24的业务网段,主机A 又不能直接使用到业务网。 所以只能利用主机B,采用nat的方式进行转发主机A业务请求访问到业务网。

实现方法

# 在主机A添加静态路由,访问10.0.44.0/24流量都从eth0出去,并且下一跳地址是10.0.43.101

$ cat >  /etc/sysconfig/network-scripts/route-eth0 << EOF
10.0.44.0/24 via 10.0.43.101 dev eth0
EOF

# 在主机B的eth1网卡进行抓包查看,发现icmp包已经过来了。

$ tcpdump -i eth1 host 10.0.44.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
08:40:09.351088 IP host-10-0-43-15 > gateway: ICMP echo request, id 21356, seq 229, length 64
08:40:10.351100 IP host-10-0-43-15 > gateway: ICMP echo request, id 21356, seq 230, length 64
08:40:11.351091 IP host-10-0-43-15 > gateway: ICMP echo request, id 21356, seq 231, length 64
08:40:12.351090 IP host-10-0-43-15 > gateway: ICMP echo request, id 21356, seq 232, length 64
08:40:13.351060 IP host-10-0-43-15 > gateway: ICMP echo request, id 21356, seq 233, length 64

# 但在主机B的eth1的网卡并没有发现icmp包, 这是什么原因?怀疑是port_security的问题和ip_forward

$ tcpdump -i eth0 host 10.0.44.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

# 关闭主机B eth0和eth1 的port_security, 在openstack 环境下的配置。

# 找到port id
$ neutron port-list | grep 10.0.43.101
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
| 648c8165-f3e6-42a4-b6cc-0a38cecc5bec | | 363b136093524567863320fa0c95b069 | fa:16:3e:8a:63:c9 | {"subnet_id": "9ff8ad43-7b53-4cc2-acbd-74ec6fed3adf", "ip_address": "10.0.43.101"} |
$ neutron port-list | grep 10.0.44.63
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
| 0b5db09f-3699-4df5-8517-01e7ff665468 | | 363b136093524567863320fa0c95b069 | fa:16:3e:f3:1e:42 | {"subnet_id": "97800cd2-06f7-4c9a-aa3b-f9b7a6fe6419", "ip_address": "10.0.44.63"} | # 关闭端口的安全组
$ openstack port set --disable-port-security --no-security-group 0b5db09f-3699-4df5-8517-01e7ff665468
$ openstack port set --disable-port-security --no-security-group 648c8165-f3e6-42a4-b6cc-0a38cecc5bec

# 主机B配置ip_forward

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发就是当主机拥有多块网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包(通常这是需要路由器来实现的功能)。

$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
EOF
$ sysctl -p

# 在主机B eth0口抓包发现包已经过来了,但是发现只有request包没有replay响应的包。仔细分析发现源IP是10.0.43.15去访问10.0.44.1肯定是不通。

$ tcpdump -i eth0 host 10.0.44.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
09:16:20.099852 IP host-10-0-43-15 > gateway: ICMP echo request, id 21418, seq 385, length 64
09:16:20.230831 IP host-10-0-43-15 > gateway: ICMP echo request, id 21449, seq 51, length 64
09:16:21.099843 IP host-10-0-43-15 > gateway: ICMP echo request, id 21418, seq 386, length 64
09:16:24.099845 IP host-10-0-43-15 > gateway: ICMP echo request, id 21418, seq 389, length 64

# 在主机B iptables配置源10.0.44.0/24地址转换成10.0.44.63出去

$ iptables -t nat -A POSTROUTING   -d 10.0.44.0/24  -o eth0 -j SNAT --to 10.0.44.63
$ iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 4 packets, 336 bytes)
pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 470 bytes)
pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 6 packets, 470 bytes)
pkts bytes target prot opt in out source destination
4 336 SNAT all -- * eth0 0.0.0.0/0 10.0.44.0/24 to:10.0.44.63

# 在主机A发现去访问10.0.44.1的icmp通了。

$ ping 10.0.44.1
PING 10.0.44.1 (10.0.44.1) 56(84) bytes of data.
64 bytes from 10.0.44.1: icmp_seq=1 ttl=253 time=1.19 ms
64 bytes from 10.0.44.1: icmp_seq=2 ttl=253 time=0.852 ms
64 bytes from 10.0.44.1: icmp_seq=3 ttl=253 time=0.809 ms
64 bytes from 10.0.44.1: icmp_seq=4 ttl=253 time=0.886 ms

[iptables] 基于iptables实现的跨网络通信的更多相关文章

  1. 使用iptables基于MAC地址进行访控

    近日完成一台基于CentOS的SVN服务器配置,由于该服务器上的文件非常重要,仅部分用户需要访问,最后决定采用iptables来做访控,并且是根据MAC地址来限制,为了便于后期维护,防火墙的配置是通过 ...

  2. 基于VMware模拟实现远程主机网络通信

    基于VMware模拟实现远程主机网络通信 目的: 基于VMware软件,模拟实现不同网段的两主机,通过路由器进行通信.两主机host A和host B分别处于VMnet6网络和VMnet7网络,都属于 ...

  3. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  4. 基于jQuery的Jsonp跨域[Get方式]

    由于目前的项目需要无刷新的跨域操作数据,整理了下自己使用的基于jQuery的Jsonp跨域[Get方式]. 代码如下: Javascript部分 $(function(){ $.ajax({ asyn ...

  5. 基于CORS的GeoServer跨域访问策略

    GeoServer的跨域访问问题,有多种解决方法,本文介绍一种基于CORS的GeoServer跨域访问方法. CORS简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cro ...

  6. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8001 -j DNAT --to-destination 172.17.0.5:8080 ! -i docker0: iptables: No chain/target/match by that name.

    在docker容器上部署项目后,启动docker容器,出现 iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dpor ...

  7. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  8. Docker iptables failed: iptables -t nat -A DOCKER -p tcp

    Dokcer网络问题 因为操作或修该过iptables导致docker容器出现如下错误: [root@mysqlserver ~]# docker restart cvnavi-centos-tomc ...

  9. iptables介绍iptables和netfilter

    随着互联网技术的方兴未艾,各种网络应用层出不穷,网络攻击.黑客入侵也成了网民畅游互联网的心头大患,互联网安全也愈加受到了人们的重视.网络防火墙,作为一种简单高效的互联网防御手段,逐渐成为了网民畅游网络 ...

随机推荐

  1. grpc基础讲解和golang实现grpc通信小案例

    grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...

  2. 集合框架-LinkedList集合(有序不唯一)

    1 package cn.itcast.p2.linkedlist.demo; 2 3 import java.util.Iterator; 4 import java.util.LinkedList ...

  3. 微信小程序入门教程之一:初次上手

    微信是中国使用量最大的手机 App 之一,日活跃用户超过3亿,月活跃用户超过11亿(2019年底统计),市场极大. 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务. ...

  4. jsp加载css失效的解决方法

    问题: 有时候大家修改了css文件里的样式,但是刷新浏览器,利用工具看样式的时候,发现样式根本没加载或者说没更新, 其实这出现的问题就是缓存的问题 解决: 如何避免发生这种事,其实很简单,只需要每次请 ...

  5. TCP可靠性

    目录 一:TCP可靠性 1.通过序列号与确认应答提高可靠性 一:TCP可靠性 简介 TCP 通过检验和.序列号.确认应答.重发控制.连接管理以及窗口控制等机制实现可靠性传输. 1.通过序列号与确认应答 ...

  6. 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试

    关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...

  7. python 小兵(3)字典

    字典 # 存储数据 字典的查找快一些# 不可哈希的,就是可变的数据 可变的数据不能哈希 不可变的数据能哈希# python3.6 版本以上 字典默认是有序的, 咱们怎么写的就怎么打印出来# 但是 出去 ...

  8. JavaScripts之迪卡算法求积(n*n)适用于SKU信息计算等场景

    迪卡算法求积(n * n) 使用 array.reduce 的方式实现 笛卡尔积算法 const arr = [ ['黑色', '白色', '蓝色'], ['1.2KG', '2.0KG', '3.0 ...

  9. 从Apache官网下载Jar包步骤

    第一步:在官网找寻需要的包 Apache网址:http://commons.apache.org/ 在官网中,可以直接看到不同jar包的分类,如下图所示: 也可以点击官网左侧栏目里的 Release, ...

  10. curl: (6) Could not resolve host: mirrors.163.com; Unknown error 服务器上解析不了域名,换成ip可以

    原因是DNS域名解析问题: 添加nameserver即可解决 echo nameserver 8.8.8.8 > /etc/resolv.conf 解释一下DNS服务 DNS(Domain Na ...