了解iptables

特点

运行内核上,不需要启动进程

功能

  • filter 过滤
  • nat 地址转换
  • mangle 拆解报文 修改 再封装
  • raw 关闭nat表连接追踪功能

  • prerouting 路由前
  • input 到达本机内部的报文必经之路
  • forward 由本机转发的报文必经之路
  • output 由本机发出的报文必经之路
  • postrouting 路由后

数据报文流程

  • 流入 prerouting -> input
  • 流出 output -> postrouting
  • 转发 prerouting -> forward -> postrouting

总结 四表五链

  • 四表 filter nat mangle raw
  • 五链 prerouting input forward output postrouting

优先级

  • prerouting raw –> mangle –> nat
  • raw –> mangle –> nat –> filter (任意链执行优先级)

数据经过防火墙流程

​ input ouput

​ (mangle –> [nat] –> filter) (raw –> mangle –> nat –> filter)

入–> prerouting –> 路由判断 –> forward –> postrouting –>出

(raw –> mangle –> nat) (mangle –> nat) (mangle –> nat)

表和链的关系

  • filter input forward output
  • nat prerouting(snat) output postrouting(dnat) (centos7 还有input centos6没有)
  • mangle prerouting input forward output postrouting
  • raw prerouting output

匹配条件

  • 基本匹配条件 source IP destination IP

  • 扩展匹配条件 源端口 目标端口

处理动作

  • ACCETP 允许数据包通过
  • DROP 丢弃数据包
  • REJECT 拒绝数据包
  • SNAT 源地址转换
  • MASQUERADE
  • DNAT 目标地址转换
  • REDIRECT 端口映射
  • LOG /var/log/message 记录日志

命令详解

iptables -nvL

pkts 对应规则匹配到的报文数

bytes 对应规则匹配到的报文的大小总和

target 规则的动作

prot 协议

opt 规则对应选项

in 数据包由那个网卡流入

out 数据包由那个网卡流出

source 对应源地址 一个IP或IP段

destination 对应目标地址 一个IP或IP段

policy 表示某链默认策略

packets 默认策略匹配到包数量

bytes 默认策略匹配到包大小总和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#-t默认参数filter -L 列出规则
iptables -t 表名(filter nat mangle raw) -L
#查看具体链的规则
iptables -t 表名 -L 链名
#查看详情更多信息 -v
iptables -vL
#对规则中IP或端口反解 -n
iptables -nvL
#显示序号 可以简写 --line
iptables -nvL --line-number
#显示精确计数值 -x
iptables -nxvL INPUT
#例子
iptables --line -t filter -nvxL
iptables --line -t filter -nvxL INPUT

1
2
3
4
5
6
#增加 I行首插入 -s 源地址
iptables -t filter -I INPUT -s 1.1.1.1 -j DROP
#指定行号插入
iptables -t filter -I INPUT 2 -s 1.1.1.1 -j DROP
#A 追加 末尾添加
iptables -t filter -A INPUT -s 1.1.1.1 -j DROP

1
2
3
4
5
6
#指定行号删除
iptables -t filter -D INPUT 1
#指定匹配条件删除
iptables -D INPUT -s 1.1.1.1 -j ACCEPT
#删除指定链所有规则
iptables -F INPUT

1
2
3
4
#指定匹配条件要完整
iptables -R INPUT 1 -s 1.1.1.1 -j ACCEPT
#修改链默认策略
iptables -P FORWARD DROP

保存

1
2
3
4
service iptables save
iptables-save > /etc/sysconfig/iptables
#从指定文件重新载入规则
iptables-save < /etc/sysconfig/iptables

匹配条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#一次指定多个用逗号隔开 -s匹配源地址 -d匹配目标地址
iptables -I INPUT -s 1.1.1.1,2.2.2.2 -j DROP
#指定IP段
iptables -I INPUT -s 192.168.8.1/25 -j DROP
#取反!
iptables -I INPUT -s ! 1.1.1.1 -j DROP
#-d匹配目标地址 阻止1.1.1.1向2.2.2.2发送报文
iptables -I INPUT -s 1.1.1.1 -d 2.2.2.2 -j DROP
#协议类型 -p(tcp udp icmp icmp6)
iptables -I INPUT -s 1.1.1.1 -d 2.2.2.2 -p tcp -j DROP
#-i 指定流入网卡接口 (prerouting input forward)
iptables -I INPUT -p icmp -i eth0 -j REJECT
#-o 指定流出网卡接口 (forward output postrouting)
iptables -I OUTPUT -p tcp -o eth1 -j REJECT

扩展匹配条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#tcp --dport目标端口使用前需要先指定协议 如-p tcp -m tcp 指定对应扩展模块 
#-m可省略默认会找-p相同模块 !取反 --tcp-flags --syn 新建链接请求报文
iptables -I INPUT -s 1.1.1.1 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 888 --syn -j REJECT
#--sport 源端口 支持端口范围300:500 :300 500: !取反
iptables -I INPUT -s 1.1.1.1 -p tcp --sport 22 -j ACCEPT
#--sport --dport不能加离散多个端口 可以借助multiport模块 !取反
iptables -I INPUT -s 1.1.1.1 -p tcp -m multiport --sport 33,21,25 -j ACCEPT
#iprange --src-range 源IP段 --dst-range 目标IP段 !取反
iptables -I INPUT -m iprange --src-range 192.168.3.20-192.168.3.60 -j DROP
#string --algo 指定算法可选bm kmp --string 指定匹配字符串
iptables -I INPUT -m string --algo bm --string "ropon" -j REJECT
#time --timestart起始时间 --timestop结束时间 --weekdays指定星期几 --monthdays指定每个月那一天
#--datestart --datestop 指定具体日期范围 --monthdays --weekdays 可以!取反
iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 08:54:00 --timestop 08:56:00 -j REJECT
iptables -I OUTPUT -p tcp --dport 443 -m time --timestart 08:54:00 --timestop 08:56:00 -j REJECT
iptables -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -I OUTPUT -p tcp --dport 443 -m time --datestart 2020-07-27 --datestop 2020-07-29 -j REJECT
#connlimit --connlimit-above 每个IP链接数量上限 --connlimit-upto含义等于! --connlimit-above
#--connlimit-mask指定某类网段
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
#limit --limit 10/minute 每分钟最多放行10个包 6s放1个 --limit-burst空闲时可放行包的数量默认5
#令牌桶原理 /second /minute /hour/day
iptables -I INPUT -p icmp -j REJECT
iptables -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
#udp --dport --sport 离散端口可以借助multiport
iptables -I OUTPUT -d 119.29.29.29 -p udp --dport 53 -j ACCEPT
iptables -I OUTPUT -d 119.29.29.29 -p udp -m multiport --dport 53,54 -j ACCEPT
#icmp 发出ping请求属于类型8的icmp报文 对方ping回应报文属于类型0的icmp报文
iptables -I INPUT -p icmp -j REJECT
#服务器内可以ping其他服务器但禁ping
iptables -I INPUT -p icmp --icmp-type 8 -j REJECT
#同上
iptables -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
#state NEW建立链接第一个包 ESTABLISHED链接已建立 RELATED关系(FTP)
#INVALID包未被识别 UNTRACKED包未被追踪
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
#默认策略P
iptables -P INPUT DROP

自定义链

1
2
3
4
5
6
7
8
#-N 新建一个链
iptables -N IN_WEB
iptables -I INPUT -p tcp --dport 888 -j IN_WEB
iptables -I IN_WEB -s 1.2.3.4 -j REJECT
#-E 修改自定义链
iptables -E IN_WEB WEB
#-X 删除自定义链 自定义链没有被引用 自定义链为空(没有任何规则)
iptables -X WEB

动作 扩展动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#基本动作
ACCEPT DROP
#扩展动作
REJECT 选项--reject-with 提示信息
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable #默认
icmp-proto-unreachable
icmp-net-prohibted
icmp-host-prohibted
icmp-admin-prohibted
iptables -I INPUT -p icmp -j REJECT --reject-with icmp-host-unreachable
#LOG 将相关信息记录日志中(/var/log/message)
iptables -I INPUT -p icmp -j LOG
#SNAT --to-source匹配报文源IP修改为192.168.8.8
iptables -t nat -A POSTROUTING -s 1.1.1.0/16 -j SNAT --to-source 192.168.8.8
#DNAT --to-destination匹配报文目标地址修改为1.1.0.1:22
iptables -t nat -A PREROUTING -d 192.168.8.8 -p tcp --dport 22 -j DNAT --to-destination 1.1.0.1:22
#MASQUERADE 动态获取IP
iptables -t nat -A POSTROUTING -s 1.1.1.0/16 -o eth1 -j MASQUERADE
#REDIRECT 将本机80端口映射到本机888端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 888

具体命令

  • 查(–line-numbers 显示行号) iptables -t 表(默认filter) -nvL --line-numbers

  • iptables -I[A](insert append 插入 追加) 示例: input链最后追加 (放行80端口) iptables -A INPUT -p tcp --dport 80 -j ACCEPT input链第2行插入 iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

  • iptables -R INPUT 26 -p tcp --dport -j DROP

  • 删 -D 链名 行号

    -D INPUT -s 118.126.103.41 -j ACCEPT

  • iptables -D INPUT 1

详细命令

  • -P 设置默认策略 iptables -P INPUT (DROPACCEPT)
  • -F 清空规则链
  • -L 查看规则链
  • -A(append) 在规则链末尾追加规则
  • -I(insert) num 在规则链第几行插入规则
  • -D(delete) num 删除某一行的规则
  • -s 匹配来源IP/MASK 可以通过!取反
  • -d 匹配目标地址 与-s用法相同
  • -i 网卡名称(eth0) 匹配指定网卡流入的数据
  • -o 网卡名称(eth0) 匹配指定网卡流出的数据
  • -p 匹配协议(tcpudpicmp)
  • --dport num 匹配目标端口号
  • --sport num 匹配来源端口号
  • -j 动作(ACCEPTDROPREJECT)
  • -m 扩展参数(state --state ESTABLISHED,RELATED)

  • 注意放行本地回环网卡 否则本地调用127.0.0.1有异常 iptables -A INPUT -i lo -j ACCEPT