防火墙的简单定义:工作在主机或网络边沿,根据事先设定的规则对进出的报文进行检测,符合规则的就放行。
iptables是一个生成规则的命令,并将生成的规则添加到内核中的netfilter框架实现对数据报文的过滤。
iptables中的规则链
PREROUTING:数据进行路由判断前
INPUT:数据交给主机上层处理前
OUTPUT:数据从主机上层出去前
FORWARD:数据按照路由表转发时
POSTROUTING:数据送出网卡前
iptables中的表
filter(过滤):通常加到INTPUT、OUTPUT、FORWARD规则链中
nat(地址转换):通常加到PREROUTING(dnat)、POSTROUTING(snat)规则链中
mangle(拆开、修改、封装):可加到所有规则链中
raw(结合-j NOTRACK跳过其他表的处理):通常加到PREROUTING、OUTPUT规则链中
检查优先次序:raw->mangle->nat->filter
默认规则
默认全ACCEPT:堵特定的
默认全REJECT:通特定的
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
COMMAND
管理规则
-A CHAIN [num]:附加一条规则,添加在链的尾部
-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条
-D CHAIN [num]:删除指定链中的第num条规则
-R CHAIN [num]:替换指定的规则
管理链:
-F [CHAIN]:清空指定规则链,如果省略就可以删除对应表中的所有链
-P CHAIN 动作:设定指定链的默认策略
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零,指定链中所有规则的计数器
-E old_chain new_chain:重命名自定义的链
查看类:
-L:显示指定表中的规则
-n:以数字格式显示主机地址和端口号
-v:显示详细的信息
-vv:显示更详细的信息
-x:显示计数器的精确值
--line-numbers:显示规则号码
匹配标准
通用匹配
-s,--src:指定源地址
-d,--dst:指定目的地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE:指定数据报文流入的接口,只用在PREOUTING,INPUT,FORWARD
-o INTERFACE:指定数据报文流出的接口,只用在OUTPUT,POSTROUTING,FORWAR
扩展匹配
隐含扩展:不用特别由哪3个模块进行的扩展
-p tcp
--sport PORT[-PORT]:源端口
--dport PORT[-PORT]:目标端口
-p icmp
--icmp-type
8:请求报文
0:应答报文
-p udp
--sport
--dport
显式扩展:使用额外的匹配机制,必须指明由哪个模块进行的扩展,在iptables中使 用-m选项可完成此功能
-m state --state:结合ip_conntrack追踪会话的状态
NEW:新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的,用于ftp
例子:-m state --state NEW,ESTABLISHED -j ACCEPT
-m multiports:离散的多端口匹配扩展
--source-ports PORT1,PORT2,... (最多带15个端口)
--destination-ports
--ports
例子:-m multiports --ports 80,443 -j ACCEPT
-m iprange:IP范围
--src-range
--dst-range
例子:-m iprange --src-range 172.16.100.3-172.16.100.100 -j ACCEPT
-m connlimit:连接数限制
--connlimit-above n
例子:-m connlimit ! --connlimit-above 2 -j ACCEPT
-m limit
--limit RATE:限制速率
--limit-burst n:限制一次的最大连接数
-m string:匹配字符串
--algo {bm|kmp}
--string "STRING"
例子:-m string --algo kmp --string"h7n9" -j DROP
处理办法
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换,添加到PREROUTING规则链上
SNAT:源地址转换,添加到POSTROUTING规则链上
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
--log-prefix "STRING"
MARK:打标记
装载或移除iptables/netfilter相关的内核模块
编辑/etc/sysconfig/iptables-config,修改为IPTABLES_MODULES="..."字段,在""内增删。
常见模块:iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack:跟踪连接会话处于什么状态
保存规则
# service iptables save
保存到/etc/sysconfig/iptables
# service iptables save > /path/to/file
# iptables-restore < /path/to/file
iptstate 查看与本机有关的连接的状态
相关文件:/proc/net/ip_conntrack /proc/sys/net/ipv4/ip_conntrack_max
sysctl -w net.ipv4.ip_conntrack_max=65535 立即生效
编辑/etc/sysctl.conf 永久生效
/proc/sys/net/ipv4/netfilter/*
利用iptables的recent模块来抵御DOS攻击
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
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内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/ipt_recent/SSH
也可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
练习:判断下述规则的意义:
# iptables -N clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.7 -j RETURN
# iptables -A INPUT -d 172.16.100.7 -j clean_in
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT