Iptables

iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端[broken link: invalid section] 和 图形界面[broken link: invalid section] 配置。iptables 用于 ipv4,ip6tables 用于 ipv6


基本概念

iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表 的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为 目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用 链 和 规则。很多新手面对复杂的 linux IP 路由时总是感到气馁,但是,实际上最常用的一些应用案例(NAT 或者基本的网络防火墙)并不是很复杂。 –ArchWiki

linux iptables docker 配置 iptables 内核配置_自定义

linux iptables docker 配置 iptables 内核配置_iptables linux_02

表(tables)

iptables包含4张表

  1. raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
  2. filter 是用于存放所有与防火墙相关操作的默认表。
  3. nat 用于 网络地址转换(例如:端口转发)。
  4. mangle 用于对特定数据包的修改(参考 损坏数据包)。

大部分情况仅需要使用filter和nat。

链(chains)

5条链

  1. PREROUTING
  2. INPUT
  3. FORWARD
  4. OUTPUT
  5. POSTROUTING

表由链组成,链是一些按顺序排列的规则的列表。默认的 filter 表包含 INPUT, OUTPUT 和 FORWARD 3条内建的链,这3条链作用于数据包过滤过程中的不同时间点,参考流程图。nat 表包含PREROUTING, POSTROUTING 和 OUTPUT 链。

默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。链的默认规则通常设置为 ACCEPT,如果想确保任何包都不能通过规则集,那么可以重置为 DROP。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。

用户可以加入自己定义的链,从而使规则集更有效并且易于修改。

1)对自定义链的操作

#默认为filter表

#给表中添加一条自定义规则链
iptables [-t table] -N chain_name

#删除一条自定义规则链
iptables -X chain_name

#修改自定义链名
iptables -E old_chain_name new_chain_name

2)对链的操作

#为链指定默认处理机制
iptables -P chain_name target

#清空链中的规则
iptables -F chain_name

#列出表中所有的链与链的规则,[-n]数字格式显示,[-v]详细格式信息
iptables -L [-n] [-v]

iptables -L -n -v

pkts

packets, 被本规则所匹配到的报文的个数

bytes

被本规则所匹配到的所有报文的大小之和,会执行单位换算

target

目标,即处理机制

prot

协议,一般为[TCP

opt

可选项

in

数据包的流入接口

out

数据包的流出接口

source

源地址

destination

目标地址

3)表和链的对应关系

表和链对应关系

filter

INPUT,FORWARD,OUTPUT

nat

PREROUTING,OUTPUT,POSTROUTING

mangle

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

raw

PREROUTING,OUTPUT

规则(rules)

数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。

规则命令

#添加一条规则
iptables -A chain_name rule

#删除一条规则
iptables -D chain_name rule_number

#插入一条规则
iptables -I chain_name rule_number rule

#修改一条规则
iptables -R chain_name rule_number new_rule

#只显示指定链上的规则添加命令
iptables -S chain_name

规则 = 匹配条件 + 处理机制

处理机制

  • DROP
  • REJECT
  • ACCEPT
  • SNAT
  • DNAT
  • RETURN
  • REDIRECT
  • LOG

匹配条件

参数

-s

匹配原地址,可以IP,也可以网络地址;可以使用!操作符取反, ! 172.16.0.0/16

-d

匹配目标地址

-p

匹配协议,通常只使用{TCP

-i

数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING

-o

流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING

隐含匹配

参数

–dport

匹配的目标端口

–sport

匹配的源端口

–tcp-flags

例:rst,syn,ack,fin syn。表示,rst,syn,ack,fin中除了syn=1其他都为0

–icmp-type

8请求,0相应

基于模块做扩展匹配

模式:-m 扩展模块名称 --专用选项1 --专用选项2...

multiport:多端口匹配,最多15个

  • –dports:目标端口
  • –sports:源端口

iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange:ip地址范围

  • [!] –src-range from[-to]
  • [!] –dst-range from[-to]

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

time:指定时间范围

  • datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  • –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  • –timestart hh:mm[:ss]
  • –timestop hh:mm[:ss]
  • [!] –weekdays day[,day…]

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT

string:字符串匹配

  • –algo{bm | kmp}:字符串匹配查找时使用算法
  • –string “STR”:要查找的字符串
  • –hex-string “HEX-STR”:要查找的字符,先编码成16进制格式

connlimit:每个IP对指定服务的最大并发连接数

  • –connlimit-above [n]

limit:保温速率控制

  • –limit #[/second|/minute|/hour|/day]
  • –limit-burst #

state:状态匹配

  • –state NEW
  • –state ESTABLISHED
  • –state RELATED
  • –state INVALID