【iptables 实战】07 iptables NAT实验

在上一节中,我们将两个网段的机器,通过中间机器的网络转发,能达到互通。再来回顾一下这个网络连接的图
在这里插入图片描述

上一节我们在防火墙实验中,设置了主机B的的转发规则,我们先清空主机B的转发规则

[root@localhost ~]# iptables -F FORWARD

这时候,A和C也是能够互通的

一、SNAT

查看一下主机B的两个网卡

[root@localhost ~]# ifconfigenp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.56.106  netmask 255.255.255.0  broadcast 192.168.56.255inet6 fe80::db6e:9a5d:7349:6075  prefixlen 64  scopeid 0x20<link>ether 08:00:27:c4:c4:34  txqueuelen 1000  (Ethernet)RX packets 2132  bytes 878351 (857.7 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1802  bytes 417950 (408.1 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.1.0.11  netmask 255.255.0.0  broadcast 10.1.255.255inet6 fe80::6f7e:d360:eb44:50d2  prefixlen 64  scopeid 0x20<link>ether 08:00:27:21:7b:f0  txqueuelen 1000  (Ethernet)RX packets 3199  bytes 310848 (303.5 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 3080  bytes 963634 (941.0 KiB)        

主机C ping 主机A

[root@test-c ~]# ping 192.168.56.104
PING 192.168.56.104 (192.168.56.104) 56(84) bytes of data.
64 bytes from 192.168.56.104: icmp_seq=1 ttl=63 time=1.60 ms
64 bytes from 192.168.56.104: icmp_seq=2 ttl=63 time=1.81 ms
64 bytes from 192.168.56.104: icmp_seq=3 ttl=63 time=1.83 ms
64 bytes from 192.168.56.104: icmp_seq=4 ttl=63 time=1.61 ms

主机A tcpdump查看icmp报文

[root@localhost ~]# tcpdump -i enp0s8 -nn icmp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
03:25:52.191447 IP 10.1.0.10 > 192.168.56.104: ICMP echo request, id 2681, seq 8, length 64
03:25:52.191525 IP 192.168.56.104 > 10.1.0.10: ICMP echo reply, id 2681, seq 8, length 64
03:25:53.192233 IP 10.1.0.10 > 192.168.56.104: ICMP echo request, id 2681, seq 9, length 64

可以发现是直连的,IP没有变化

然后开启主机B的NAT后,再在主机A上查看tcpdump的报文

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.56.106

主机A上看到的是106主机B,请求到本机

[root@localhost ~]# tcpdump -i enp0s8 -nn icmp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
03:23:08.675793 IP 192.168.56.106 > 192.168.56.104: ICMP echo request, id 2663, seq 1, length 64
03:23:08.675845 IP 192.168.56.104 > 192.168.56.106: ICMP echo reply, id 2663, seq 1, length 64
03:23:09.677209 IP 192.168.56.106 > 192.168.56.104: ICMP echo request, id 2663, seq 2, length 64
03:23:09.677292 IP 192.168.56.104 > 192.168.56.106: ICMP echo reply, id 2663, seq 2, length 64

二、DNAT

在主机B192.168.56.106 上设置转发规则如下

[root@localhost ~]# iptables -t nat -I PREROUTING -d 192.168.56.106 -p tcp --dport 801 -j DNAT --to-destination 10.1.0.10:80

即访问106机器的801端口,会将数据转发到C主机的80端口上
C主机开启httpd服务
这时候,主机A尝试访问一下

[root@localhost ~]# curl -X GET http://192.168.56.106:801

可以访问到数据
同时在主机B上tcpdump查看一下报文

[root@localhost ~]# tcpdump -i enp0s8 -p tcp port 801 -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
05:06:16.442102 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [S], seq 2976570142, win 29200, options [mss 1460,sackOK,TS val 3328446820 ecr 0,nop,wscale 7], length 0
05:06:16.443153 IP 192.168.56.106.801 > 192.168.56.104.35408: Flags [S.], seq 2959350184, ack 2976570143, win 28960, options [mss 1460,sackOK,TS val 1165808246 ecr 3328446820,nop,wscale 7], length 0
05:06:16.445879 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [.], ack 1, win 229, options [nop,nop,TS val 3328446823 ecr 1165808246], length 0
05:06:16.446365 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [P.], seq 1:83, ack 1, win 229, options [nop,nop,TS val 3328446823 ecr 1165808246], length 82
05:06:16.447290 IP 192.168.56.106.801 > 192.168.56.104.35408: Flags [.], ack 83, win 227, options [nop,nop,TS val 1165808249 ecr 3328446823], length 0
05:06:16.448087 IP 192.168.56.106.801 > 192.168.56.104.35408: Flags [.], seq 1:14481, ack 83, win 227, options [nop,nop,TS val 1165808250 ecr 3328446823], length 14480
05:06:16.448587 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [.], ack 14481, win 455, options [nop,nop,TS val 3328446826 ecr 1165808250], length 0
05:06:16.450968 IP 192.168.56.106.801 > 192.168.56.104.35408: Flags [.], seq 14481:37649, ack 83, win 227, options [nop,nop,TS val 1165808252 ecr 3328446826], length 23168
05:06:16.451369 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [.], ack 37649, win 817, options [nop,nop,TS val 3328446829 ecr 1165808252], length 0
05:06:16.451483 IP 192.168.56.106.801 > 192.168.56.104.35408: Flags [P.], seq 37649:43441, ack 83, win 227, options [nop,nop,TS val 1165808253 ecr 3328446826], length 5792
05:06:16.452178 IP 192.168.56.104.35408 > 192.168.56.106.801: Flags [.], ack 43441, win 907, options [nop,nop,TS val 3328446829 ecr 1165808253], length 0

三、动作MASQUERADE

上文中,我们已经描述了SNAT,也就是源地址转换,那么我们现在来认识一个与SNAT类似的动作:MASQUERADE
当我们拨号网上时,每次分配的IP地址往往不同,不会长期分给我们一个固定的IP地址,如果这时,我们想要让内网主机共享公网IP上网,就会很麻烦,因为每次IP地址发生变化以后,我们都要重新配置SNAT规则,这样显示不是很人性化,我们通过MASQUERADE即可解决这个问题,MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址,示例如下:

[root@localhost ~]# iptables -t nat -I POSTROUTING -s 10.1.0.0/24 -o enp0s8 -j MASQUERADE

如上图所示,我们指定,通过外网网卡出去的报文在经过POSTROUTING链时,会自动将报文的源地址修改为外网网卡上可用的IP地址,这时,即使外网网卡中的公网IP地址发生了改变,也能够正常的、动态的将内部主机的报文的源IP映射为对应的公网IP。

可以把MASQUERADE理解为动态的、自动化的SNAT,如果没有动态SNAT的需求,没有必要使用MASQUERADE,因为SNAT更加高效。

四、动作REDIRECT

使用REDIRECT动作可以在本机上进行端口映射
比如,将本机的8081端口映射到本机的80端口上
主机A(192.168.56.104)做如下设置
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8081 -j REDIRECT --to-ports 80
经过上述规则映射后,当别的机器访问本机的8081端口时,报文会被重定向到本机的80端口上。
当其它主机访问下面的地址时(104主机80端口提供服务),能成功请求
[root@test-c ~]# curl -X GET http://192.168.56.104:8081
REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。

五、小结

为了方便以后回顾,我们对上述命令进行总结。

如果想要NAT功能能够正常使用,需要开启Linux主机的核心转发功能。

echo 1 > /proc/sys/net/ipv4/ip_forward
  • SNAT相关操作
    配置SNAT,可以隐藏网内主机的IP地址,也可以共享公网IP,访问互联网,如果只是共享IP的话,只配置如下SNAT规则即可。
    iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP

如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将10.1网段的报文的源IP修改为eth0网卡中可用的地址。
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE

  • DNAT相关操作
    配置DNAT,可以通过公网IP访问局域网内的服务。
    注:理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可达到DNAT效果。
    但是在测试DNAT时,对应SNAT规则也需要配置,才能正常DNAT,可以先尝试只配置DNAT规则,如果无法正常DNAT,再尝试添加对应的SNAT规则,SNAT规则配置一条即可,DNAT规则需要根据实际情况配置不同的DNAT规则。
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 
10.1.0.1:80iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP

在本机进行目标端口映射时可以使用REDIRECT动作。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

配置完成上述规则后,其他机器访问本机的80端口时,会被映射到8080端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147579.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合es

springboot整合es 1.引入依赖&#xff08;springboot2.3.x版本可以兼容elasticsearch7.x版本。&#xff09; <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.3.6.R…

记录:Unity脚本的编写2.0

目录 前言控制方法键盘控制鼠标控制虚拟控制器控制 平移和旋转 前言 前面记录了一些简单的unity脚本用来控制unity中对象模型的移动&#xff08;或者不能叫控制&#xff0c;毕竟它是开启之后自己在跑的&#xff09;&#xff0c;那么让模型可以根据用户的操作来进行变化的方法自…

vue 使用 创建二维数组响应数据 渲染 echarts图标

目前我遇到的情况就是用动态的二维数组数据渲染echarts图标&#xff0c;我们从后端收到的接口一般是个一维数组&#xff0c;需要手动构建并且保证响应式。接下来我做了个案例 一、案例总逻辑 1. 先创建一个vue项目 2. 添加 echarts依赖 3. 模拟数据请求&#xff0c;构建二维数组…

串口数据包收发

数据包 把属于同一批的数据进行打包和分割&#xff0c;方便接收方进行识别 HEX数据包 思路&#xff1a;一个数据规定四个字节&#xff0c;以0xFF为包头&#xff0c;0xFE为包尾&#xff0c;当检测到0xFF时&#xff0c;接下来四个数据就是数据&#xff0c;接收到0xFE时&#x…

Win10系统中GPU深度学习环境配置记录

运行环境 系统&#xff1a;Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡&#xff1a;NVIDIA GeF…

pycharm一直没显示运行步骤,只是出现waiting for process detach

pycharm一直没显示运行步骤&#xff0c;只是出现waiting for process detach&#xff1b;各类音乐免费软件&#xff1b;最棒的下载torch-geometric-CSDN博客&#xff08;不太推荐&#xff09;我强烈推荐这个&#xff1a;_waiting for process detachhttps://blog.csdn.net/weix…

2023年汉字小达人市级比赛在线模拟题来了,四种练习助力好成绩

2023年第十届汉字小达人比赛区级自由报名活动已于9月30日结束&#xff0c;尽管最终晋级市级比赛的名单还需要在11月初发布&#xff08;有一些学校的校级选拔还没结束&#xff09;&#xff0c;但是许多小朋友已经开始准备市级比赛了。 根据往年的经验&#xff0c;实际比赛也是在…

Android 活动Activity

目录 一、启停活动页面1.1 Activity的启动和结束1.2 Activity的生命周期1.3 Activity的启动模式 二、在活动之间传递消息2.1 显式Intent和隐式Intent2.2 向下一个Activity发送数据2.3 向上一个Activity返回数据 三、补充附加信息3.1 利用资源文件配置字符串3.2 利用元数据传递配…

国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!

大家好&#xff0c;CoCode开发云旗下Co-Project V3.6智能项目管理平台正式发布&#xff0c;平台新增功能点锁定功能、敏捷开发模式新增估算板块和两种估算方式。 功能点锁定功能进一步提高了项目估算的灵活性和准确性&#xff0c;有利于提高项目估算效率&#xff1b;而敏捷开发…

数据分析:人工智能篇

文章目录 第三章 数据可视化库matplotlib3.1 matplotlib基本绘图操作3.2 plot的线条和颜色3.3 条形图分析3.4 箱型图分析3.5 直方图分析3.6 散点图分析3.7 图表的美化 第四章 数据预测库Sklearn4.1 sklearn预测未来4.2 回归数据的预测4.2.1 回归数据的切分4.2.2 线性回归数据模…

【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题&#xff1f; HTAP 云数据库VS云原生数据库

《C++ primer plus》精炼(OOP部分)——对象和类(8)

学习是一项持续的投资&#xff0c;永远不会白费——本杰明富兰克林 文章目录 第13章&#xff1a;类继承一个基类和派生类公有继承的逻辑关系&#xff1a;is-a多态公有继承 第13章&#xff1a;类继承 一个基类和派生类 从一个类派生出另一个类时&#xff0c;原始类称为基类&am…

怎么通过portainer部署一个vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

Codeforces Round 665 (Div. 2) (A-F)

A.Problem - A - Codeforces &#xff08;1&#xff09;题意 给你个X轴&#xff0c;初始A点在n这个位置&#xff0c;O在源点0&#xff0c;问你要把B放在哪才能让|AB-BO| k&#xff0c;最小化A需要移动多少次。 &#xff08;2&#xff09;思路 直接分情况套路即可。 &#xff0…

MySQL约束

文章目录 简单介绍主键约束添加单列主键多列主键删除主键 自增长约束(auto_increment)语法&#xff1a;指定自增字段初始值 非空约束唯一约束(unique)默认约束(default)零填充约束(zerofill) 简单介绍 概念&#xff1a;表中数据的约束条件 作用&#xff1a;表在设计的时候加入…

用AI原生向量数据库Milvus Cloud 搭建一个 AI 聊天机器人

搭建聊天机器人 一切准备就绪后,就可以搭建聊天机器人了。 文档存储 机器人需要存储文档块以及使用 Towhee 提取出的文档块向量。在这个步骤中,我们需要用到 Milvus。 安装轻量版 Milvus Lite,使用以下命令运行 Milvus 服务器: (chatbot_venv) [egoebelbecker@ares milvus_…

Python与Scrapy:构建强大的网络爬虫

网络爬虫是一种用于自动化获取互联网信息的工具&#xff0c;在数据采集和处理方面具有重要的作用。Python语言和Scrapy框架是构建强大网络爬虫的理想选择。本文将分享使用Python和Scrapy构建强大的网络爬虫的方法和技巧&#xff0c;帮助您快速入门并实现实际操作价值。 一、Pyt…

QSS之QComboBox

QComboBox在Qt开发过程中经常使用&#xff0c;默认的下载列表风格达不到设计师的要求&#xff0c;本篇介绍基本的QComboBox的qss设置。 属性意思QComboBoxQComboBox基本样式QComboBox:editable右边可选择按钮QComboBox:!editable, QComboBox::drop-down:editable不可编辑或下拉…