特点
运行内核上,不需要启动进程
功能
- 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
匹配条件
处理动作
- 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