iptables基础指南

本文索引

  • 介绍
  • 链和表
    • 数据包传输过程
    • mangle表
    • nat表
    • filter表
  • 数据包状态
  • TCP连接
  • UDP连接
  • ICMP连接
    • 网络不可达
    • 主机不可达
  • 复杂协议连接(以FTP为例)
    • 主动模式
    • 被动模式
  • 规则基础
    • command
    • option选项
    • match匹配(常见几种)
      • 通用匹配
      • TCP匹配
      • UDP匹配
      • ICMP匹配
      • 显式匹配
        • limit匹配
        • mac地址匹配
        • 多端口匹配
        • 状态匹配
    • targets/jumps
      • ACCEPT
      • DNAT
      • SNAT
      • DROP
      • MASQUERADE
      • REJECT
  • 参考引用

介绍

本文的iptables由yum安装完成,不需要编译安装。需要编译安装的,可以参考本文末尾引用的 ==iptables指南==,里面有详细的说明,随便说下,本文基本取自该指南!另外由于时间问题,文中的部分知识已经不适用当前,这里只参考借鉴。

链和表
数据包传输过程

mangle表的规则设定比较复杂,所以下列的mangle步骤的操作全部使用默认策略修改数据包

  1. 目标主机为本机,只用到2种链:PREROUTING、INPUT
步骤说明
1网络上的数据包通过接口准备进入本机
2manglePREROUTINGmangle数据包,修改内部信息
3natPREROUTING主要用作DNAT,不要做过滤操作[选择步骤]
4路由判断(是否转发)
5mangleINPUT本地接收前,mangle数据包信息
6filterINPUT数据包过滤
7到达本机
  1. 源主机为本机,也只用到2种链:OUTPUT、POSTROUTING
步骤说明
1本机发送数据包
2路由判断:源地址、接口等
3mangleOUTPUTmangle数据包
4natOUTPUT做DNAT操作[选做步骤]
5filterOUTPUT过滤数据包
6manglePOSTROUTING对即将离开本机的数据包进行mangle操作
7natPOSTROUTING做SNAT操作[选择步骤]
8离开接口,在网络上传输数据包
  1. 本机转发数据包,使用到3中链:PREROUTING、FORWARD、POSTROUTING
步骤说明
1网络上的数据包经过本机接口准备进入
2manglePREROUTING进入前先mangle数据包信息
3natPREROUTING根据情况选择执行DNAT操作
4路由判断
5mangleFORWARD特殊情况下使用,转发阶段mangle数据包
6filterFORWARD对转发的数据包执行过滤操作
7manglePOSTROUTING数据包出去前mangle信息
8natPOSTROUTING执行SNAT包括masquerade伪装[可选操作]
9离开本机接口传输
mangle表(比较难设置,了解下)

mangle表常见的几种操作

  • TOS:设置数据包的服务类型域
  • TTL:修改数据包的生存时间
  • MARK:设置特殊标记
  • SECMARK(1.1.19版本无):设置安全的标记
  • CONNSECMARK(1.1.19版本无):从完整链接或单个数据包内拷贝安全标记说明
nat表(主要是前3项)
  • DNAT:目标地址转换,修改目的地址,重定向至指定ip
  • SNAT:源地址转换,可以很好的隐藏源地址
  • MASQUERADE:ip伪装,查找匹配数据包可用ip地址,适用于对动态分配的ip地址
filter表

iptables设置的主要部分,对数据包进行匹配过滤,具体配置本文后面会逐渐点出。

数据包状态(状态机)
  • NEW:处理的连接的第一个数据包,例如tcp的SYN包
  • ESTABLISHED:只要是对发出信息的应答都是
  • RELATED:与ESTABLISHED连接相关的连接
  • INVALID:无法识别的数据包,一般被DROP
  • UNTRACKED:在raw表内被执行NOTRACK的标记的数据包
TCP连接

TCP三次握手时的数据包状态

步骤C(客户端)/S(服务器)防火墙(状态)
1C --> SYNNEW
2S --> SYN/ACKESTABLISTED
3C --> ACKESTABLISED

TCP关闭连接

步骤C(客户端)/S(服务器)防火墙(状态)
1C --> FINESTABLISED
2S --> ACKESTABLISED
3S --> FINESTABLISED
4C --> ACKCLOSED

(在最后一个ACK包发出前,2端的连接不会关闭)

UDP连接

UDP是无状态的,没有连接的建立和关闭过程,其数据包是无序的!

客户端发送UDP包,经过防火墙时,此时状态位==NEW==;该包被服务器端接收,状态自然变为==EATABLISED==。

ICMP连接

ICMP也是无状态的,它用于控制而不是建立连接。

步骤客户端/服务器防火墙(状态)
1S --> ICMP echo请求包NEW
2C --> ICMP echo应答包ESTABLISED
3连接建立,客户端处理数据

应答包必须符合一定的标准,连接状态才是ESTABLIED

网络不可达

目标网络存在问题,导致返回网络不可达信息包

步骤客户端/服务器防火墙(状态)
1C --> SYNNEW
2S --> ICMP net unreachableRELATED
3客户端终止连接
主机不可达

目标主机不可达,服务器端发送ICMP Net Prohibited包,连接状态位related。

步骤客户端/服务器防火墙(状态)
1C --> UDP包NEW
2S --> ICMP Net ProhibitedRELATED
3客户端终止连接
复杂协议连接(以FTP为例)

FTP协议数据传输首先要建立一个控制连接;控制连接有2个模式:主动模式和被动模式。

  • 主动模式

客户端==主动==发送端口和ip信息给服务器端,同时打开该端口;服务器接收到该数据包后打开自己的20端口建立与客户端端口的连接,之后就可以传输数据了!主动连接建立阶段的数据包状态如下:

步骤C/S防火墙
1S --> SYNRELATED
2C --> ACK/SYNESTABLISHED
3S <-- ACK数据传输连接确立
  • 被动模式

建立控制连接的过程与主动连接一致;。数据传输建立:客户端发送服务器有关数据要求,服务器发送数据连接的相关端口和ip,客户端依此建立连接,接收数据。被动连接阶段的数据包状态如下:

步骤C/S防火墙
1C --> SYNRELATED
2S --> ACK/SYNESTABLISHED
3C <-- ACK被动连接建立
规则基础

规则是决定如何处理一个包的语句。语法格式如下:

iptables [-t table] command [match] [target/jump]

command
command举例说明
-Aiptables -A INPUT ...在链未添加规则
-Diptables -D INPUT --dport 80 -j DROP在所选链中删除规则
-Riptables -R INPUT 1 -s 192.168.0.1 -j DROP替换所选链的指定行的规则
-Iiptables -I IUPUT 1 --dport 80 -j ACCEPT在所选链的指定规则序号前插入,不指定默认为序号1
-Liptables -L INPUT显示所选链的所有规则
-Fiptables -F INPUT清空所选链的规则
-Ziptables -Z INPUT清空指定链的所有计数器
-Niptables -N allowed创建一个新链
-Xiptables -X allowed删除指定链
-Piptables -P INPUT DROP设置链的默认策略
-Eiptables -E allowed disallowed重命名链
option选项
  • -nvL 查看链内规则的详细信息
  • --line-numbers 显示链中规则的序号
match匹配(常见几种)
  1. 通用匹配
match举例说明
-piptables -A INPUT -p tcp匹配指定的协议
-siptables -A INPUT -s 102.168.1.1匹配源地址的数据包
-diptables -A INPUT -d 192.168.1.1匹配目标地址的数据包
-iiptables -A INPUT -i eth0匹配数据包进入时的接口
-oiptables -A FORWRAD -o eth0匹配数据包出去时的接口
-fiptables -A INPUT -f匹配一个被分片的包的第二片或之久的部分
  1. TCP匹配,必须有-p tcp前提
match举例说明
--sportiptables -A INPUT -p tcp --sport 22基于tcp包的源端口匹配,可以设置连续的端口,也可以加!取反
--dportiptables -A INPUT -p tcp --dport 22基于tcp包的目的端口匹配
--tcp-flagsiptables -p tcp --tcp-flags SYN匹配tcp的指定包
  1. UDP匹配,必须有-p udp
match举例说明
--sportiptables -A INPUT -p udp --sport 22基于udp包的源端口匹配,可以设置连续的端口,也可以加!取反
--dportiptables -A INPUT -p udp --dport 22基于udp包的目的端口匹配
  1. ICMP匹配
match举例说明
--icmp-typeiptables -A INPUT -p icmp --icmp-type 8根据ICMP类型匹配包,8代表echo request(ping请求)
  1. 显式匹配(常见有用的几种)
  • limit匹配
match举例说明
--limitiptables -A INPUT -m limit --limit 3/hour设置单位时间内可以匹配包数,默认1小时3次
--limit-burstiptables -A INPUT -m limit --limit-burst 5单位时间最多匹配的包数
  • mac地址匹配

基于包的mac源地址匹配包

match举例说明
--mac-sourceiptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

地址格式:XX:XX:XX:XX:XX:XX;也可以使用!取反

  • 多端口匹配

必须配合-m multiport使用

注:同一个规则内不能同时使用标准端口匹配和多端口匹配如 --sport 1024:63353 -m multiport 22,53,80

  • 状态匹配 必须配合 ==-m state==使用,常用的几个状态:RELATED,ESTABLISHED

例:iptables -A INPUT -m state --state RELATED,ESTABLISHED

targets/jumps

决定匹配的数据包如何处理,语法:-j target

  • ACCEPT target 接收数据包
  • DNAT target

将接收的数据包的目的地址修改为本地ip;设置多个ip可以实现负载均衡!

选项--to-destination
例子iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 194.236.50.155-194.236.50.160:1024-32000
说明指定源地址和端口
  • SNAT target

多个主机共享一个Internet连接,将所有从本地出去的包的源地址哪位Internet的地址。

选项--to-source
例子iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.1.1-192.168.1.10
说明指定要写入ip头的地址,即转发到的ip地址
  • DROP target 丢弃数据包
  • MASQUERADE target (只能用于nat表的POSTROUTING链)
选项--to-ports
例子iptables -t nat -A POSTROUTING -p tcp -j MASQUERADW --to-ports 1024-31000
说明在指定TCP或UDP的前提下,设置外出包能使用的端口
  • REJECT target
选项--reject-with
例子iptables -A FORWARD -p tcp --dport 22 -j REJECT --reject-with tcp-reset
说明指定reject数据包时返回什么信息
参考引用
  1. "iptables tutorial 1.2.2" by Oskar Andreasson https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
  2. "Iptables 指南 1.1.19" by sllscn https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
  3. ICMP类型表: https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#ICMPTYPES

本文为上述引用中的2个iptables指南(应该说是1个,作者Oskar Andreasson)的部分基础知识。中文版由sllscn翻译,英文原版由Oskar自己维护更新,最新为1.2.2,相对于中文版更新了部分新内容,觉得自己英文水平还ok的可以查看英文原版,网址链接如上。

转载于:https://my.oschina.net/LuCastiel/blog/1550673

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值