当前位置: 首页 > news >正文

Linux 防火墙:iptables (二)


文章目录

    • SNAT 原理与应用
      • SNAT 应用环境
      • SNAT 原理
      • SNAT 转换前提条件
      • SNAT 格式
      • SNAT 转换规则配置
    • DNAT 原理与应用
      • DNAT 应用环境
      • DNAT 原理
      • DNAT 转换前提条件
      • DNAT 格式
      • DNAT 转换规则配置
    • iptables 规则的备份和还原
      • 导出(备份)所有表的规则
      • 导入(还原)规则
      • 使用系统默认配置文件备份和还原规则
    • 使用 tcpdump 抓取网络数据包
      • 命令格式
      • 使用示例


SNAT 原理与应用

SNAT 应用环境

SNAT(源网络地址转换)通常用于局域网内的主机共享单个公网 IP 地址接入 Internet,因为私有 IP 地址不能在 Internet 中正常路由。

在这里插入图片描述

SNAT 原理

SNAT 的工作原理是将数据包的源地址从局域网地址转换为公网 IP 地址。

SNAT 转换前提条件

  1. 局域网内各主机已正确设置 IP 地址、子网掩码、默认网关地址。
  2. Linux 网关需要开启 IP 路由转发功能。
  • 临时打开 IP 路由转发:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    

    或者:

    sysctl -w net.ipv4.ip_forward=1
    
  • 永久打开 IP 路由转发:
    编辑 /etc/sysctl.conf 文件,添加或修改以下内容:

    net.ipv4.ip_forward = 1
    

    然后,使用以下命令使修改生效:

    sysctl -p
    

SNAT 格式

SNAT (Source NAT) - 转换源地址

用于内网主机访问外网服务器时,转换数据包的源地址。

规则格式:

iptables -t nat -A POSTROUTING -s <内网源地址/网段> -o <出站网卡> -j SNAT --to <要转换的公网源地址>
  • -t nat:指定使用 nat 表。
  • -A POSTROUTING:在数据包路由后的处理链 POSTROUTING 中添加规则,适用于源地址转换(SNAT)。
  • -s <内网源地址/网段>:内网的源地址或网段,如 192.168.1.0/24
  • -o <出站网卡>:指定出站的网卡接口,如 eth0
  • -j SNAT:使用 SNAT 动作,表示源地址转换。
  • --to <要转换的公网源地址>:转换成的公网源地址,如 203.0.113.5

SNAT 转换规则配置

  1. 固定的公网 IP 地址:

    将数据包源地址转换为指定的公网 IP 地址。

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to 12.0.0.1
    

    或使用 IP 地址池:

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to-source 12.0.0.1-12.0.0.10
    

    解释:192.168.80.0/24 为内网 IP,ens36 为外网网卡,12.0.0.112.0.0.1-12.0.0.10 为外网 IP 或地址池。

  2. 非固定的公网 IP 地址(共享动态 IP 地址):

    使用 MASQUERADE 规则动态分配 IP 地址。

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j MASQUERADE
    

扩展:一个 IP 地址做 SNAT 转换,可以让 100 到 200 台内网主机实现上网。

DNAT 原理与应用

DNAT 应用环境

DNAT(目标网络地址转换)常用于在 Internet 中发布位于局域网内的服务器。

在这里插入图片描述

DNAT 原理

DNAT 的工作原理是将数据包的目的地址从公网地址转换为局域网内的服务器地址。

DNAT 转换前提条件

  1. 局域网内的服务器能够访问 Internet。
  2. 网关的外网地址有正确的 DNS 解析记录。
  3. Linux 网关需要开启 IP 路由转发功能。

编辑 /etc/sysctl.conf 文件,添加或修改以下内容:

net.ipv4.ip_forward = 1

然后使用以下命令使修改生效:

sysctl -p

DNAT 格式

DNAT (Destination NAT) - 转换目的地址

用于外网主机访问内网服务器时,转换数据包的目的地址及端口。

规则格式:

iptables -t nat -A PREROUTING -i <入站网卡> -d <原公网目的地址> -p <协议> --dport <原目的端口> -j DNAT --to <要转换的私网IP[:端口]
  • -t nat:指定使用 nat 表,nat 表用于处理网络地址转换。
  • -A PREROUTING:在数据包路由前的处理链 PREROUTING 中添加规则,适用于目标地址转换(DNAT)。
  • -i <入站网卡>:指定入站的网卡接口,如 eth0
  • -d <原公网目的地址>:原目标公网地址,需要转换的目标地址,如 203.0.113.5
  • -p <协议>:指定协议类型(如 tcpudp)。
  • --dport <原目的端口>:原目标端口,需要转换的端口号,如 80
  • -j DNAT:使用 DNAT 动作,表示目标地址转换。
  • --to <要转换的私网IP[:端口]>:要转换的内网服务器 IP 和端口,如 192.168.1.100:8080,端口部分为可选。

DNAT 转换规则配置

  1. 发布内网的 Web 服务:

    把从 ens33 进来的要访问 Web 服务的数据包的目的地址转换为 192.168.80.11

    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
    # 端口号可省
    

    或者:

    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11
    

    解释:ens33 为入站外网网卡,12.0.0.1 为外网 IP,192.168.80.11 为内网服务器 IP。

    如果要将目标地址转换为一个 IP 地址范围:

    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20
    
  2. 发布时修改目标端口:

    发布局域网内部的 OpenSSH 服务器,外网主机需使用 250 端口进行连接:

    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
    

    在外网环境中使用 SSH 测试:

    ssh -p 250 root@12.0.0.1
    

注意:使用 DNAT 时,一般要配合 SNAT 使用,才能实现响应数据包的正确返回。

扩展

  • 主机型防火墙:主要使用 INPUTOUTPUT 链,设置规则时一般要详细地指定端口。
  • 网络型防火墙:主要使用 FORWARD 链,设置规则时通常指定到 IP 地址或网段即可,很少指定到具体端口。

iptables 规则的备份和还原

导出(备份)所有表的规则

使用 iptables-save 命令将当前的 iptables 规则导出到一个文件中,以便于备份:

iptables-save > /opt/ipt.txt

导入(还原)规则

使用 iptables-restore 命令将备份的规则文件导入到系统中,实现规则的还原:

iptables-restore < /opt/ipt.txt

使用系统默认配置文件备份和还原规则

将 iptables 规则文件保存在 /etc/sysconfig/iptables 中。这样在 iptables 服务启动时,规则会自动还原:

iptables-save > /etc/sysconfig/iptables

或使用 mv 命令,替换掉默认规则文件。

  • 停止 iptables 服务会清空掉所有表的规则:

    systemctl stop iptables
    
  • 启动 iptables 服务会自动还原 /etc/sysconfig/iptables 中的规则:

    systemctl start iptables
    

使用 tcpdump 抓取网络数据包

tcpdump 是一个命令行界面的网络数据包抓取工具,可以用来分析网络通信情况。

命令格式

tcpdump 命令的一般使用格式如下:

tcpdump [协议] -i <网卡> -s 0 -c <抓包数量> [and src/dst port <端口号>] [and src/dst net <网段>] [and src/dst host <主机IP>] -w <文件名.cap>

选项说明:

  • [协议]:指定抓取的协议类型,如 tcpudpicmp 等,也可以是 iparprarp 等数据链路层协议类型。这些选项必须放在第一个参数的位置,用来过滤数据包的类型。
  • -i <网卡>:指定要监听的网卡接口,例如 ens33。只抓取经过此接口的网络数据包。
  • -s 0:设置抓包的快照长度,0 表示抓取完整的数据包。默认情况下,tcpdump 只抓取数据包的前 68 字节。
  • -c <抓包数量>:指定抓取的数据包数量,当达到该数量时停止抓包。
  • src/dst port <端口号>:指定源或目标端口号,用于过滤特定端口的数据包。可以用 ! 来排除某个端口号。
  • src/dst net <网段>:指定源或目标网络地址,用于过滤特定网段的数据包。
  • src/dst host <主机IP>:指定源或目标主机 IP 地址,用于过滤特定主机的数据包。
  • -w <文件名.cap>:将抓取的数据包保存到文件中(.cap 格式),便于后续用 Wireshark 或其他工具进行分析。
  • -t:不显示时间戳。

使用示例

示例 1:使用 tcpdump 抓取 TCP 数据包

抓取指定网络接口、协议类型、IP 范围以及端口号的基础上对数据进行过滤,并将结果保存到指定文件中用于后续的分析。

tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
  • tcp:过滤 TCP 协议的数据包。
  • -i ens33:只抓取经过接口 ens33 的数据包。
  • -t:不显示时间戳。
  • -s 0:抓取完整的数据包。
  • -c 100:只抓取 100 个数据包。
  • dst port ! 22:不抓取目标端口为 22 的数据包。
  • src net 192.168.1.0/24:只抓取源网络地址为 192.168.1.0/24 的数据包。
  • -w ./target.cap:将抓取的结果保存到 target.cap 文件中。

示例 2:抓取从 192.168.100.100 主机发送的经过 ens33 网卡的 HTTP 协议的数据包

tcpdump tcp -i ens33 and src host 192.168.100.100 and dst port 80 -s 0 -w XXX.cap
  • tcp:过滤 TCP 协议的数据包。
  • -i ens33:只抓取经过接口 ens33 的数据包。
  • src host 192.168.100.100:只抓取源主机地址为 192.168.100.100 的数据包。
  • dst port 80:只抓取目标端口为 80(HTTP 协议端口) 的数据包。
  • -s 0:抓取完整的数据包。
  • -w XXX.cap:将抓取的结果保存到 XXX.cap 文件中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JVM 一个对象是否已经死亡?
  • ubuntu64位系统无法运行32位程序的解决办法
  • 前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发
  • 【HTTP】构造HTTP请求和状态码
  • 大数据新视界 --大数据大厂之AI 与大数据的融合:开创智能未来的新篇章
  • C++——模板初阶
  • 后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)
  • 十五、差分输入运算放大电路
  • 前端web端项目运行的时候没有ip访问地址
  • 【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解
  • 20240921在友善之臂的NanoPC-T6开发板上确认宸芯的数传模块CX6602N的AT命令
  • etcd 集群搭建与测试指南
  • Linux入门学习:Linux调试器gdb使用
  • vue中 <template> 与 <template lang=“jade“>的对比,哪个性能好
  • 相机光学(三十八)——VCM(Voice Coil Motor)音圈马达
  • canvas绘制圆角头像
  • CentOS7 安装JDK
  • Consul Config 使用Git做版本控制的实现
  • Date型的使用
  • export和import的用法总结
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript异步流程控制的前世今生
  • Logstash 参考指南(目录)
  • oldjun 检测网站的经验
  • Redis学习笔记 - pipline(流水线、管道)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • ------- 计算机网络基础
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 前端知识点整理(待续)
  • 嵌入式文件系统
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我的业余项目总结
  • 【干货分享】dos命令大全
  • C# - 为值类型重定义相等性
  • ​水经微图Web1.5.0版即将上线
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #Linux(权限管理)
  • #pragma data_seg 共享数据区(转)
  • #宝哥教你#查看jquery绑定的事件函数
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #在 README.md 中生成项目目录结构
  • #职场发展#其他
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2)Java 简介
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十三)MipMap
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (算法)N皇后问题
  • (转) ns2/nam与nam实现相关的文件
  • .axf 转化 .bin文件 的方法