Linux 防火墙:iptables (二)

发布于:2024-09-18 ⋅ 阅读:(70) ⋅ 点赞:(0)


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 文件中。