Linux防火墙iptables(二)之SNAT和DNAT

2023-11-07

一、SNAT

1、概述

  • SNAT 应用环境

局域网主机共享单个公网IP地址接入Internet ,私有IP不能在Internet中正常路由

  • SNAT原理

源地址转换
修改数据包的源地址

  • SNAT转换前提条件

局域网各主机已正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发

2、开启SNAT的命令

  • 临时打开
echo 1 >/proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip forward=1
  • 永久打开
vim /etc/ sysctl. conf
net. ipv4.ip_ forward = 1				###将此行写入配置文件
 sysctl -P				                ###读取修改后的配置

3、 SNAT转换1:固定的公网IP地址

#配置SNAT策略,实现snat功能,将所有192.168.100.0这个网段的ip的源ip改为10.0.0.1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to 10.0.0.1
                                    可换成单独IP   出站外网网卡            外网IP
或
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to-source 10.0.0.1-10.0.0.10
                                     内网IP   出站外网网卡                        外网IP或地址池

4、SNAT转换2:非固定的公网IP地址(共享动态IP地址)

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE

5、实验

实验准备

  • web服务器ip:192.168.100.102(nat1)、关闭防火墙和selinux、开启http服务

  • 网关服务器内网ip:192.168.100.100(nat1);外网ip:12.0.0.1(nat2)、关闭防火墙和selinux、开启http服务

  • win10客户端ip:12.0.0.100(nat2)

  • VMware的虚拟网络编辑器中默认nat模式网段:192.168.100.0,nat2模式网段:12.0.0.0

二、DNAT

1 、DNAT应用环境

在Internet中发布位于局域网内的服务器

2、 DNAT原理

修改数据包的目的地址

3、 DNAT转换前提条件

局域网的服务器能够访问Internet

网关的外网地址有正确的DNS解析记录

Linux网关开启IP路由转发

vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1 
sysct1 -p

4、 DNAT转换1∶ 发布内网的Web服务

#把从ens33进来的要访问web服务的数据包目的地址转换为 192.168.100.102
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 80 -j DNAT --to 192.168.100.102
或
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 80-j DNAT --to-destination 192.168.100.102
					入站         外网网卡    外网ip							                内网服务器ip

5、 NAT转换2∶ 发布时修改目标端口

#发布局域网内部的OpenSSH服务器, 外网主机需使用250端口进行连接
iptables-t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp--dport 250-jDNAT --to 192.168.100.102:22

6、 在内网上配置

#在内网上安装httpd并开启服务
[root@localhost yum.repos.d]# yum install -y httpd
[root@localhost yum.repos.d]# systemctl start httpd

#关闭防火墙和selinux
[root@localhost yum.repos.d]# systemctl stop firewalld.service
[root@localhost yum.repos.d]# setenforce 0

7、 在网关服务器添加iptables规则

#先清空规则
[root@localhost yum.repos.d]#iptables -F -t nat
#添加规则
[root@localhost yum.repos.d]#iptables -t nat -A PREROUTING -i ens38 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.100.102

#查看规则
[root@localhost yum.repos.d]#iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp – 0.0.0.0/0 12.0.0.1 tcp dpt:80 to:192.168.100.102

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

8、 测试外网是否能访问内网

#在外网服务器上
[root@localhost ~]# curl 12.0.0.1
 
#在内网服务器上
[root@localhost yum.repos.d]# tail /etc/httpd/logs/access_log 
127.0.0.1 - - [02/Nov/2021:18:05:31 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"
12.0.0.100 - - [02/Nov/2021:18:19:45 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"

三、扩展

1、iptables规则的备份与还原

主机型防火墙主要使用INPUT、OUTPUT链,设置规则时一般要详细的指定到端口;
网络型防火墙主要使用FORWARD链,设置规则时很少去指定到端口,一般指定到IP地址或者到网段即可
防火墙规则的备份和还原
备份的原因:命令行设置防火墙规则之后,重启后失效,规则被清空,则直接导出备份文件即可
导出(备份)所有表的规则.
iptables-save > /opt/ipt.txt
导入:
iptables-restore < /opt/ipt.txt

2、抓包

截取服务器的网络后,下载到本地,双击自动打开wireshark查看详细信息
【上传rz,下载sz ;工具:yum -y install lrzsz】

tcpdump tcp -i ens33 -t -s 0 -C 100 and dst port ! 22 and src net 192.168.110/24 -w ./target.cap

(1)tcp: ip icmp arp rarp和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i ens33 :只抓经过接口ens33的包
(3)-t :不显示时间翟戳
(4)-s 0:抓取数据包时默认抓取长度为68字节。加上-s0后可以抓到完整的数据包
(5)-c 100:只抓取100个数据包
(6)dst port ! 22 :不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 :数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap :保存成cap文件,方便用ethereal (即wireshark)分析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux防火墙iptables(二)之SNAT和DNAT 的相关文章

  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 使用 systemctl 获取 systemd 进程的正常运行时间或停机时间?

    喜欢使用systemctl is active
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的

随机推荐

  • AI小程序——文本绘图

    文章目录 一 摘要 二 文心 ERNIE ViLG 技术原理解读 图文双向生成统一建模 三 使用教程 2 1 exe下载 2 2 获取API 2 3 软件使用 2 4 源码链接 一 摘要 在文字生成图像上 文心 ERNIE ViLG 可以根
  • 力扣第99场双周赛题目记录(复盘)

    第一题 2578 最小和分割 给你一个正整数 num 请你将它分割成两个非负整数 num1 和 num2 满足 num1 和 num2 直接连起来 得到 num 各数位的一个排列 换句话说 num1 和 num2 中所有数字出现的次数之和等
  • 解决 VMware 克隆或复制的虚拟机,同时只有一台能上网问题

    VMware 克隆或复制虚拟机后 发现不能上网 多次调试后 确定是克隆或复制的虚拟机与原虚拟机 同时只能有一台能上网 原因是 克隆或复制的虚拟机 网卡 MAC 地址一样导致 重新分配的新 MAC 地址即可 方法如下 1 打开 Vmware
  • Matlab/Simulink-单相逆变电路双闭环仿真搭建

    1 前言 Simulink零基础 单相逆变电路双闭环仿真搭建 单相逆变电路仿真 单相逆变仿真 十分钟让你掌握单相电路简单的双闭环控制 本文不讲单相逆变电路的原理和构成 只涉及如何在Simulink中实现单相逆变电路 搭建的过程在下面视频里了
  • Unity射线穿透UI解决

    unity场景中 射线是可以穿透UI的 我用过很多版本 都有这个问题 比如我现在用2020版本的unity做了个范例 我在场景中新建了一个cube名叫 我秦始皇打钱 点击这个物体就会出现log显示这个物体的名字 代码在下面 运行之后确实会弹
  • 计算机原码补码和反码的计算方法,一个数的原码,反码,补码怎么算,原码 反码 补码...

    数在计算机中是以二进制形式表示的 数分为有符号数和无符号数 原码 反码 补码都是有符号定点数的表示方法 一个有符号定点数的最高位为符号位 0是正 1是副 以下都以8位整数为例 原码就是这个数本身的二进制形式 例如 0000001 就是 1
  • Vue3+ts+element-plus 组件的二次封装-- 头部搜索条件的封装

    Vue 常用笔记 本人是一个web前端开发工程师 主要是vue框架 整理了一些Vue常用的技术 一方面是分享 一方面是做总结 今后也会一直更新 有好建议的同学欢迎评论区分享 Vue专栏 点击此处 Vue组件库专栏 点击此处 Vue2 vs
  • Unity中同时修改物体及其所有子物体层级

    简单说一下思路 首先你得判定当前物体是否有子物体 没有的话就直接设置层级 有的话就再回到1 继续判断子物体下是否还有子物体 接下来结合代码再好好理解一下 private void ChangeLayer Transform transfor
  • matlab实现牛顿下山法

    说起牛顿下山法 首先要提牛顿法 牛顿法是求解非线性方程的一个重要方法 具体可以点击牛顿法 虽然牛顿法作为一个二阶的迭代收敛方法 但是其对于函数和初始点的要求都比较高 而牛顿下山法则是有效降低这些要求的一种技巧 牛顿下山法的迭代公式如下 x
  • [C/C++] 创建后台接受命令程序

    C C 多线程时 运行时输入自定义参数 达到控制线程的目的 基础概念 线程 线程是操作系统能够进行运算调度的最小单位 它被包含在进程之中 进程包含一个或者多个线程 进程可以理解为完成一件事的完整解决方案 而线程可以理解为这个解决方案中的的一
  • 弹性布局-更优秀的Flex

    Flex布局详解 浮动布局的优缺点 图文的环绕显示 浮动元素 同行显示 适配性更好 忘记清浮动 高度坍塌 flex布局的优缺点 IE10以下不支持 用来做布局的 很方便 flex布局 flex flexible 弹性布局 移动端用的最多 P
  • LeetCode——345. 反转字符串中的元音字母

    反转字符串中的元音字母 题目 思路 代码 结果 题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 思路 没有什么难度 很简单的数组判断交换 代码 clas
  • 操作系统——启动操作系统及ucore-lab0 coding

    花了一周多时间把操作系统的课程看了一遍 晚上结课的时候尝试性地想看着笔记的标题回忆一下内容 发现 嗯 一片混沌 趁热打铁做个总结吧 辅以uCoreLab上的coding 一个走 1 操作系统的启动 未启动前 os和Bootloader都存放
  • 图形学/OpenGL/3D数学/Unity

    1 场景管理的数据结构 总结 游戏开发最常用的空间数据结构是四叉 八叉树和BVH树 而BSP树基本上只能应用于编辑器上 k d树则只能用在特殊问题应用场景 2 帧同步与状态同步 https gameinstitute qq com comm
  • lattice 包中的直方图绘制

    1 直方图 library lattice install packages nutshell library nutshell histogram DBWT DPLURAL data births2006 smpl main births
  • 记一次Swagger页面报错/error 404的排查过程

    记一次Swagger页面报错 error 404的排查过程 使用springfox swagger ui展示的页面如下 Maven引用 使用springfox swagger ui展示的页面如下 说是没有为 error这个路径指明确定的映射
  • Java中的注解和反射

    文章目录 Java中的注解和反射 一 注解 1 1注解Annotation的作用 1 2注解Annotation的格式 1 3注解Annotation在哪里使用 1 4实例 二 内置注解 三 元注解 四 自定义注解 五 静态和动态语言 5
  • 2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

    2022年中职组浙江省 网络空间安全 赛项 B 1 Windows渗透测试 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模式系统渗透测试 任务一 Windows
  • Notepad++ 文件丢失了,找回历史文件方法

    Notepad 文件丢失了 找回历史文件方法 C Users 你当前用户的用户名 AppData Roaming Notepad backup
  • Linux防火墙iptables(二)之SNAT和DNAT

    目录 一 SNAT 1 概述 2 开启SNAT的命令 3 SNAT转换1 固定的公网IP地址 4 SNAT转换2 非固定的公网IP地址 共享动态IP地址 5 实验 二 DNAT 1 DNAT应用环境 2 DNAT原理 3 DNAT转换前提条