前言

iptables:包过滤型防火墙

真正防火墙功能是内核实现的,iptables只不过是一个用户定义规则的工具。

防火墙最重要的四表五链:

四表

表名 功能
filter 过滤,防火墙
nat 网络地址转换
mangle 拆解、修改、封装
raw 关闭nat表上启用的连接追踪

五链(钩子函数)

链名 特性(位置)
PREROUTING 在路由发生之前,进入网卡,但未到路由
INPUT 到本机的
FORWARD 由本机转发
OUTPUT 本机内部发出
POSTROUTING 路由发生以后,数据离开网卡之前

数据流向

流入:PREROUTINNG --> INPUT
流出:OUPUT --> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTIN

各功能的实现

功能 实现链
filter INPUT,FORWARD,OUTPUT
nat PREROUTING(DNAT目标地址转换),OUTPUT,POSTROUTING(SNAI源地址改变)
mangle PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw PREROUTING,OUTPUT

功能的优先级: raw > mangle > nat > filter

pkts:由规则或链匹配到的报文个数;
bytes:由规则和链匹配到的所有报文大小之和;

一:iptables命令

iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET

SUBCOMMAND 子命令
CHAIN   链
CRETERIA  规则
TARGET 匹配后的操作

-t table

filter, nat, mangle, raw
省略时为filter

1.链管理

子命令 功能
-F CHAIN 清空规则链;省略链表示清除全部规则
-N CHAIN_NAME 创建新的自定义规则链
-X CHAIN_NAME 删除用户自定义的链,不带参数删除全部自定义链,不能删除被引用链
-Z 清零,置零规则计数器
-P 设置指定链的默认处理规则
-E 重命名自定义链,引用计数不为零的自定义链,无法改名,也无法删除

2.规则管理

子命令 功能
-A 将新规则追加于指定链的尾部
-I 将规则插入至指定链的指定位置
-D 删除指定链上的指定规则(1.指定匹配条件2.指定规则编号)
-R 替换指定链上的指定规则
-L :查看指定链上的所有规则
    子命令:
    -n: 以数字格式显示地址和端口号
    -v: 显示详细信息
    -vv,-vvv
    --line-number:显示规则编号
    -x: 显示计数器计数结果的精确值

3.目标

- j TARGET
TARFET Features
ACCEPT 接受
DROP 丢弃
REJECT 拒绝
RETRUN 返回调用链
REDIRECT 端口重定向
LOG 记录日志
MARK 做防火墙标记
DNAT 目标地址转换
SNAT 源地址转换
MASQUERRADE 地址伪装
... ...

4.匹配条件

(1).基本匹配:

[!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围;
[!] -d, --dst, --destination IP|Netaddr: 检查报文中目标IP是否符合此处指定的地址范围;
-p, --protocol {tcp|udp|icmp}:检查报文中的协议;
-i, --in-interface IFACE:数据报文的流入接口(物理);
-o, --out-interface IFACE:数据报文的流出接口(物理);仅能用于FORWARD,OUTPUT,POSTROUTING链上

(2).扩展匹配

-m macth_name  --spec_options
例如: -m tcp --dport 22

隐式扩展

-p protocol 指明的协议进行扩展,可省略-m选项

-p tcp
    --dport PORT[-PORT]:目标端口,可以是单个端口或连续端口
    --sport PORT[-PORT]:源端口,可以是单个端口或连续端口
    --tcp-flags LIST1 LIST2:tcp的标志位,检查LIST1所指明的所有标记位必须为1,且余下(LIST2)的必须为0,没有LIST1中指明的,不做检查
        示例: --tcp-flags SYN,ACK,FIN,RST SYN 表示检查是否为第一次建立tcp请求
            --syn 和上面的示例同理
-p udp
    --dport PORT[-PORT]:目标端口,可以是单个端口或连续端口
    --sport PORT[-PORT]:源端口,可以是单个端口或连续端口
-p icmp
    --icmp-type
        可用数字表示其类型:
        0: echo-reply 回送应答,一般做在OUTPUT
        8: echo-request 接受应答,INPUT

显式扩展

必须显式指明使用的扩展模块,查看支持的模块rpm -ql iptables "*.so"

1.multiport扩展
以离散方式定义多端口匹配;最多指定15各端口;

[!]--source, --sports port[,port|,port|,port:port]...
    指明多个源端口
[!]--destination-ports, --dports port[,port|,port|,port:port]...
    指明多个目标地址
[!] --ports port[,port|,port|,port:port]...  源和目标端口都匹配

示例:放行源地址为192.168.123.203,协议为tcp的 21,22,80端口入站

~]# iptables -A INPUT -p tcp -d 192.168.123.203 -m multiport --dports 21:22,80 -j ACCEPT

2.iprange扩展(ip范围)
指定连续的(但一般不能扩展为整个网络)IP地址范围时使用

[!] --src-range from[-to]: 指明连续的源ip地址范围
[2] --dst-range from[-to]: 指明连续的目标ip地址范围

示例:允许源地址为192.168.123.203,为ip范围(192.168.123.1-192.168.123.100)目标地址,端口22,21,80出站

~]# iptables -A OUTPUT -p tcp -s 192.168.123.203 -m multiport --sports 21:22,80 -m iprange --dst-range 192.168.123.1-192.168.123.100 -j ACCEPT

3.string扩展
基于字符串匹配协议传输单元的内容
检查报文中出现的字符串

--algo {bm|kmp} 指明字符对比算法,任选一个即可(必须指定选项)
[!] --string pattern :指明匹配字符

示例:报文中含有movie不允许出站,注意单引号,要放在打开80端口规则之前(同类资源),不然匹配不到当前规则

~]# iptables -I OUTPUT -m string --algo kmp --string 'movie' -j REJECT

这里需要注意,假设在OUTPUT链放行了80端口,这里拒绝匹配字符出站要在放行80端口之前,否则无效.

4.time扩展

--datestart YYYY[-MM[-DD]] 起始日期
--datestop YYYY[-MM[-DD]] 结束日期
--timestart 只匹配时间
--timestop
--monthdays :1-31 天(月)
--weekdays : 1-7 周

示例:再INPUT上做限制,0-23点来自80端口的访问,全部丢弃。

~]# iptables -I INPUT -d 192.168.123.203 -p tcp --dport 80 -m time --timestart 0:00 --timestop 23:59 -j DROP

iptables的时区不是中国时区,中间有8小说时差.

5.connlimit
设置每当个客户端IP(也可以是地址块)做并发数量匹配

--connlimit-above n : 连接数量大于n
--connlimit-upto n :连接数量小于n
--connlimit-mask 

示例:只允许一个客户端ip连接三个SSH服务

~]# iptables -I INPUT -p tcp -d 192.168.123.203 --dport 22 -m --connlimit-above 3 -j REJECT

6.limit 扩展
基于报文的速率做检查;令牌桶过滤器

--limit rate[/second|/minute|/hour|/day] 发包速率,多少时间以恶搞
--limit-burst number 并发数量,当前数量就限制速率

例如吃饭,这个饭店同时只能容纳100个人,但是一共来了200人,饭店只能暂时不接客,过段时间继续接客

示例:icmp包一次允许5个,到达五个峰值后,两秒再放行(ping)

iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT 

7.state扩展(*)
根据连追踪机制检查连接的状态;

需要调整追踪功能所够容纳的最大连接,因为容纳数满后,后面连接进来的全部会被拒绝

调整最大限制

/proc/sys/net/nf_conntrack_max
默认:65536,对于繁忙的服务器是不够用的
~]# systcl -w net.nf_conntrack_max=number

查看:

已经追踪并记录下的连接
/proc/sys/net/nf_conntrack
不同协议或连接类型追踪的时长:
/proc/sys/net/netfilter/

可追踪的连接状态

状态 意义
NEW 新发出的连接请求;连接追踪模板中不存在此连接相关条目,因此,将其识别为新发起的请求
ESTABLISHED NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态
RELATED 相关的连接;如ftp协议的命令连接与数据之间的关系
INVALIED 无法识别的连接
--state STATE,STATE2 ...

示例:入站只允许80端口,NEW和ESTABLISH入站,出站只允许ESLTABLISHED,不允许新连接出站

~]# iptables -I INPUT -p tcp --dport 80 -d 192.168.123.203 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -p tcp --sport 80 -s 192.168.123.203 -m state --state ESTABLISHED -j ACCEPT

三:iptables保存/载入规则

保存规则

~]# iptables-save > /etc/sysconfig/iptables
#保存到这个文件,iptables服务启动(重启)会自动载入规则

载入规则

~]# iptables-restore < /etc/sysconfig/iptables
#载入指定规则

四:配置文件

/etc/sysconfig/iptables-conf

其中可以定义iptables需要的内核模块

IPTABLES_MODULES="MODLUE1,MODULE2,..."

例如:支持ftp的模块

IPTABLES_MODULES="nf_conntrack_ftp"
#启动iptables时会自动加载该模块
modprobe 模块名 #手动装载模块


End
Last modification:October 1st, 2019 at 05:14 pm
If you think my article is useful to you, please feel free to appreciate