iptables基础原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables基础原理相关的知识,希望对你有一定的参考价值。
MF:more fragment,分片标记
DF:don‘t fragment,不能分片
Fragment Offset:片偏移量,第一片为0,报文大小为100,第二片Fragment Offset = 101
TTL:time-to-live,经过网关后减1,为零报文后消失
icmp:Internet Control Message Protocol,互联网控制报文协议,3层半协议。
帧首部 + IP header + TCP header + Http + data
有限状态机:LISTEN,SYN_RCVD,ESTABLISHED
linux网络防火墙
Linux2.4后,
netfilter:framework
iptables:数据报文过滤、NAT、mangle等规则生成工具
功能主要根据IP header和TCP header实现的。
防火墙:硬件、软件都可以;规则(匹配规则、处理办法)
内部攻击防火墙无法防御。
对于服务器端,拒绝所有未知报文;
开放:堵
关闭:通
规则
匹配顺序:从上到下匹配,匹配到后不再往下匹配;未匹配到继续向下匹配。
对于两条规则
1)两条规则无关联,则匹配范围大的规则放在上面。
2)两条规则有关联,则较为严格的规则放在上面。
1)匹配标准
IP:SIP,DIP
TCP:SPORT,DPORT, SYN=1,FIN=0,RST=0,ACK=0;SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP:SPORT,DPORT
ICMP:icmp-type
2)处理动作
hook function: 钩子函数
input
output
forward
prerouting
postrouting
源地址转换:内网访问公网某个服务器,在报文离开网卡时,进行源地址转换;
目标地址转换:公网服务器回应,在报文刚进入网卡时(在路由决策之前),修改目标地址
"4表5链"
filter(过滤):表
INPUT
OUTPUT
FORWARD
nat(地址转换):表 network address translation
PREROUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
注意:在input链中,netfilter和mangle的规则的功能不同,可以分类存放,但不能混合存放
raw():
PREROUTING
OUTPUT
自定义链
可以将同类的、与其他规则无关的规则放入自定义链,可以精简主链,加快执行效率。
1)自定义链在被调用时,发挥作用,若没有被任意一条规则匹配,有返回机制;
2)用户可以删除自定义的空链
3)默认链无法删除
每个规则都有两个内置计数器:
被匹配的报文个数
被匹配的报文大小之和
iptables
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
COMMAND
1)管理规则
-A:在链尾部添加一条规则
-I CHAIN [num]:插入在CHAIN上作为第num条规则,不写默认为第一条
-D CHAIN [num]:删除CHAIN中第num条规则,也可以指定匹配规则
-R CHAIN [num]:替换指定的规则,也可以指定匹配规则
2)管理链
-F|--flush [CHAIN]:清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P|--policy CHAIN 处理办法: 设定指定链的默认策略;
-N|--new-chain chain:自定义一个新的空链
-X|--delete-chain: 删除一个自定义的空链
-Z|--zero:置零指定链中所有规则的计数器;
-E|--rename-chain old-chain-name new-chain-name: 重命名自定义的链;
3)查看链,不指定-t,默认为filter表
-L:显示指定表中的规则,此选项会反解主机名,端口号为服务名
-n: 以数字格式显示主机地址和端口号;
-v: 显示链及规则的详细信息
-vv:
-x: 显示计数器的精确值
--line-numbers: 显示规则号码,service iptables status也可以显示规则号码
匹配标准
1)通用匹配
-s, --src: 指定源地址
-d, --dst:指定目标地址
-p {tcp|udp|icmp}:指定3层协议
-i INTERFACE: 指定数据报文流入的接口,eth0,eth1,lo
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定数据报文流出的接口,eth0,eth1,lo
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
2)扩展匹配,依赖于扩展模块(.so)
1))隐含扩展,不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}
-p tcp
--sport port[-port]:指定端口,可以是连续的端口,不可以是离散的
--dport port[-port]:指定端口,可以是连续的端口,不可以是离散的
--tcp-flags mask|comp:只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p tcp -m tcp --dport ,-m tcp省略了,所以称为隐含扩展
-p icmp
--icmp-type
0: echo-reply
8: echo-request
-p udp
--sport port[-port]:指定端口,可以是连续的端口,不可以是离散的
--dport port[-port]:指定端口,可以是连续的端口,不可以是离散的
2))显式扩展,可以使用额外的匹配机制
-m EXTESSION --spe-opt
state:状态扩展
此处是根据IP报文确定的状态,不是TCP报文,结合ip_conntrack追踪会话的状态
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的,和ftp服务有关,首先要装载ip_conntrack_ftp和ip_nat_ftp模块
-m state --state NEW,ESTABLISHED -j ACCEPT
multiport: 离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
连续端口用分号隔开,最多为15个
iprange:匹配IP范围
--src-range
--dst-range
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
connlimit: 连接数限制,同一个客户端地址同时允许发送请求的限制
! --connlimit-above n
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
limit 令牌桶
--limit RATE:限制单位时间内流量上限 10/s
--limit-burst:
# iptables -R INPUT 3 -d 192.168.8.41 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 15 -m state --state NEW,ESTABLISHED -j ACCEPT,经测试,对外部的ping具有限制,但是ping本机没有限制,果然是通过lo实现的
string
--algo {bm|kmp}
--string "STRING"
rpm -ql iptables 可以查看相关库文件
TARGET EXTENSIONS man帮助检索标记
-j|--jump target处理动作
ACCEPT,放行
DROP,丢弃
REJECT,拒绝,返回错误信息
DNAT,目标地址转换
SNAT,源地址转换
MASQUERADE,地址伪装
REDIRECT,端口重新向
MARK,标记
LOG,日志
iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理、保存规则
装载及移除iptables/netfilter相关的内核模块;
iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack(管理地址转换的连接追踪)
保存规则
# service iptables save
默认位置:/etc/sysconfig/iptables
自定义保存和加载规则
# iptables-save > /etc/sysconfig/iptables.2013041801
# iptables-restore < /etc/sysconfig/iptables.2013041801
应用
1、sshd
# iptables -t filter -A INPUT -s 192.168.8.104 -d 192.168.8.41 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.8.41 -d 192.168.8.104 -p tcp --sport 22 -j ACCEPT
2、ping使用icmp协议
任何主机可以ping通本机,本机不能ping通任何主机
# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 0 -j ACCEPT
本机能ping任何主机,任何主机不能ping本机
# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 8 -j ACCEPT
3、DNS的iptables规则
4条tcp+4条udp,如下图
4、反弹式木马
server只开放80端口
server不能主动发送报文,来控制反弹式木马攻击
ip_conntrack 根据IP报文进行连接追踪
/proc/net/ip_conntrack 保存了每一个客户端和当前主机建立的连接关系,和会话所处状态
/proc/sys/net/ipv4/ip_conntrack_max 定义ip_conntrack最多同时追踪的连接数目,超过此数目部分连接将会被丢弃
说明:/proc下的内容保存在内存中
为什么ip_conntrack适用于并发比较小的服务器?
对于一个繁忙的服务器,装载modprobe ip_conntrack模块后,此模块会自动追踪用户连接;当超过上面定义的ip_conntrack_max时,ip_conntrack会占用大量的内存空间,并且后续的连接将无法建立。因此此功能只适用于并发比较小的服务器,并且需要调大ip_conntrack_max。
iptstate
-t:连接数目
某些版本的linux上(rhel 5.8),手动加载ip_conntrack后,关闭iptables后,ip_conntrack仍未关闭,此时可以restart iptables后,在service iptables stop 即可关闭ip_conntrack模块的加载。
注意:在ip_conntrack模块未加载情况下,使用以下命令会触发加载ip_conntrack模块
# iptables -t nat -L
如何禁用此模块?
5、使用状态追踪对报文的控制
1)sshd
# iptables -A INPUT -d 192.168.8.41 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.41 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
注意:模块ip_conntrack、nfnetlink将被加载激活
2)httpd
# iptables -A INPUT -d 192.168.8.41 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.41 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
/proc/sys/net/ipv4/netfilter/定义了连接超时时间
永久有效,在/etc/sysctl.conf下增加条目
3)ping任何主机
# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
6、规则合并
1)Chain OUTPUT (policy DROP 4885 packets, 324K bytes)
num pkts bytes target prot opt in out source destination
1 2444 249K ACCEPT tcp -- * * 192.168.8.41 0.0.0.0/0 tcp spt:22 state ESTABLISHED
2 69 20743 ACCEPT tcp -- * * 192.168.8.41 0.0.0.0/0 tcp spt:80 state ESTABLISHED
3 3 252 ACCEPT icmp -- * * 192.168.8.41 0.0.0.0/0 icmp type 8 state ESTABLISHED
合并为
# iptables -I OUTPUT 1 -s 192.168.8.41 -m state --state ESTABLISHED -j ACCEPT
放行了所有协议,但是所有端口好像是有点问题
2)# iptables -nvL
Chain INPUT (policy DROP 410 packets, 37516 bytes)
pkts bytes target prot opt in out source destination
12 1008 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
7424 397K ACCEPT tcp -- * * 0.0.0.0/0 192.168.8.41 tcp dpt:22 state NEW,ESTABLISHED
213 18268 ACCEPT tcp -- * * 0.0.0.0/0 192.168.8.41 tcp dpt:80 state NEW,ESTABLISHED
为了提高检查效率,只要是EATABLISHED直接放行,NEW的话匹配下面的规则
# iptables -I INPUT -d 192.168.8.41 -p tcp -m state --state ESTABLISHED -j ACCEPT
将NEW也合并
# iptables -I INPUT 2 -d 192.168.8.41 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW -j ACCEPT
7、ftp服务
首先要装载ip_conntrack_ftp和ip_nat_ftp模块
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp"
注意:也有可能已经做成了内核模块/lib/modules/2.6.18-398.el5/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko
添加规则
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
8、本机127.0.0.1
# iptables -I INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# iptables -I OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
或者
# iptables -I INPUT -i lo -j ACCEPT
# iptables -I OUTPUT -o lo -j ACCEPT
本文出自 “hiyang” 博客,请务必保留此出处http://hiyang.blog.51cto.com/10728919/1785314
以上是关于iptables基础原理的主要内容,如果未能解决你的问题,请参考以下文章