iptables 汇总
iptables
一. 背景知识
1. 相关网络背景知识
(1) Linux 主机内部路由
Linux 在 内核中维护由一个路由表, 报文进入本机后, 由该路由表判断目标地址; 报文离开本机之前, 判断经由那个接口发出.
(2) TCP 报文格式
erg : 紧急指针是否有效.
ack : 确认号是否有效.
psh : 不再缓冲中停留, 直接发往内核.
rst : reset, 重置.
syn : 同步, 请求建立连接.
fin : 结束, 请求关闭连接.
(3) TCP 协议的三次握手和四次断开
(4) TCP 的有限状态机
2. iptables 简介
iptables 是 Linux 主机上的防火墙软件, 由两部分构成:
- iptables : 命令行工具, 用于编写 规则, 并可以实现规则的语法检查.
- netfilter : 网络过滤器, 内核中工作为 TCP/IP 协议栈上的框架.
3. netfilter 的四表五链
(0) 表与链
每个钩子函数上可以防止 n 条规则, 数据包在每条规则上依次匹配, 对应于每个钩子上的多条规则成为一个 链(CHAIN);
每个功能(表)有多个链, 所以成为 表
(1) 四表
filter : 包过滤
input --> forward --> outputNAT : 地址转换
prerouting --> output --> postroutingmangle : 修改报文首部中的某些信息;
prerouting --> input --> forward --> output --> postroutingraw : 关闭 nat 表上启动的链接追踪功能.
prerouting --> output
(2) 五链(5 个 hooks functions)
- prerouting : 进入本机后, 路由功能发生之前
- input : 到达本机内部
- output : 由本机发出
- forward : 由本机转发
- postrouting : 路由功能发生之后, 即将离开本机之前.
(3) 报文流向经由的位置
到本机内部
prerouting --> input由本机发出
output --> postrouting由本机转发
prerouting --> forward --> postrouting
(4) 链上规则的检查次序
匹配的内部机制 : 检查 IP 首部, 检查 TCP,UDP,ICMP 首部; 同时, 基于扩展机制, 可以进行额外的检查, 例如做链接追踪等.
- 每个 链 上的规则检查为
依次检查; - 当某个链上的某个规则被匹配之后, 则执行该规则的 target, 该链上的其他规则不再执行;
钩子函数(表)的优先级
在每个钩子(链)上, 规则是按不同的功能(表), 分别存放的. 每个数据包到来之后, 按表的优先级, 依次检查每一个链, 完成之后, 转到下一个链.优先级 : raw > mangle > nat > filter
(5) 规则编写最佳实践
写作规则的最佳实践:
- 同类规则 : 匹配范围
小的放在最前面; - 同类规则, 如果能
合并, 则尽量合并; - 不同类规则 : 匹配范围几率较大的放前面;
- 应该为每个链, 设置
默认规则;
二. iptables 规则编写
1. 添加规则时的考量点
- 要实现的功能 --> 判断添加到哪个表上;
- 报文流向及经由路径 --> 判断添加到哪个链上;
2. 规则和链的计数器
- pkts: 由规则或链匹配到的报文的个数;
- bytes:由规则或链匹配到的所有报文大小之和;
3. 规则的编写.
如果同时指定多个匹配条件, 则默认多个条件需要同时被满足.
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t TABLE:
默认为filter, 共有filter, nat, mangle, raw四个可用;
SUBCOMMAND:
链:
-F:flush,清空指定表的指定链上所有规则;省略链名时,清空表中的所有链;
-N:new, 新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;
-X:drop,删除用户自定义的空链;非空自定义链和内置链无法删除;
-Z:zero,将规则的计数器置0;
-P:policy,设置链的默认处理机制;当所有都无法匹配或有匹配有无法做出有效处理机制时,默认策略即生效;
filter表的可用策略:ACCEPT, DROP, REJECT
-E:rename,重命名自定义链;
注意:被引用中的链,无法删除和改名
规则:
-A:append,在链尾追加一条规则;
-I:insert,在指定位置插入一条规则;
-D:delete,删除指定的规则;rule or rulenum
-R:replace,替换指定的规则;
$ iptable -t filter -R INPUT 1 -s 172.16.100.2 -d 172.16.100.11 -p tcp -i eth0 -j ACCEPT
查看:
-L:list,列出指定链上的所有规则;
-n: numeric,以数字格式显示地址和端口号,即不反解;
-v: verbose,详细格式,显示规则的详细信息,包括规则计数器等;
-vv:
-vvv:
--line-numbers: 显示规则编号;
-x: exactly,显示计数器的精确值;
pkts bytes target prot opt in out source destination
pkts: 被本规则所匹配到的包个数;
bytes:被本规则所匹配到的所包的大小之和;
target: 处理目标 (目标可以为用户自定义的链)
prot: 协议 {tcp, udp, icmp}
opt: 可选项
in: 数据包流入接口
out: 数据包流出接口
source: 源地址
destination: 目标地址;
CHAIN :
指定要添加规则的链;
可以是自定义链. 注意:报文不可能经由自定义链(不再内核中),只有在被内置链上的引用才能生效(即做为自定义目标)
CRETERIA :
指定匹配条件.
1. 通用匹配
-s, --src, --source IP|Network:检查报文中的源IP地址;
-d, --dst, --destination:检查报文中的目标IP地址/网段
-p, --protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcp、udp或icmp三者之一;
-i, --in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT, FORWARD链上的规则;
-o, --out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT, POSTROUTING链上的规则;
2. 扩展匹配: 使用 iptables 的模块实现扩展检查机制.
(1) 隐式扩展 :
** 如果在通用匹配上使用 -p 选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;
1) tcp: -m tcp
--dport PORT[-PORT] # 必须是连续的端口
--sport
--tcp-flags LIST1 LIST2
LIST1: 要检查的标志位;
LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;
例如:--tcp-flags syn,ack,fin,rst syn # 表示 三次握手的第一次. 等同 --syn
--syn:用于匹配tcp会话三次握手的第一次;新建连接.
$ iptable -A INPUT 1 -s 172.16.100.2 -d 172.16.100.11 -p tcp [-m tcp] --dport 80 -j REJECT # -m tcp 可省略, 因为 -p tcp 指明了协议.
2) udp: -m udp
--sport
--dport
3) icmp: -m icmp
--icmp[-type] # ICMP TYPE CODE 表
8: echo request, ping 请求
0:echo reply, ping 响应
# 允许自己 ping 别人. 本机地址 为 172.16.100.11 .
$ iptables -A OUTPUT -s 172.16.100.11 -p icmp --icmp-type 8 -j ACCEPT
$ iptables -A INPUT -d 172.16.100.11 -p icmp --icmp-type 0 -j ACCEPT
(2) 显式扩展: 必须指明使用的扩展机制.
0) 通用语法格式:
-m 模块名称
每个模块会引入新的匹配机制;
查看可用模块:
小写字母,以.so结尾;
大写通常指 处理方式.
1) multiport扩展:以离散定义多端口匹配;最多指定15个端口;
专用选项:
--source-ports, --sports PORT[,PORT,...]
--destination-ports, --dports PORT[,PORT,...]
--ports PORT[,PORT,...] # 源和目标端口.
例子:
$ iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
$ iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
2) iprange扩展:指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
[!] --src-range IP[-IP] # 也支持单个 ip
[!] --dst-range IP[-IP] # 也支持单个 ip
示例:
$ iptables -A INPUT -d 172.16.100.11 -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.11 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
3) string扩展:对应用层首部和数据进行检查. 检查报文中出现的字符串,与给定的字符串作匹配;
字符串匹配检查算法:实现高效匹配. 两者相近.
kmp :
bm :
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
示例:
$ iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
4) time扩展:基于时间区间做访问控制
专用选项:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]]
--dattestop YYYY[-MM][-DD][hh[:mm[:ss]]]
--timestart
--timestop
--weekdays DAY1[,DAY2,...]
示例:
$ iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
5) connlimit扩展:基于连接数作限制;对每个IP能够发起的并发连接数作限制;
专用选项:
--connlimit-above [n] # 包含 n .
$ iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
6) limit扩展:基于令牌桶算法实现的.基于发包速率作限制;
专用选项:令牌桶算法
--limit n[/second|/min|/hour|/day]
--limit-burst n # 突发速率时, 最大速率.
$ iptables -R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
** limit 仅按一定速率匹配数据, 若限制, 先放过一定速率的数据, 然后阻断.
$ iptables -A FORWARD -p icmp -s 172.16.11.0/24 -m limit --limit 10/s -j ACCEPT
$ iptables -A FORWARD -p icmp -s 172.16.11.0/24 -j DROP
7) state扩展:启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;
启用连接追踪功能之前:简单包过滤防火墙;
启用连接追踪功能:带状态检测的包过滤防火墙;
# 反弹式木马: 木马可以探测主机开放的端口, 并使用该端口作为客户端,想外发送请求, 从而出入的连接成为 ESTABLISHED 状态.
专用选项:
--state STATE
$ iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
$ iptables -I OUTPUT 1 -d 172.16.100.11 -m state --state ESTABLISHED -j ACCEPT
调整连接追踪功能所能容纳的连接的最大数目:
$cat /proc/sys/net/nf_conntrack_max
$ lsmod | grep nf_conntrack # 查看是否打开连接追踪功能.
$ modprobe -r nf_conntrack
$ modprobe -r nf_conntrack_ipv4
当前追踪的所有连接:
/proc/net/nf_conntrack
不同协议或连接类型追踪时的时长属性:
/proc/sys/net/netfilter/
如何放行被动模式下的ftp服务:
(1) 装载模块:
# modprobe nf_conntrack_ftp
(2) 放行请求报文
放行入站请求端口为21的请求报文;
放行所有状态为ESTABLISHED和RELATED状态的入站报文;
(3) 放行出站响应报文
放行所有状态为ESTABLISHED的出站报文;
8) recent 扩展 : 利用iptables的recent模块来抵御DOS攻击.
示例:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH # SSH 只是个名字, 用于日志记录 /var/log/messages .
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attack: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
# 防止被探测 SSH 密码
$ iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -m recent --name SSH --update --seconds 10 --hitcount 4 --rsource -j DROP
TARGET:
-j: jump,跳转目标
内置目标:
ACCEPT : 接受
DROP : 丢弃
REJECT : 拒绝
SNAT
DNAT
MASQUERADE
LOG:日志
REDIRECT:端口重定向;
RETURN: 返回至调用者;
MARK:防火墙标记, 用于 mangle 表中. 见 LVS.
4. NAT : Network Address Translation
(1) 分类:
NAT : 工作于 3 和 4 层. 并非是用户空间运行的进程完成转换功能,靠的是内核中地址转换规则;
仅从请求报文判断,地址转换:
源地址转换:SNAT
SNAT: CIP --> SIP: CIP --> SNAT(PIP) --> SIP
CIP: 本地客户端地址目标地址转换:DNAT
DNAT:RemoteIP --> PIP: RemoteIP --> DNAT(SIP) --> SIP
RemoteIP:远程客户端地址;端口转换:PNAT
通常在 DNAT 中实现.
(2) SNAT:主要用于实现让内网客户端访问外部主机时使用;
注意:
- 要定义在
POSTROUTING链;也可以在OUTPUT上使用(较少); 需要打开网络间转发:
echo 1 > /proc/sys/net /ipv4/ip_forward
定义方法:
$ iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j SNAT --to-source NAT服务器上的某外网地址
另一个TARGET:
MASQUERADE:地址伪装;
能自行判断该转为哪个源地址;
iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j MASQUERADE
示例:
$ iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.11 # 172.16.100.11 为本机的一个接口.
(3) DNAT:主要用于发布内部服务器,让内网中的服务器在外网中可以被访问到;
注意:
- 要定义在PREROUTING链;
定义方法:
$ iptables -t nat -A PREROUTING -d NAT服务器的某外网地址 -p 某协议 --dport 某端口 -j DNAT --to-destination 内网某服务器地址[:PORT]
示例:
$ iptables -t nat -A PREROUTING -d 172.16.100.11 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.7
(4) FULLNAT: 全地址转换, 见 LVS.
在请求报文到时:既修改源地址,又修改目标地址; 响应报文也是.
5. 规则的保存与重载.
保存:
service iptables save # 保存到 /etc/sysconfig/iptables 文件;
iptables-save > /PATH/TO/SOMEFILE # 自定义保存文件
重载:
service iptables reload # 使用默认保存文件
iptables-restore < /PATH/FROM/SOMEFILE # 使用自定义保存文件.
三. 其他相关
REDIRECT 与 DNAT 的区别?
$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to 3128
$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.16.11.1:3128
$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to-destination 172.16.11.250
结论
- REDIRECT 是 DNAT 的一个特例.
- DNAT的功能更强大.
MASQUEREAD 与 SNAT 的区别?
$ iptables -t nat -s 172.16.11.0/24 -o eth0 -j MASQUERADE
$ iptables -t nat -s 172.l6.11.0/24 -o eth0 -j SNAT --to 123.123.123.123
$ iptables -t nat -s 172.l6.11.0/24 -o eth0 -j SNAT --to 123.123.123.1-123.123.123.10
结论:
- MASQUERADE 自动根据路由选择出口;
- SNAT 适用于固定 IP 的环境, 负责小; 例外, 可实现地址面积映射.
-j 与 -g 的区别
$ iptables -N TESTA
$ iptables -N TESTB
$ iptables -A FORWARD -s 172.16.11.1 -j TESTA
$ iptables -A FORWARD -s 172.16.11.2 -j TESTB
$ iptables -A TESTA -j MARK --set-mark 1
$ iptables -A TESTB -j MARK --set-mark 2
$ iptables -A FORWARD -m mark --mark 1 -j DROP
$ iptables -A FORWARD -m mark --mark 2 -j DROP
结论
- -j(jump) 相当于调用, 自定链结束后返回
- -g(goto) 一去不复返.
raw 表的用途
$ iptables -t raw -A PREROUTING -i eth0 -s 172.16.11.250 -j DROP
结论
- raw 表工作于最前端, 在 conntrack 之前 可以明确对某些数据不进行链接追踪;
- raw 可以提前 DROP 数据, 有效降低负载.
如何防止被 tracert ?
tracert == TTL 试探
$ iptables -A INPUT -m ttl --ttl-eq 1 -j DROP
$ iptables -A INPUT -m ttl --ttl-lt 4 -j DROP
$ iptables -A FORWARD -m ttl --ttl-lt 6 -j DROP
iptables 汇总的更多相关文章
- RedHat 和 Mirantis OpenStack 产品的版本和功能汇总和对比(持续更新)
Mirantis 和 Red Hat 作为 OpenStack 商业化产品领域的两大领军企业,在行业内有重要的地位.因此,研究其产品版本发布周期和所支持的功能,对制定 OpenStack 产品的版本和 ...
- 【转】IPtables学习笔记
写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现 ...
- Linux基础命令介绍七:网络传输与安全 wget curl rsync iptables
本篇接着介绍网络相关命令:wget 文件下载工具.curl 网络数据传输工具.rsync 文件传输工具等. 本篇接着介绍网络相关命令 1.wget 文件下载工具 wget [option]... [U ...
- openstackM版本常见问题汇总
汇总下常见的问题以及解释下一些比较容易让人萌的参数配置等等 问题汇总1.使用纯文本模式进行复制粘贴,打死不要用word!!!可以解决绝大多数问题,如果你依然执迷不悟,那么就好自为之吧 2.创建路由器时 ...
- shell脚本语法基础汇总
shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...
- iptables工作常用操作
正确的设置iptables命令汇总 iptables -P INPUT ACCEPT iptables -F iptables -X iptables -Z iptables -I INPUT -p ...
- [转帖]CentOS 查看系统信息汇总
CentOS 查看系统信息汇总 http://blog.itpub.net/15498/viewspace-2637493/ 感觉应该是 centos相关的 改了下名字 日志文件说明 /var/log ...
- [转] Linux运维常见故障排查和处理的技巧汇总
作为linux运维,多多少少会碰见这样那样的问题或故障,从中总结经验,查找问题,汇总并分析故障的原因,这是一个Linux运维工程师良好的习惯.每一次技术的突破,都经历着苦闷,伴随着快乐,可我们还是执着 ...
- centos平台基于snort、barnyard2以及base的IDS(入侵检测系统)的搭建与测试及所遇问题汇总
centos平台基于snort.barnyard2以及base的IDS(入侵检测系统)的搭建与测试及所遇问题汇总 原创 2016年12月19日 01:20:03 标签: centos / snort ...
随机推荐
- hdu1054最小顶点覆盖
最小定点覆盖是指这样一种情况: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶点覆盖 ...
- ListView在异步加载动态图片时,往往最后一项或几项被遮盖(IM场景居多)
如果ListView中得默认图片比较小,新图片加载后,撑大ListView中的对应项,导致最后一项或几项被覆盖. 解决思路: 1.默认图片设定和新图大小一样,换句话说,新图加载后转成和默认图片一样的大 ...
- OC的内存管理(一)
在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...
- 谈谈一些有趣的CSS题目(十七)-- 不可思议的颜色混合模式 mix-blend-mode
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- hdu2159 FATE 经典二维背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路: 定义ans存当前满足条件的消耗的最小的忍耐值(满足条件的忍耐值为在当前消耗的忍耐值的情况 ...
- Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX
转自:http://brokendreams.iteye.com/blog/2250109 功能简介: 原子量和普通变量相比,主要体现在读写的线程安全上.对原子量的是原子的(比如多线程下的共享变量i+ ...
- 如何设置SecureCRT快捷键
第一步,打开Tools -> Keymap Editor: 2.用鼠标点击要设置的快捷键,这里以F3为例,然后选择Map Select Key 3.弹出的对话框中,Function一栏选择Run ...
- Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6812311.html 1.对原生态jdbc程序中问题总结 1.1 jdbc程序 需求:使用jdbc查询mys ...
- 使用faker 生成中文测试数据
https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/zh_CN/Address.php 常用的类型都在里面. 下面是一 ...
- 基于python的爬虫(一)
抓取网页 python核心库 urllib2 实现对静态网页的抓取,不得不说,"人生苦短,我用python"这句话还是有道理的,要是用java来写,这估计得20行代码 (对不住了博 ...