Linux上的iptables命令

本文详细介绍了Linux上的iptables命令,包括iptables对报文流向的检测,内置和自定义链,规则管理和匹配条件,以及NAT转换如SNAT、DNAT和PNAT的使用。讲解了基本匹配和扩展匹配,如multiport、iprange、mac、string和time等扩展选项,并提供了丰富的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


iptables对报文流向的检测

路由功能发生的时间点
报文进入本机后判断目标主机是否为本机

  • 是:INPUT进入本机用户空间
  • 否:FORWARD进行转发功能

报文离开本机之前判断由哪个接口送往下一跳

在这里插入图片描述

在这里插入图片描述

内核中数据包的传输过程

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
  • 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
  • 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

iptables规则

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
匹配条件:默认为与条件,同时满足

  • 基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
  • 扩展匹配:通过复杂高级功能匹配
  • 处理动作:称为target,跳转目标
  • 内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG…
  • 自定义处理动作:自定义chain,利用分类管理复杂情形

规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain:

  • 内置链:每个内置链对应于一个钩子函数
  • 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效

iptables命令

类型:

man  iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

规则格式: iptables[-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname[per-target-options]
-t table:
raw, mangle, nat, [filter]默认

SUBCOMMAND:

1、链管理:
-Nnew, 自定义一条新的规则链
-Xdelete,删除自定义的空的规则链
-PPolicy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT接受
DROP丢弃
-E重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
2、查看:
-Llist, 列出指定鏈上的所有规则,本选项须置后
-nnumberic,以数字格式显示地址和端口号
-vverbose,详细信息
-vv更详细
-xexactly,显示计数器结果的精确值,而非单位转换后的易读值
–line-numbers显示规则的序号
常用组合-vnL /-vvnxL–line-numbers
-Sselected,以iptables-save 命令格式显示链上规则
3、规则管理:
-Aappend,追加
-Iinsert, 插入,要指明插入至的规则编号,默认为第一条
-Ddelete,删除

(1) 指明规则序号
(2) 指明规则本身

-Rreplace,替换指定链上的指定规则编号
-Fflush,清空指定的规则链
-Zzero,置零

iptables的每条规则都有两个计数器

  • 匹配到的报文的个数
  • 匹配到的所有报文的大小之和

chain(总共五个链):PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

iptables匹配规则

匹配条件

  • 基本:通用的,PARAMETERS
  • 扩展:需加载模块,MATCH EXTENTIONS
1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
添加选项含义
-s–source address[/mask][,…]:源IP地址或范围
-d–destination address[/mask][,…]:目标IP地址或范围
-p–protocol protocol:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mhor “all“ 参看:/etc/protocols
-i–in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-o–out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
2 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效

查看帮助man iptables-extensions

(1)隐式扩展:

在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

tcp协议的扩展选项
选项含义
- -source-port, - -sport port[:port]匹配报文源端口,可为端口范围
- -destination-port,- -dportport[:port]匹配报文目标端口,可为范围
- -tcp-flags mask compmask 需检查的标志位列表,用,分隔例如SYN,ACK,FIN,RST. comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
- -syn用于匹配第一次握手,相当于:–tcp-flags SYN,ACK,FIN,RST SYN
(2)显式扩展:

必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
[-m matchname[per-match-options]]

iptables命令的扩展选项
1、multiport扩展

以离散方式定义多端口匹配,最多指定15个端口
指定多个源端口:--source-ports,--sports port[,port|,port:port]...
指定多个目标端口: --destination-ports,--dportsport[,port|,port:port]...
多个源或目标端口 --ports port[,port|,port:port]...
示例:

iptables-A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp-m multiport –dports 20,22,80 -j ACCEPT
2、iprange扩展

指明连续的(但一般不是整个网络)ip地址范围
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
示例:

iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3、mac扩展

指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT 链
格式: --mac-source XX:XX:XX:XX:XX:XX
示例:

Iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
4、string扩展

对报文中的应用层数据做字符串模式匹配检测
–algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris

  • –from offset 开始偏移
  • –to offset 结束偏移
  • –string pattern:要检测的字符串模式
  • –hex-string pattern:要检测字符串模式,16进制格式

示例:

iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “baidu" -j REJECT
5、time扩展

根据将报文到达的时间与指定的时间范围进行匹配
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  • –timestart hh:mm[:ss] 时间
  • –timestop hh:mm[:ss]
  • –monthdays day[,day…] 每个月的几号
  • –weekdays day[,day…] 星期几
  • –kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC

示例:
每周的星期六和星期日的14:30-18:30时间段内源ip为172.16.0.0目的ip为172.16.100.10端口为80的tcp数据包使之丢弃

iptables-A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6、connlimit扩展

根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击–connlimit-upton:连接的数量小于等于n时匹配
–connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
示例:
目的ip为172.16.100.10的ssh连接最大不能超过两台:

iptables-A INPUT -d 172.16.100.10 -p tcp--dport22 -m connlimit--connlimit-above 2 -j REJECT

NAT

NAT: network address translation
存在于PREROUTING,INPUT,OUTPUT,POSTROUTING链上

  • 请求报文:修改源/目标IP,由定义如何修改
  • 响应报文:修改源/目标IP,根据跟踪机制自动实现
SNAT:source NAT POSTROUTING, INPUT

让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP

--to-source [ipaddr[-ipaddr]][:port[-port]]

格式:iptables-t nat-A POSTROUTING -s LocalNET! -d LocalNet-j SNAT --to-source ExtIP
示例:
在POSTROUTING链上将源ip10.0.1.0通过nat转换成172.18.100.6-172.18.100.9之间的ip

iptables-t nat-A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24-j SNAT --to-source 172.18.100.6-172.18.100.9
DNAT:destination NAT PREROUTING, OUTPUT

把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP

--to-destination [ipaddr[-ipaddr]][:port[-port]]
格式:iptables-t nat-A PREROUTING -d ExtIP-p tcp|udp--dportPORT -j DNAT --to-destination InterSeverIP[:PORT]
示例:
通过nat转换技术将通过22端口的tcp数据包目的ip172.18.100.6转换成目的ip为10.0.1.22

iptables-t nat-A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp--dport22 -j DNAT --to-destination 10.0.1.22

通过nat转换技术将目的ip为172.18.100.6的端口80转换成目的ip为10.0.1.22的8080端口

iptables-t nat-A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp--dport80 -j DNAT --to-destination 10.0.1.22:8080
PNAT: port nat,端口和IP都进行修改
转发

可用于:PREROUTING OUTPUT 以及 自定义链
通过改变目标IP和端口,将接受的包转发至不同端口
--to-ports port[-port]
示例:
将目的ip为172.16.100.10的tcp80端口的数据包转发到8080端口

iptables-t nat-A PREROUTING -d 172.16.100.10 -p tcp--dport80 -j REDIRECT --to-ports 8080
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值