Iptables防火墙基础讲解

2022-09-28 20:11:49 浏览数 (2)

[TOC]

0x00 快速入门

描述:iptables是常见于linux系统下的应用层防火墙也就是我们所说的软防火墙,从逻辑上隔离开来有效的避免了恶意攻击,还能进行访问过滤;所以使用防火墙正是强有力的防护措施之一。

1) Linux防火墙基础知识: 作为隔离内外网、过滤非法数据的有力屏障,防火墙通常按实现环境的不同分为硬件防火墙和软件防火墙。

  • 硬件防火墙是功能专一的硬件设备,具有比较全面的功能,其工作效率较高,但是加个昂贵,通常只应用于非常重要的主干网络节点
  • 软件防火墙的功能是由操作系统或软件程序实现的,可以在Linux或者Windows等系统平台构建软件防火墙。软件防火墙的价格优势比较明显,配置也相对灵活,如果设置得当,同样可以实现硬件防火墙具有的功能和效率。

Linux的防火墙体系:

  • 1.主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤(filter)防火墙(或称网络层防火墙)
  • 2.基于内核编码实现,因此具有非常稳定的性能和高效率,也因此被更加广泛采纳和应用

2) Linux防火墙发展历史 linux内核从很早的时候就实现了网络防火墙的功能,并为用户提供了管理防火墙规则的命令工具。

  • 在2.0版本的内核中,包过滤机制是ipfw,管理防火墙规则的命令工具是ipfwadm。
  • 在2.2版本的内核中,包过滤机制是ipchain,管理防火墙规则的命令工具是ipchains(英 [tʃeɪn],n.链子,链条; 连锁,连续; 拘束; 连锁店或旅馆系列的事物;)
  • 在2.4版本的内核开始,包过滤机制是netfiter,管理防火墙的命令工具是iptables。

3)netfiter与iptables 主要区别如下 在许多关于防火墙的资料中,netfiter和iptables通常都可以用来指Linux防火墙,往往容易引起混淆。

  • netfiter:指的是Linux操作系统核心层中实现包过滤(filter)防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称内核空间)的防火墙功能体系
  • iptables: 指的是管理防火墙的命令工具,程序通常位于/sbin/iptables,属于“用户态”(User Space,又称用户空间)的防火墙管理体系

WeiyiGeek.netfilter与iptables体系图

什么是Hook point? 答:数据包在Netfilter中的挂在点,有下面几个挂载点(也就是我们后所说的5条链):PRE_ROUTING( 预分类;) 、INPUT、OUTPUT、FORWARD、POST_ROUTING (路由之后))

0x01 四张表五条链

IPtables的作用在于为包过滤的实现提供规则(或称策略),通过各种不同的规则告诉netfiter对来自有些源、前往某些目的地或具有某些协议特征的数据包应该如何处理;

为了更方便地组织和管理防火墙策略 iptables 采用了“表”和“链”的分层结构

  • 每个规则“表”相当于内核空间的一个容器,根据处理数据包的时机不同,表容器内包括不同的规则“链”,针对特定数据包的各种防火墙规则,按顺序依次放入对应的规则“链”中,

WeiyiGeek.表容器与链规则

组成部分(简单的说):四张表+五条链(hook point)+规则 == iptables防火墙规则

1. 四张表

下面就是四张表的详细:

  • raw表:对数据包的数据状态的跟踪和分析
  • mangle表:修改数据包、改变包头中内容(TTL,TOS,MARK)
  • nat表:地址转发(Address Forward)
  • filter表:访问控制(Access Control)、规则匹配(Regular mate)
2. 五条链

描述:规则链在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,其应用时间点分别对应如下:

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

总结:

  • INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制
  • FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况.
3. 规则

上面介绍了iptables管理的4个默认表和5种规则链,按照防火墙策略的不同用途iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现.

那4张表与5条规则链究竟有什么关系? 答:使用iptables -t raw|mangle|nat|filter -L –line-numbers 进行查看默认链

raw表: 包含两条规则链:PREROUTING 、OUTPUT

代码语言:javascript复制
raw表是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理;在匹配数据包时raw表的规则要优先于其他表.
raw表对应的内核模块为:iptable_raw

mangle表:包含五个规则链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING

代码语言:javascript复制
mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛.
mangle 表对应的内核模块为:iptable_mangle

nat表:包含三个规则链:PREROUTING,INPUT,OUTPUT,POSTROUTING

代码语言:javascript复制
nat (Network Address Translation,网络地址转换)表主要用于修改数据包的IP地址、端口号等信息.
nat表中的两个典型应用:SNAT和DNAT策略(分别用于实现企业局域网共享上网、在Internet中发布内网的应用服务器)。
nat 表对应的内核模块为:iptable_nat

filter表:包含三个规则链:INPUT,FORWARD,OUTPUT

代码语言:javascript复制
filter 表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包;
filter 表对应的内核模块为 : iptable_filter

WeiyiGeek.默认表和链结构总结

(重点)数据包在规则表、链匹配流程,下面从不同的角度依次介绍数据包过滤的匹配流程:

  • PREROUTING:预定义
  • POSTROUTING:路由之后
代码语言:javascript复制
ⅰ>>>规则表之间的优先顺序
当数据包抵达防火墙时,将依次应用raw > mangle > nat > filter表中对应链内的规则(如果有的话)就像上图;

ⅱ>>>规则链之间的优先顺序
由于默认规则链是根据规则介入时机进行分类的,因此优先顺序直接取决于数据包的具体流程;

1>>>入站数据流向:
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机(如Internet用户访问防火墙主机中的Web服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应

2>>>转发数据流向:
来自外界的数据包到达防火墙后,首先被PREROUTING规则处理,之后会进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再传给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

3>>>出站数据流向:
防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT规则链处理之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

WeiyiGeek.数据包在规则表链的匹配流程

总结注意:

  • 在POSTROUTING链中不存在于RAW规则表!!!!
  • 在iptables的四个规则表中mangle表和raw的表应用相对较少主要是使用filter表和nat表的防火墙应用;
  • IPtables 链中的规则是从前1到后n条进行检测的;

0x02 iptables 命令规则

在Centos6及以前是采用netfiter内核防火墙的管理工具,iptables作为主要命令工具是非常值得我们学习(在Centos7中被默认firewalld替换) 防火墙重要的配置文件:/etc/sysconfig/iptables

代码语言:javascript复制
#Centos 7.0 默认使用 Firewall-cmd,将其停止卸载并安装:
yum install iptables-services #其他发行版本上没有的直接下载

#开启iptables服务并自启动:
$systemctl start iptables.service    #启动服务
$systemctl enable iptables.service

#执行验证安装
$ iptables --version
iptables v1.4.21

$cat /etc/sysconfig/iptables
*filter  #filter表
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

基础语法与参数:

代码语言:javascript复制
#IPtables规则(Syntax)设置表:
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

#参数解释:
- 其中表名、链名用于指定iptables命令所操作的表和链
- 若未指定表名将默认使用filter表
- 命令选项用于指定管理iptables规则的方式,如插入、增加、删除以及查看等
- 条件匹配用于指定对符合什么样条件的数据包进行处理
- 目标动作或跳转用于知道数据包的处理方式,如允许通过、拒绝、丢弃或跳转(jump)给其他链进行处理等

WeiyiGeek.组成部分

命令参数一览:

代码语言:javascript复制
Tables:-t raw|mangle|nat(常用)|filter(常用)

#Command:-命令 iptables 命令的管理控制选项
#选项名	功能及特点
-A	在指定链的末尾添加(--append)一条新的规则
-D	删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则
-I	在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开头插入
-R	修改、替换(--replace)指定链中的某一条规则,按规则序号或内容确定要替换的规则
-L 	列出(--list)指定链中的所有的规则进行查看,若未指定链名,则列出表中所有链的内容
-F	清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链的内容
-N	新建(--new-chain)一条用户自己定义的规则链
-X 	删除指定表中用户自定义的规则链(--delete-chain)
-P	设置指定链的默认策略(--policy)
-n 	使用数字形式(--numeric)显示输出结果,若显示主机的IP地址而不是主机名
--line-number	查看规则列表时,同时显示规则在链中的顺序号
-v	查看规则列表时显示详细(--verbose)的信息
-V 	查看iptables命令工具的版本(--Version)信息
-h	查看命令帮助信息(--help)

#Chain:链
PREROUTING[预定义] -> [指向远程地址: FORWARD]       -->> POSTROUTING[路由之后]  
                  |_> INPUT[入站] -> OUTPUT[出站]  -->> POSTROUTING[路由之后]

Parameters-Xmath:参数-条件匹配

选项

参数

作用

-p [协议]

–protocal:tcp/udp/icmp和all

协议匹配

-s [源地址]

源(–source)地址

源地址匹配

-d [目标地址]

目标(–destination)地址

目标地址匹配

–sport [源端口号]

源端口(–source-port),–sport 80:89,不连续时常于 -m multiport 连用

源端口匹配

–dport [目标端口]

目标端口(–destination-port), –dport 80:89,不连续时常于 -m multiport 连用

目标端口匹配

–d/sports [端口段]

目标端口与源端口列表,–d/sports 100-2000,不连续时常于-m multiport 连用

端口段匹配

–src-range [IP地址范围]

源地址-ip段:–src-range 192.168.1.20-192.168.1.99,常于 -m iprange 连用

检查数据包的源地址时,用于匹配一段范围内的IP地址

–dst-range [IP地址范围]

目标地址-IP段:–dst-range 192.168.1.20-192.168.1.99,常于 -m iprange 连用

检查数据包的目标地址时,用于匹配一段范围内的IP地址

-i [网路接口名]

eth0-name

接收数据包(–in-interface)的网卡

-o [网络接口名]

eth0-name

发送数据包(–out-interface)的网卡

–tcp-flags [TCP标记位]

SYN,RST,ACK SYN,以使用-p tcp为前提

TCP标记匹配

–icmp-type [ICMP类型]

Echo-Request/Echo-Reply/Destination-Unreachable(分别对应请求、回显、目标不可达数据),以使用-p icmp为前提

ICMP类型匹配

-

-

-m [模块关键字]

执行 lsmod

grep xt_ 命令查看到扩展防火墙功能的相关内核模块,如:xt_mac,xt_state,xt_multiport

由额外的内核模块提供,下列详细说明

-m mac

–mac-source 3C-97-0E-77-7F-67

MAC地址匹配

-m state

–state ESTABLISHED(响应请求或者已建立连接的),RELATED(与已有连接有相关性的,如FTP数据连接) NEW(与任何连接无关的),INVALID(无效的连接),UNTRACKED(追踪的连接)

多状态匹配,基于iptables的状态跟踪机制,检查数据包的链接状态.

-m iprange

–src-range 192.168.1.20-192.168.1.99

多IP地址匹配

-m multiport

–dport 20,21,25,110,1250:1280 (端口不连续)

多端口匹配

-m limit

–limit 3/minute (平均三次/分钟),–limit-burst 8(峰值为八次)

对于频率进行限制

–probability

–probability 0.500000000

设置进入到指定链的概率此处是50%

代码语言:javascript复制
#Target: -j  #iptables对满足”条件匹配“指定条件的数据包,最常采用的处理方式如下:
#数据包访问控制:
ACCEPT(允许接受通过) 
DROP(将数据包进行丢弃不会返回信息) 
REJECT(对数据包进行拒绝但会返回信息)  
JUMP(自定义,跳转)

#数据包改写(在NAT表中):
SNAT(Source Network Address Translation,源地址转换)修改数据包的源IP地址
DNAT(Destination Network Address Translation,目标地址转换)修改数据包的目标IP地址

#信息记录:
LOG(访问记录的情况下),  在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
通过情况下,只要在规则链中找到一条相匹配的规则,则不再继续检查该链内后面的规则;但使用LOG处理方式的规则是一个特例,因为LOG只是一个辅助动作,并没有真正的处理数据包

实际案例:

代码语言:javascript复制
#示例0.模块帮助,获得iptables相关选项用法的帮助信息#
#查看iptables命令中关于icmp协议的帮助信息(在输出内容的最后部分列出)
iptables -p icmp -h
iptables -m state -h


#示例1.对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问(时时生效)添加comment模块#
iptables -I INPUT -p tcp --dport 22 -m comment --comment "SSH服务" -j DROP
iptables -I INPUT -p tcp --dport 22 -m comment --comment "SSH服务" -j LOG

$tail -f /var/log/messages #查看本机log发现登录过被阻止记录


#示例2.为了避免日志记录过于频繁,通过结合LIMIT显式匹配(-m limit)对日志写入频繁进行限制#
#例如以下规则,用于替换INPUT中第一条,并将记录日志的频率限制为平均三次/分钟,允许的峰值为八次。
iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG


#示例3.添加及插入以及替换规则#
#在filter表的INPUT链的末尾添加一条防火墙规则
iptables -t filter -A INPUT -p tcp -j ACCEPT 

#在filter表的INPUT链中插入一条防火墙规则(此处省略了“-t filter”选项,按默认处理filter表)
iptables -I INPUT -p udp -j ACCEPT  

#在filter表的INPUT链中插入一条防火墙规则(作为链中的第二条规则)
iptables -I INPUT 1 -p icmp -j DROP  #禁ping会显示请求超时。

sudo iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -m comment --comment="bootstack" -j ACCEPT
sudo iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3366 -m comment --comment="bootstack_db" -j ACCEPT

#示例4.查看规则列表#
#查看filter表INPUT链中的所有规则,同时显示各条规则的顺序号
$iptables -L INPUT --line-numbers   #默认是filter表
$iptables -L -v --line-number  #获取filter表中规则序号
$iptables -t filter -L INPUT --line-numbers   #指定表查看
# Chain INPUT (policy ACCEPT)
# num  target     prot opt source               destination
# 1    DROP       icmp --  anywhere             anywhere

WeiyiGeek.链规则查看

代码语言:javascript复制
#示例5.删除、清空指定编号规则#
#删除filter表INPUT链中的第2条规则
iptables -D INPUT 2

#清空filter表、nat表、mangle表各链中的所有规则
iptables -F             #不指定表名时默认(Default)清空filter表
iptables -t nat -F
iptables -t mangle -F


#示例6.设置规则链的默认策略 最基本的两种策略为ACCEPT(允许)、DROP(丢弃)#
#将filter表中FORWARD规则链的默认策略设为DROP
iptables -t filter -P FORWARD DROP
# Chain FORWARD (policy DROP)
# target     prot opt source               destination


#示例7.新增、删除自定义规则链
#在raw表中新增一条自定义的规则链,链名为TCP_PACKETS.
iptables -t raw -N TCP_PACKETS

#删除raw表中的用户自定义的所有规则链(只清除用户用户自定义的规则)
iptables -t raw -X

在iptables的规则表中,允许用户自定义新的链但是需要在默认的链中添加相应的跳转策略(如“iptables -I INPUT -j 自定义链名”),否则在处理数据包时将不会使用自定义链中的规则后面会给个例子;

WeiyiGeek.add规则链

条件匹配 (重点) 对于Linux防火墙来说,应该对什么样的数据包进行过滤,对什么样的数据包做地址转换,对于一条有效的防火墙策略来说,条件匹配的设置起着决定性的作用; Linux防火墙需要非常清楚的知道针对符合什么条件的数据包进行什么样的处理,区分数据包的条件匹配方式可以分为通用匹配、隐含匹配和显式匹配各种匹配条件可以结合在一起使用.

A、通过(general)条件匹配 这种匹配操作一般可以直接使用,而不依赖于其他的条件匹配及其扩展常见的通用匹配方式包括以下集中;

代码语言:javascript复制
#示例8:协议匹配用于检查数据包的网络协议(--protocol),允许使用的协议名包含在/etc/protocols文件中,常见的为tcp、udp、icmp和all(针对所有IP数据包)在iptables命令中使用“-p 协议名”的形式

#拒绝进入防火墙的所有icmp协议数据包
iptables -I INPUT -p icmp -j REJECT
iptables -R INPUT 1 -p icmp -j REJECT  #替换filter表种的INPUT链的第一条规则;
# 正在 Ping 10.10.107.222 具有 32 字节的数据:
# 来自 10.10.107.222 的回复: 无法连到端口。

#允许防火墙转发除icmp协议以外的所有数据包(使用惊叹号"!"可以将除条件取反)
iptables -A FORWARD ! -p icmp -j ACCEPT


#示例9:地址匹配用于检查数据包的IP地址、网络地址在iptables命令中使用“-s 源地址”和“-d 目标地址”的形式,分别对应于源(--source)地址和目标(--destination)地址
#拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0.0/24网段的数据
iptables -I FORWARD -s 192.168.1.11 -j REJECT
iptables -I FORWARD -s 192.168.0.1/24 -j ACCEPT


#示例10. 网络接口匹配用于检查数据包从防火墙的哪一个接口进入或离开在iptables命令中使用“-i 网络接口名”和“-o 网络接口名”的形式,分别对应于接收数据包(--in-interface)的网卡和发送数据包(--out-interface)的网卡
#丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP


#示例11.管理员在网关服务器上检测到来自某个IP网段(如 10.20.30.0/24)的频繁扫描,希望设置iptables规则封堵该IP地址段,两小时后解封
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
$at now  2hours   #值得学习
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at>                             //此处按Ctrl D组合键
job 4at 2013-06-1122:47

B、隐含(Implicit)条件匹配 这种匹配通常需要以指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核,一般不需要用户收到加载模块常见的隐含匹配方式包括以下几种

  • 端口匹配用于检查数据包的TCP或UDP端口号,需要以“-p tcp”或“-p udp”匹配为前提在iptables命令中使用“–sport 源端口号”、“–dport 目标端口”的形式,分别对应于源端口(–source-port)、目标端口(–destination-port)端口可以表示为单个端口号或者用冒号“:”分割的端口范围.
代码语言:javascript复制
#示例12:仅允许系统管理员从202.13.0.0/16 网段使用SSH方式远程登录防火墙主机(生效得顺序从上1到下1x0,还要注意-I与-A不同,删除中间得规则得时候,后面的规则向上补齐序号)
iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

#允许本机开放从TCP端口20-1024提供的应用服务
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT

#作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
  • TCP标记匹配用于检查数据包的TCP标记位(–tcp-flags),需要以“-p tcp”匹配为前提在iptables命令中使用“–tcp-flags检查范围被设置的标记”的形式,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间用逗号分割“检查范围”告诉iptables需要检查数据包的哪几个标记,“被设置的标记”则明确匹配对应值为1的标记
代码语言:javascript复制
#示例13.拒绝从接口(eth0)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入
iptables -P INPUT DROP     #设置指定链的默认策略(--policy),此命令执行小心,不提前设置通过ssh的话,你的远程直接就断开了
iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK -j ACCEPT

ICMP类型匹配用于检查ICMP数据包的类型(–icmp-type),有选择的过滤数据包,需要以“-p icmp”匹配为前提在iptables命令中使用“–icmp-type ICMP类型”的形式ICMP类型可以使用字符串或数字代码,例如“Echo-Request”(数字代码为8)、“Echo-Reply”(数字代码为0)、“Destination-Unreachable”(数字代码为3),分别对应ICMP协议的请求、回显、目标不可达数据

代码语言:javascript复制
#示例14.禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

WeiyiGeek.icmp数据包类型

C、显式(Explicit)条件匹配

这种匹配的功能需要由额外的内核模块提供,因此需要手工指定匹配方式在iptables命令中使用“-m 模块关键字”的形式调用显式匹配,当然,还的指定对应的匹配内容在使用过显式匹配以后,可以执行“lsmod |grep xt_”命令查看到扩展防火墙功能的相关内核模块(如:xt_mac,xt_state,xt_multiport,xt_limit等)常见的显式匹配包括以下几种

  • MAC地址匹配主要用于检查数据包的源MAC地址在iptables命令中使用“–mac-source MAC地址”的形式
代码语言:javascript复制
#示例15.禁止转发来自MAC地址为3C-97-0E-77-7F-67(这是我本机的mac)的主机的数据包 
iptables -A FORWARD -m mac --mac-source 3C-97-0E-77-7F-67 -j DROP

WeiyiGeek.xt_mac

  • 多端口匹配检查数据包的源端口、目标端口时,用于匹配多个不连续的端口号在iptables命令中主要使用”–dports 端口列表“或者”–sports 端口列表“的形式,分别对应源端口地址列表、目标端口地址列表
  • 多IP地址匹配检查数据包的源地址、目标地址时,使用模块-m iprange,用于匹配一段范围内的IP地址在iptables命令中主要使用”–src-range IP地址范围“或者”–dst-range IP地址范围“的形式,分别对应源IP地址范围、目标ip地址范围
代码语言:javascript复制
#示例16.允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
$lsmod |grep xt_

#示例17.禁止转发源IP地址为192.168.1.20~192.168.1.99 的TCP数据包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99-j DROP
#xt_iprange

WeiyiGeek.iprange

  • 状态匹配基于iptables的状态跟踪机制,检查数据包的链接状态(State)常见的数据包状况主要包括NEW(与任何连接无关的,新建得连接数据包)
    • NEW(新建立的连接)
    • ESTABLISHED(响应请求或者已建立连接的)
    • RELATED(与已有连接有相关性的,如FTP数据连接)
    • INVALID(无效的连接)
    • UNTRACKED(追踪的连接)
代码语言:javascript复制
#示例18.禁止转发与正常TCP连接无关的非--syn新的请求数据包(如网络中可能存在的一些非法攻击数据包)
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP


#示例19.拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT


#示例20.在服务器上设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(21、20端口、20450~20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理
iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
#等同于 iptables -I INPUT -p tcp -m multiport --dport 20,21,80,20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP  #设置关系链得默认策略 (最后一条)

用户自定义链 将数据包传递给用户自定义的链(内的规则)进行处理 eg:自定义一个新的链MY1,转发自/至192.168.1.0/24网段的数据包均交给该链中的规则处理

代码语言:javascript复制
iptables -t filter -N MY1
iptables -A FORWARD -s 192.168.1.0/24 -j MY1  #转发请求 动作是交给自定义链中 源
iptables -A FORWARD -d 192.168.1.0/24 -j MY1   #
iptables -A MY1 -p icmp -j DROP  #该链中icmp协议通信包将会被丢弃

注意事项:

  • 命令中的链与动作必须是大写的;

0x03 iptables 保存和恢复

iptables软件包提供了两个命令:iptables-save、iptables-restore,分别用于保存(save)和恢复(restore)防火墙规则,使用这两个命令可以很方便的导出和导入规则.

iptables-save命令

描述:直接执行iptables-save命令时,将会把当前设置的防火墙规则信息输出到终端. 通常情况下,可以使用重定向将信息保存为指定的配置文件,结合系统默认提供的iptables服务脚本,可以自动加载位于/etc/sysconfig/iptables文件中的规则设置.

代码语言:javascript复制
#示例1.将当前调试好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载.
$iptables-save >/etc/sysconfig/iptables
$service iptables restart
# iptables:清除防火墙规则:                                 [确定]
# iptables:将链设置为政策 ACCEPT:raw mangle nat filter     [确定]
# iptables:正在卸载模块:                                   [确定]
# iptables:应用防火墙规则:                                 [确定]
$chkconfig --level 35 iptables on
iptables-restore命令

使用iptables-restore命令,可以从已保存的配置文件中导入iptables规则(该文件必须是使用iptables-save命令导出的配置数据).

代码语言:javascript复制
iptables-save >/etc/sysconfig/iptablesbak   #备份
iptables-restore </etc/sysconfig/iptablesbak #恢复

0x04 NAT转发应用场景

那么,当Linux防火墙同时作为企业的网关服务器使用的时候,怎样使局域网用户也能够访问互联网呢?又怎样才能使互联网中的用户能够访问到局域网内部的网络服务器?iptables真的能做到这些吗? 答案是:Yes的

主要介绍nat表中的两个典型应用: SNAT和DNAT策略(分别用于实现企业局域网共享上网、在Internet中发布内网的应用服务器),相同点都必须开启网关服务器的路由转发功能(net.ipv4.ip_forward=1),不同点一个源地址而一个是目标地址。

1)SNAT 策略及应用 SNAT策略概述:随着Internet网络在全世界范围内的快速发展,IPv4协议支持的可用IP地址资源逐渐变得山穷水尽,资源匮乏使得很多企业难以申请更多的公网IP地址,或者只能承受一个或者少数几个公网IP地址的费用而与此同时,大部分企业都面临着将局域网的主机接入Internet的需求,使用iptables的SNAT策略,可以基本化解这个难题。

WeiyiGeek.SNAT案例

当Linux网关服务器正常开启路由转发(未使用SNAT)时,局域网访问Internet的数据包,经网关转发后其源IP地址保持不变(仍为192.168.1.100),而Internet中主机收到这样的请求数据包后,将无法为其返回应答数据包(因为该地址是私有IP地址,无法为其正确路由),从而导致访问失败;

如果在Linux网关服务器中有针对性的应用SNAT策略,数据包转发情况就不一样了,当局域网访问Internet的数据包到达网关服务器时,网关进行路由选择,若发现该数据包需要从外网接口(如eth0)向外转发,则将该数据包的源IP地址(如:192.168.1.100)修改为网关的外网接口地址(如:218.29.30.31),然后才提交到Internet中,最后发送到目标主机(www.google.com).相当于以网关服务器的公网身份提交数据访问请求,自然就可以收到正常的响应数据包;`然后网关服务器再根据之前建立的SNAT映射`,将响应数据包返回给局域网中的源主机,只要连接到第一个包被SNAT处理了,那么这个连接及对应数据流的其他包通常也会自动的被进行SNAT处理。

SNAT策略应用: (解决上述问题)从前面的需求中大致了解到,SNAT典型应用于局域网共享上网的接入,而处理数据包的切入时机,主要选择在路由选择之后(POSTROUTING)进行,SNAT的关键在于将局域网外发数据包的源IP地址(私有地址)修改为网关的外网接口IP地址(公有地址)

SNAT只能用于nat表的POSTROUTING链,使用iptables命令设置SNAT策略时,需要结合“–to-source 出口IP地址”选项指定修改后的IP地址,例如:

代码语言:javascript复制
-j SNAT --to-source 218.29.30.31

实例配置来说明SNAT策略的用法,案例环境及需求描述如下(拓扑图如上) I、公司的网关服务器使用了Linux操作系统。 II、网关上有两块网卡:其中eth0连接Internet,使用固定IP地址 218.29.30.31/30;eth1连接局域网,使用固定IP地址192.168.1.1/24。 III、局域网内各主机的默认网关设置为192.168.1.1,且已经设置了正确的DNS服务器。 IIII、现需要在Linux网关主机中进行正确配置,以使192.168.1.0/24网段的局域网用户能够共享方式访问Internet。

根据上述环境,在Linux网关中推荐的操作步骤如下:

代码语言:javascript复制
(1)、确认开启网关服务器的路由转发功能
$vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
$sysctl -p

(2)、为局域网访问Internet的数据包采用SNAT策略,将源地址更改为服务器的公网IP地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
使用局域网内的客户机访问Internet中的网站(如:www.baidu.com)进行测试,测试成功以后将上述SNAT策略添加到防火墙脚本文件中,并设置未开机后自动运行。

PS:以上介绍的应用是网关服务器具有固定的静态公网IP地址的情况,而在某些时候,企业很可能使用非固定的动态公网地址,例如使用ADSL宽带接入时可能获得是动态IP地址。那么在这种网络环境下,又应该如何设置SNAT策略呢?

  • iptables提供了一个名为MASQUERADE(伪装masquerade)的数据包处理方式,MASQUERADE相当于SNAT的特例,同样也完成修改(伪装)数据包源IP地址的工作,只不过它会自动获取外网接口的IP地址,而无需使用“–to-source”的形式。
  • 使用iptables命令设置MASQUERADE策略时,只需要去掉SNAT策略中的“–to-source IP地址”,改用“-j MASQUERADE”指定数据包处理方式即可.ADSL通常使用PPPOE技术,在Linux系统中,对应的连接名称为ppp0、ppp1等,如果无法确定连接的编号,还可以使用ppp 代替。
代码语言:javascript复制
#示例1.当外网地址事动态变化的就采用MASQUERADE策略
#eg:设置MASQUERADE策略,使用192.168.1.0/24网段能够通过网关的ppp0连接共享上网.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

#当然,即使网关服务器有静态的IP地址,也同样可以使用MASQUERADE而不用SNAT只不过,MASQUERADE会比SNAT多一些额外的开销,因此如果有固定的IP地址,最好还是使用SNAT策略.

2) DNAT策略及应用 DNAT策略概述:DNAT策略与SNAT非常相似,只不过应用方向反过来了.SNAT用于修改源IP地址,而DNAT用于修改目标IP地址;

  • SNAT只能在nat表的POSTROUTING链中
  • DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中.

例如:考虑到应用服务的安全和稳定性,公司将对外的Web服务器架设在一个内部网络中,而公司仍然只有一个公网IP地址,又需要使Internet中的客户机能够访问公司的网站,这时候,使用DNAT策略可以有效保证位于内网中的网站服务器于Internet中的客户机的相互通讯.

WeiyiGeek.DNAT

由于企业申请的Internet域名要解析到一个合法的公网IP地址(如:218.29.30.31),当Internet中的客户机提交的http请求到达企业的网关主机时,网关首先判断该数据包的目标地址和目标端口,若发现该数据包需要访问本机的80端口,则将该数据包的目标IP地址(如:218.29.30.31)修改为内网中真正的网站服务器的IP地址(如:192.168.1.6),然后才进行路由选择,最后发送到内部的网站服务器(192.168.1.6).然后网关服务器再根据之前建立的DNAT映射,修改返回的HTTP应答数据包的源IP地址,最后返回给Internet中的客户机.

在上述的DNAT转换地址的过程,Internet中的客户机无需指定企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成.通过DNAT策略,位于企业内部的应用服务器就可以对Internet提供服务了.

DNAT策略的应用:使用iptables命令设置DNAT策略时,需要结合”–to-destination IP地址”的选项指定企业内网服务器的实际IP地址,如:

代码语言:javascript复制
-j DNAT --to-destination 218.29.30.31

解决上面拓扑图问题的DNAT策略的用法: I、公司在ISP注册了域名 www.lansgg.com,并对应于Linux网关的外网的接口(eth0)地址:218.20.30.31 II 、公司的网站服务器位于局域网内,IP地址为192.168.1.6 III 、Internet用户可以通过访问www.lansgg.com来查看公司的网站内容.

根据上述环境,在Linux网关中推荐的操作步骤如下:

代码语言:javascript复制
(1)确认开启网关服务器的路由转发功能
$vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
$sysctl -p

(2)在网关上添加DNAT映射,对于访问网关80端口的数据包,将目标地址更改为网站服务器的内网IP地址
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
使用Internet中客户机访问,http://www.lansgg.com进行测试,测试成功以后将上述DNAT策略添加到网关的防火墙脚本文件中,并设置为开机后自动运行.

Ps: 如果没有设置SNAT共享上网策略,内网的客户机可能将无法使用公网地址(如:218.29.30.31)的形式访问公司内部的网站服务器.若确实有这种需求,可以有针对性的添加一条SNAT规则,如下命令:

代码语言:javascript复制
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 218.29.30.31 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

#假设所需要包1.2.3.4端口号为8080的TCP数据包重定向到目的地址是192.168.1.1端口号是80:
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to 192.168.1.1:80

例2:若需要做DNAT的内部服务与网关主机本身的服务发送冲突,则需要对数据访问进行区分.例如,Linux网关本身运行了SSH服务,内部网络中的数据库服务器也运行了SSH服务,两台主机都希望能从Internet中进行远程管理.由于可用的公网IP地址只有一个,因此就有必要在网关上根据访问端口进行区分.SSH服务器默认使用的端口号为22。

WeiyiGeek.案例2

I、公司的Linux网关服务器的外网IP地址eth0:218.29.30.31;位于局域网的数据库服务器IP地址:192.168.1.5; II、根据公司安排,管理员要能够随时从家里的主机远程管理数据库服务器,登录的目标地址为218.29.30.31:2222 III、管理员家里主机的IP地址可能在63.34.45.0/24网段范围中随机变动.

根据上述环境,应用DNAT策略的思路如下.

  • 1.访问218.29.30.31:22的数据仍保持默认(不做处理),对应网关主机本身的SSH服务.
  • 2.两台主机的SSH服务都使用默认的22端口不变.
  • 3.在网关主机上,将访问本机2222端口的数据包进行DNAT处理,对应到内部网络中的数据库服务器(需要同时指定目标端口)

推荐操作步骤如下:

代码语言:javascript复制
(1)、在数据库服务器上开启ssh服务,(注意设置好路由或默认网关记录)
service sshd start
route add -net 63.34.45.0/24 gw 192.168.1.1

(2)、确认开启网关服务器的路由转发功能.
$vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
$sysctl -p

(3)、在网关上添加DNAT映射,对于访问网关2222端口的数据包,将目标地址更改为数据库服务器主机的内网IP地址
iptables -t nat -A PREROUTING -i eth0 -s 63.34.45.0/24 -d 218.29.30.31 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.5:22

#经测试成功以后,将上述DNAT策略添加到防火墙脚本文件中,并设置为开机后自动运行.

下面是防火墙脚本方面的东西,前面已经学会了iptables命令的语法和简单的规则设置.在添加防火墙规则时,必须充分理解数据包匹配的流程,尤其是规则链内的匹配流程。这样才能更好的优化规则顺序,提高包过滤机制的效率和准确性.

0x05 iptables实用场景配置

示例1.Linuxiptables配置场景一

规则1、对所有的地址开放本机的tcp(80,22,10-21)端口访问

规则2、允许对所有的地址开放本机的基于ICMP协议的数据包访问

规则3、其他未被允许的端口则禁止访问

代码语言:javascript复制
>iptables -v  #显示版本
>iptables -nL #显示设置的规则列表,不显示主机名
>iptables -F  #把之前设置的规则清除掉

>iptables -I INPUT -p tcp --dport 80,22 -j ACCEPT #I插入 通道INPUT p协议 端口80 可以接受
>iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT #端口范围
>iptables -I INPUT -p icmp -j ACCEPT
>iptables -A INPUT -j REJECT    #A after在之后 , -I 插入在前 

#存在的问题,本机无法访问本级,本机无法访问其他主机
>iptables -I INPUT -i lo -j ACCEPT   #指定网卡lo
>iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #state状态的允许

#在场景一的基础上,修改只允许10.103.188.233访问本级的httpd服务
>iptables -D INPUT -p tcp --dport 80 -j ACCEPT #D删除INPUT链中允许所有的地址访问80端口
>iptables -I INPUT -p tcp -s 10.10.188.233 --dport 80 -j ACCEPT

示例2.Linuxiptables配置场景二 1、ftp主动模式下iptables的规则配置(客户端开启随机端口,服务端开始21与22) 2、iptables对于FTP主动模式(iptables需要开启21,20端口的访问权限),ftp连接的默认模式为被动模式 3、vsftp服务支持主动模式需要注意配置选项

代码语言:javascript复制
$vim /etc/vsftpd/vsftpd.conf
port_enables=yes
connect_from_port_20=YES

$/etc/init.d/vsftpd restart

WeiyiGeek.FTP主动模式

代码语言:javascript复制
#示例2
iptables -nL
iptables -I INPUT -p tcp --dport 21,22 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -I INPUT -m stat --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j REJECT

示例3.Linuxiptables配置场景三 1、ftp被动模式下iptables的规则配置(服务端开启21与随机端口,客户端被动连接到服务端) ftp>passive #开启被动模式,在执行一次passive off后就是采用主动模式

代码语言:javascript复制
#修改ftp被动模式随机端口的范围:
vim /etc/vsftpd/vsftpd.conf
>pasv_min_port=50000
>pasv_max_port=60000

WeiyiGeek.ftp被动模式

代码语言:javascript复制
#示例3.
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

#使用连接Socket(套字节)模块
> vim /etc/sysconfig/iptables_config
IPTABLES_MODULES="nf_conntrack_ftp"
modprobe nf_conntrack_ftp  #临时加入 内核(kernel)

WeiyiGeek.iptable_config

示例4.Linuxiptables配置场景四 SNAT(转发)与DNAT (映射):

  • SNAT : 源地址转换 :作用链(出口POSTROUTING)
  • DNAT : 目标地址转换 :作用链(进口POSTROUTING,OUTPUT)

WeiyiGeek.示例4

代码语言:javascript复制
### 示例1.SNAT 使用 ###
>netstat -rn

# Client 加入默认网关
>cat /etc/sysconfig/network  #增加默认网关
GATEWAY=10.10.177.232
>route add 10.10.177.233 gw 10.10.177.232

#Mat Server 执行
>vim /etc/sysctl.conf   #修改 net.ipv4.ip_forward=1
>sysctl -p
>sysctl -a|grep ip_forward

>iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -j SNAT --to-source 10.10.188.232
>iptables -t nat -L


### 示例2.DNAT 使用 ### 同样也要修改、然后Clinet就能访问HTTP SERVER
iptables -t nat -F  #清除表规则
iptables -t nat -A PREROUTING -d 10.10.188.232  -p tcp --dport 80 -j DNAT --to-destination 10.10.177.233:80

示例5.Linux IPtables配置场景五

要求一:员工在公司内部(10.10.155.0/24,10.10.188.0/24)能访问服务器上的任何服务

要求二:当员工出差到外地,通过VPN连接到公司外网

要求三:公司有一个门户网站需要允许公网访问

代码语言:javascript复制
常见允许外网访问的服务
网站 www http         80/tcp
         https       443/tcp
邮件mail  smtp       25/tcp
          smtps     465/tcp
          pop3       110/tcp
          pop3s     995/tcp
          imap       143/tcp

一些常见不允许外网访问的服务
文件服务器:NFS        123/udp
          SAMBA 137,138,139/tcp 445/tcp
          FTP         20/tcp,21/tcp
远程管理:SSH      22/tcp
数据库:  MYSQL    3306/tcp
          ORACLE 1521/tcp

配置规则的基本思路:

  • ACCEPT规则:允许本地访问/允许已监听状态数据包通过/允许规则中的数据包通过
  • DENY规则:拒绝未被允许的数据包

实际配置:

代码语言:javascript复制
>iptables -F
>iptables -I INPUT -i lo -j ACCEPT
>iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
>iptables -A INPUT -s 10.10.155.0/24 -j ACCEPT
>iptables -A INPUT -s 10.10.188.0/24 -j ACCEPT
>iptables -A INPUT -p tcp --dport 80 -j ACCEPT
>iptables -A INPUT -p tcp --ddport 1723 -j ACCEPT
#DENY OTHERS #记得把本机也加入iptables
>iptables -A INPUT -j REJECT
>iptables -nL

示例6.Linuxiptables配置场景六 描述:利用iptables防CC攻击,攻击者借助代理服务器生成指向受害主机的合法请求实现DDOS和伪装就叫:CC(Challenge Collapsar)

利用iptables防CC攻击的模块主要有两个:

  • connlimit模块 : 用于限制每一个客户端ip的并发连结数,参数:-connlimit-above n #限制并发个数
  • limit模块: 限速,控制流量
代码语言:javascript复制
#示例6.
>iptables -I INPUT -p tcp -syn -dport 80 -m connlimit -connlimit-above 100 -j REJECT

>iptables -A INPUT -m limit --limit 3/hour
>iptables -A INPUT -m limit --limit 3/m --limit -burst 10 -j ACCEPT   # 缓冲区一样10条 --limit -burst默认值为5

示例7.V**配置场景设置

代码语言:javascript复制
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT

#对 10.10.10.0.0/24 网段控制VPN
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.10.0.0/24 -m mutilport --dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.10.0.0/24 --dports 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.10.0.0/24 -j ACCEPT

示例8.模块对于关键字模块与时间模块,日期模块得引用.

代码语言:javascript复制
-m string --string "关键字"
-m time --timestart 10:00 --timestop 12:00
-m time --timestart 10:00 --timestop 12:00 --day Mon,Tue,Wed,Thu,Fri,Sat,Sun

WeiyiGeek.模块使用

示例9.SNAT、DNAT配置场景设置 SNAT:修改包的源地址(改变连接的源IP地址) DNAT: 修改包的目标地址(改变连接的目的IP)

代码语言:javascript复制
#需要将接受到源IP地址为192.168.1.12的数据包进行SNAT为202.110.123.100转换
iptables -A POSTROUTING -o eth0 -s 192.168.1.12 -j SNAT --to 202.110.123.100

#源地址转换为1.2.3.4则iptables的配置如下:(注意作用链不同)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6  #转成成1.2.3.4/5/6
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4:1-1023 #转成成1.2.3.4端口号为1-1023


#目的地址转换为1.2.3.4则iptables的配置如下:(注意作用链不同与接口 -i  / -o)
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 1.2.3.4
iptables -t nat -A RREROUTING -i eth0 -j DNAT --to 1.2.3.4-1.2.3.6  #转成成1.2.3.4/5/6
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 1.2.3.4:1-1023 #转成成1.2.3.4端口号为1-1023
#将web数据包的目的地址转换成为5.6.7.8端口号是8080,则iptables的配置如下
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT -to 5.6.7.8::8080

示例10.网络安全保护配置场景设置

代码语言:javascript复制
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#网络攻击源阻断
iptables -A INPUT -s 20.200.200.1 -j DROP
iptables -A INPUT -i ppp0 -p tcp --sync -j DROP #禁止用外部访问内部网配置
#补充:--syn 相当于 --tcp-flags SYN、RST、ACK、SYN的简写
iptables -A INPUT -i ppp0 -p tcp --destination-port telnet -j DROP #禁止用外部访问内部服务
iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP #禁止使用服务
iptables -A INPUT -i eth0 -p tcp --syn --destination-port !80 -j DROP #指定服务才能被访问

#防止同步风暴SYN Flood 攻击
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 
#端口扫描防护
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST -m limit --limit 1/s -j ACCEPT 
#ping of death 防护
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

示例11.iptables综合实例 假设test企业网段地址是198.168.80.0/24内部网中存在以下服务器;

  • WWW: www.test.com / 198.168.80.11
  • FTP:ftp.test.com / 198.168.80.12
  • Email: mail.test.com / 198.168.80.13

WeiyiGeek.环境示例图

代码语言:javascript复制
#!/bin/sh
#刷新防火墙规则链
/sbin/iptables -F
iptables -P FORWARD DROP
#www服务
iptables -A FORWARD -p tcp -d 198.168.80.11 --dport 80 -i eth0 -j ACCEPT

#ftp服务(被动模式)
iptables -A FORWARD -p tcp -d 198.168.80.12 --dport 21 -i eth0 -j ACCEPT

#Email服务
iptables -A FORWARD -p tcp -d 198.168.80.13 --dport 25 -i eth0 -j ACCRPT

#针对于internet攻击(但不能防止来自intranet 内部网络攻击)
iptables -A FORWARD -p tcp -s 0/0 --sport 21 -d 192.168.80.0/24 -i eth0 -j ACCEPT 
iptables -A FORWARD -p tcp -d 192.168.80.0/24 ! --syn -i eth0 -j ACCEPT 
iptables -A FORWARD -p udp -d 192.168.80.0/24 -i eth0 -j ACCEPT 

#内部网络intranet的数据包过滤
iptables -A FORWARD -s 192.168.80.0/24 -i eth1 

#IP碎片攻击配置(每秒100个碎片)
iptables -A FORWARD -f -m limit- --limit 100/s --limit-burst 100 -j ACCEPT

#设置ICMP包过滤
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

示例12.利用IPtables的net.ipv4.ip_forwardNAT转发使得内网不能上网的主机通过转发上网;

代码语言:javascript复制
# (1) 基础配置网关服务器外网IP 
eth0: 10.0.0.1
eth1: 192.168.12.2

# (2) 在网关服务器开启转发功能
sysctl -p
grep "net.ipv4.ip_forward = 0" /etc/sysctl.conf && sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf 
sysctl -p

# (3) 设置网关服务器iptables的 nat 转换
/etc/init.d/iptables stop
/sbin/iptables -t nat -A POSTROUTING -o eth0  -s 192.168.12.0/24 -j MASQUERADE 
/etc/init.d/iptables start

# (4) 后端局域网服务器需要上网的,内网IP需要设置为192.168.1.0/24网段IP。同时设置网关IP为网关服务器连接内网的接口IP也就是 192.168.1.1
ifconfig eth0 192.168.12.1/24 up      # 接口有变化需根据实际情况更改
route add default gw 192.168.12.1

# (5) 后端局域网服务器实战
$ route
  # Kernel IP routing table
  # Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  # default         _gateway        0.0.0.0         UG    0      0        0 eno1
  # default         _gateway        0.0.0.0         UG    0      0        0 eno1
  # 192.168.12.0    0.0.0.0         255.255.255.0   U     0      0        0 eno1

$ ping 14.215.177.39  # 成功访问外网
  # PING 14.215.177.39 (14.215.177.39) 56(84) bytes of data.
  # 64 bytes from 14.215.177.39: icmp_seq=2 ttl=52 time=29.8 ms
  # 64 bytes from 14.215.177.39: icmp_seq=4 ttl=52 time=29.6 ms

$ traceroute 192.168.12.123  # 内部LAN是直接访问
  # traceroute to 192.168.12.123 (192.168.12.123), 30 hops max, 60 byte packets
  #  1  192.168.12.123 (192.168.12.123)  0.208 ms  0.188 ms  0.173 ms

0x06 reference

https://www.cnblogs.com/syavingcs/articles/12017494.html

0 人点赞