目录

Iptables概述

Iptables 组成

表(Table)

链(Chain)

数据包过滤的匹配流程

Iptables防火墙配置

iptables命令

常用管理选项

常用控制类型

匹配条件

规则的匹配

通用匹配

隐含匹配

协议端口匹配

ICMP类型匹配

显式匹配

多端口匹配

ip范围匹配

Iptables配置NAT地址转换

配置SNAT

转换为固定公网ip

iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to 转换的公网地址

转换为非固定的公网ip(动态)

配置DNAT

转换为私网ip

iptables防火墙策略的备份和恢复

上手实战操作

网络规划

要求

Iptables概述

Iptables 是一个用户空间程序,可以用于设置和管理 Linux 操作系统的内核级防火墙。它通过表、链和规则组成,可以灵活地根据不同的需求进行配置。

iptables 具有以下特点:

- Iptables 作为内核级别的防火墙,具有高效、稳定、安全等优点。 - Iptables 的表、链、规则结构非常灵活,可适应各种不同的网络环境和应用场景。 - Iptables 相对于其他防火墙工具而言比较容易学习和掌握,并且拓展性非常强。

Iptables 组成

Iptables 的核心是由表(table)、链(chain)和规则(rule)三部分组成的。

表(Table)

在 iptables 中,表是一个规则的集合,每个表都包含若干个链和一些相关的规则。常用的五种 table 如下:

- raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。

- mangle表:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。

- nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。

- filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、OUTPUT。

​ 表之间的优先级

​ 数据包到达防火墙时,规则表之间的优先顺序 ​ raw > mangle > nat > filter

链(Chain)

在 iptables 中,链是一个规则的集合,每个链都包含一些相关联的规则。

- INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。 - OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。 - FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。 - PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,用来修改目的地址,如DNAT。 - POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,用来修改源地址,如SNAT。

数据包过滤的匹配流程

入站

入站数据包从A网络发到B网络,首先发到防火墙,先后顺序经过有PREROUTING链的三个表(raw、mangle、nat),如果都是放通状态的会经过路由选择,然后根据目的地址一层一层往上送,经过有INPUT的两个表(mangle、filter),一直送到应用程序。

转发

目的地不是本机,数据包先从A网络过滤,经过PREROUTING链,看是否是自己的目的地址,如果是外网到内网需要用nat转换成内网IP,找到内网用户,经过FORWARD链进行过滤,允许放通的到达POSTROUING链,再把内网地址转换成公网,这样数据包才能回去;如果是内网往外网发顺序就是反过来。

出站

从本机的应用程序发出来, 经过路由选择,让路由知道从哪里发,先后顺序经过有OUTPUT链的四个表(raw、mangle、nat、filter),都放通后到达POSTROUING链的两个表(mangle、nat),如果没有什么转换地址,就出站。

Iptables防火墙配置

iptables命令

语法 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

链名必须大写;控制类型必须大写

选项作用-t指定表名(raw、mangle、nat、filter)-j指定控制类型

常用管理选项

选项作用-A (--append)在指定链的末尾追加一条新的规则-I (--insert)在指定链的开头插入一条新的规则;未指定序号时默认作为第一条规则-R (--replace)修改、替换指定链中的某一条规则,可指定规则序号或具体内容-P (--policy)设置指定链的默认策略-D (--delete)删除指定链中的某一条规则,可指定规则序号或具体内容-F (--flush)清空指定链中的所有规则;若未指定链名,则清空表中的所有链-L (--list)列出指定链中所有的规则;若未指定链名,则列出表中的所有链-n (--numeric)(搭配-L使用)使用数字形式显示输出结果,如显示IP地址而不是主机名-v(搭配-L使用)显示详细信息,包括每条规则的匹配包数量和匹配字节数--line-numbers(搭配-L使用)查看规则时,显示规则的序号

常用控制类型

控制类型作用ACCEPT允许数据包通过DROP直接丢弃数据包,不给出任何回应消息REJECT拒绝数据包通过,会给数据发送端一个响应信息SNAT修改数据包的源地址DNAT修改数据包的目的地址MASQUERADE伪装成—个非固定公网IP地址LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。(没有真正处理数据包)

匹配条件

匹配条件说明-p指定要匹配的数据包的协议类型-s指定要匹配的数据包的源IP地址-d指定要匹配的数据包的目的IP地址-i指定数据包进入本机的网络接口-o指定数据包离开本机做使用的网络接口--sport指定源端口号--dport指定目的端口号

规则的匹配

通用匹配

可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件。

类型选项协议匹配-p 协议名地址匹配-s 源地址 -d 目的地址(可以是IP、网段、域名、空(代表任何地址))接口匹配-i 入站网卡 -o 出站网卡

隐含匹配

某些条件,如端口、TCP标记、ICMP类型,隐含要求以特定的协议匹配作为前提。

协议端口匹配

--sport 和 --dsport 必须配合 -p 指定协议使用!!!

详细用法

类型作用--sport 1000匹配源端口是1000的数据包--sport 1000:3000匹配源端口是1000-3000的数据包--dport :3000匹配目标端口是3000及以下的数据包--dport 1000:匹配目标端口是1000及以上的数据包

ICMP类型匹配

--icmp-type 配合 -p icmp 使用,指定icmp类型(字符串或数字代码) icmp类型可用iptables -p icmp -h 查看帮助信息

类型含义Echo-Request(代码为8)请求Echo-Reply (代码为0)回显Destination-Unreachable(代码为3)目标不可达

显式匹配

要求以 -m (扩展模块)的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。

多端口匹配

-m multiport --sport 源端口列表 -m multiport --dport 目的端口列表

ip范围匹配

-m iprange --src-range 源IP范围 -m iprange --dst-range 目的IP范围

Iptables配置NAT地址转换

配置SNAT

转换为固定公网ip

iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to 转换的公网地址

转换为非固定的公网ip(动态)

iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j MASQUERADE

配置DNAT

转换为私网ip

iptables -t nat -A PREROUTING -i 连接外部网络的接口名称 -d 外部接口IP地址 -p tcp --dport 发布的端口号 -j DNAT --to-destination 服务器内部网络地址:服务实际端口号

iptables防火墙策略的备份和恢复

iptables-save > 备份文件 将修改的iptables策略导入到备份文件中 iptables-restore < /opt/iptables.bak 将备份文件中的策略还原到配置文件中 systemctl restart iptables.service 重启服务生效

上手实战操作

网络规划

内部PC1位于内网区域,地址段为: 192.168.1.0/24,pc1地址为:192.168.1.1/24,网关地址为:192.168.1.254/24

服务器S1位于服务器区域,地址段为: 192.168.2.0/24,pc1地址为:192.168.2.1/24,网关地址为:192.168.2.254/24

PC2位于互联网区域,模拟外部互联网,地址段为:10.0.0.0/8,pc2地址为:10.0.0.1/8

Linux防火墙的三块网卡为别连接不同的网络区域,地址分别为 :ens33 192.168.1.254/24;ens34 10.0.0.100/8;ens35 192.168.2.254/24

要求

内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。

内部网络服务器s1通过DNAT发布服务到互联网。

互联网主机pc2能够访问DMZ区域的服务器,但是不能够进行ping和ssh连接。

1.配置局域网

配置各网络的ip、网关,测试连通性

防火墙:

vim /etc/sysctl.conf #开启路由转发功能

# sysctl settings are defined through files in

# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.

#

# Vendors settings live in /usr/lib/sysctl.d/.

# To override a whole file, create a new file with the same in

# /etc/sysctl.d/ and put new settings there. To override

# only specific settings, add a file with a lexically later

# name in /etc/sysctl.d/ and put new settings there.

#

# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward = 1

[root@localhost sysconfig]# ip a #配置三个网卡的ip

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000

link/ether 00:0c:29:20:2d:26 brd ff:ff:ff:ff:ff:ff

altname enp2s1

inet 192.168.1.254/24 brd 192.168.1.255 scope global ens33

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe20:2d26/64 scope link

valid_lft forever preferred_lft forever

3: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000

link/ether 52:54:00:41:0d:78 brd ff:ff:ff:ff:ff:ff

inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

valid_lft forever preferred_lft forever

4: ens34: mtu 1500 qdisc fq_codel state UP group default qlen 1000

link/ether 00:0c:29:20:2d:30 brd ff:ff:ff:ff:ff:ff

altname enp2s2

inet 192.168.2.254/24 brd 192.168.2.255 scope global ens34

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe20:2d30/64 scope link

valid_lft forever preferred_lft forever

5: ens37: mtu 1500 qdisc fq_codel state UP group default qlen 1000

link/ether 00:0c:29:20:2d:3a brd ff:ff:ff:ff:ff:ff

altname enp2s5

inet 10.0.0.10/8 brd 10.255.255.255 scope global ens37

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe20:2d3a/64 scope link

valid_lft forever preferred_lft forever

配置测试pc1

#pc1

[root@localhost network-scripts]# vim ifcfg-ens33

TYPE=Ethernet

BOOTPROTO=static

NAME=ens33

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.1.1

PREFIX=24

GATEWAY=192.168.1.254

DNS1=192.168.1.8

[root@localhost network-scripts]# ping 192.168.2.254

PING 192.168.2.254 (192.168.2.254) 56(84) bytes of data.

64 bytes from 192.168.2.254: icmp_seq=1 ttl=64 time=0.453 ms

^C

配置测试srv

[root@localhost network-scripts]# vim ifcfg-ens33

TYPE=Ethernet

BOOTPROTO=static

NAME=ens33

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.2.1

PREFIX=24

GATEWAY=192.168.2.254

DNS1=192.168.2.8

~

[root@localhost network-scripts]# ifdown ens33 && ifup ens33

WARN : [ifdown] You are using 'ifdown' script provided by 'network-scripts', which are now deprecated.

WARN : [ifdown] 'network-scripts' will be removed in one of the next major releases of RHEL.

WARN : [ifdown] It is advised to switch to 'NetworkManager' instead - it provides 'ifup/ifdown' scripts as well.

WARN : [ifup] You are using 'ifup' script provided by 'network-scripts', which are now deprecated.

WARN : [ifup] 'network-scripts' will be removed in one of the next major releases of RHEL.

WARN : [ifup] It is advised to switch to 'NetworkManager' instead - it provides 'ifup/ifdown' scripts as well.

[root@localhost network-scripts]# ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000

link/ether 00:0c:29:2c:3d:1c brd ff:ff:ff:ff:ff:ff

altname enp2s1

inet 192.168.2.1/24 brd 192.168.2.255 scope global ens33

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe2c:3d1c/64 scope link

valid_lft forever preferred_lft forever

4: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000

link/ether 52:54:00:41:0d:78 brd ff:ff:ff:ff:ff:ff

inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

valid_lft forever preferred_lft forever

[root@localhost network-scripts]# ping 192.168.2.254

PING 192.168.2.254 (192.168.2.254) 56(84) bytes of data.

64 bytes from 192.168.2.254: icmp_seq=1 ttl=64 time=0.273 ms

64 bytes from 192.168.2.254: icmp_seq=2 ttl=64 time=0.266 ms

^X^C

--- 192.168.2.254 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1032ms

rtt min/avg/max/mdev = 0.266/0.269/0.273/0.016 ms

配置测试pc2

[root@localhost network-scripts]# vim ifcfg-ens33

[root@localhost network-scripts]# ifdown ens33 && ifup ens33

[root@localhost network-scripts]# ping 10.0.0.1

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.

64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.051 ms

64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.054 ms

^C

--- 10.0.0.1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1018ms

rtt min/avg/max/mdev = 0.051/0.052/0.054/0.007 ms

内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE

root@localhost ~]# iptables -t filter -A INPUT -i ens33 -s 192.168.1.1 -d 192.168.1.254 -p icmp --icmp-type echo-request -j DROP

内部网络服务器s1通过DNAT发布服务到互联网。

[root@localhost sysconfig]# iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.1:80

互联网主机pc2能够访问DMZ区域的服务器,但是不能够进行ping和ssh连接。

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type echo-request -s 10.0.0.1 -j DROP

[root@localhost ~]# iptables -A INPUT -p tcp -s 10.0.0.1 --dport 22 -j DROP