iptables识别数据包四种状态:
NEW:当与任何主机通信时发出的第一个数据包的状态即NEW,一般为发起连接方发送的第一个标志为SYN=1的数据包 注意:NEW是TCP三次握手中的第一次SYN必须等于1
ESTABLISHED:假设与主机通信时发出的第一个数据包能够通过防火墙,那么后续的你与该主机之间发送和接收到所有数据包状态均为ESTABLISHED (SYN不等于1,ACK=1,FIN不等于1)
RELATED:由一个已经建立的连接所生成的新的连接的状态即为RELATED,例如FTP服务,访问FTP服务器时建立的连接是21端口的发送命令的连接,如果要传输数据则需要按工作模式不同打开其他端口的连接,那么这个连接就是RELATED状态
INVALID:非法状态的数据包,也就是不属于以上三种状态的数据包,无法实别的状态比如:SYN=1 FIN=1 又请求又发送结束,根本没有这种状态的包
iptables基本语法:
- iptables [-t TABLE] COMMAND CHAIN [createriaj] -j ACTION
-
- -t {raw|mangle|nat|filter},默认filter
-
- COMMAND:
- 规则管理类:
- -A 增加
- -I # 插入
- -D # 删除
- -R # 替换
- 链接管理类:
- -F 清空链
- -N new,新建链
- -X 删除自定义空链
- -E rename重命名
- 默认策略:
- —P policy
- 清空计算器
- -Z zero
- 每条规则(包括默认策略)都有两个计数器
- 被此规则匹配到的所有数据包的个数
- 被此规则匹配到的所有数据包的大小之和
- 查看类:
- —L, list
- -n,numeric
- -v,verbose
- -vv
- -vvv
- -x exactly 显示精确值,不需要做换算
- --line-numbers
-
- 匹配条件:
- 基本匹配:
- -s source:ip ,NETWORK
- -d destnations
- -p {tcp|udp|icmp}
- -i inetface 流入
- -o inetface 流出
-
- 扩展匹配:(调用iptables模块,以便扩展iptables匹配功能-m明确指定模块)
- 隐含扩展
- -p tcp 可以省略-m -tcp
- --sport PORT
- --dport PORT
- --tcp-flags
- --tcp-flags ACK,SYN,RST,FIN SYN,ACK 这时SYN=1,ACK=1,其他为0
- 要带两个参数要检查的标志位,没有出现的标志位必须为0,出现的为1
- --tcp-flags ACK,SYN,RST,FIN SYN 可以简单写成--syn
- -p udp
- --sport PORT
- --dport PORT
- -p icmp
- --icmp-type
- 8:echo-request ping回显请求
- 0:echo-reply 响应
- 3:ping不通的
- 还有很多子类
- 0,1等等
-
-
-
- 显式扩展
- -m state --state NEW
- -m multiport
- --source-port 22,53,80
- --destination-ports
- --ports
- -m iprange
- -src -range 192.168.0.2-192.168.22
- -dst -range
- -m limit
- --limit
- --limit burst
- -m string
- --algo bm|kmp
- --string "STRING"
- -m time
- --timestart 8:00 -timestop 18:00 -j DROP
- --days
- --datestart --datestop
- ACTION
- -j
- ACCEPT
- DROP
- REJECT
iptables实例操作:
- 开放ssh的22端口:
- iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 172.16.100.1/32 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- 注意:如果你写成172.16.100.1/16就表示这个网段了,不表示这个特定的ip地址了
-
- iptables -A OUTPUT -s 172.16.100.1 -d 0.0.0.0/0.0.0.0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
- 注意:这个表示别人连进来了,我们要把数据包响应给别人要开OUTPUT链,这时上面已经建立了NEW,所以这次的通信过程是已经建立连接状态,表示为ESTABLISHED
-
- 总结:1、特定的地址掩码是32
- 2、一般进来允许NEW,ESTABLISHED 出去只允许ESTABLISHED
-
- 开放web服务器80端口
- iptables -A INPUT -d 192.168.184.136 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -s 192.168.184.136 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
-
- 开放DNS的53端口,一种是基于tcp的,一种是基于udp的
- iptables -A INPUT -d 192.168.184.136 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A INPUT -d 192.168.184.136 -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -s 192.168.184.136 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -s 192.168.184.136 -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
-
- 对上面的规则进行优化:
- INPUT链:
- 优化一
- iptables -A INPUT -d 192.168.184.136 -p tcp -m state --state NEW,ESTABLISHED -m multiport --destination-ports 22,53,80 -j ACCEPT
- iptables -A INPUT -d 192.168.184.136 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-
- 优化二(最好的)
- iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
- iptables -A INPUT -d 192.168.184.136 -p tcp -m state --state NEW -m multiport --destination-ports 22,53,80 -j ACCEPT
- iptables -A INPUT -d 192.168.184.136 -p udp --dport 53 -m state --state NEW -j ACCEPT
-
- OUTPUT链
- 优化一
- iptables -A OUTPUT -s 192.168.184.136 -p tcp -m state --state ESTABLISHED -m multiport --source-ports 22,53,80 -j ACCEPT
- iptables -A OUTPUT -s 192.168.184.136 -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
-
- 优化二(最好的)
- iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
- 注意:仔细观察一下这个规则这个状态全部是ESTABLISHED,所以可以再次优化的
-
- 开放TCP的23号端口,只允许192.168.184.1-192.168.184.200内的主机访问
- iptables -A INPUT -d 192.168.184.136 -m iprange --src-range 192.168.184.1-192.168.184.200 -p tcp --dport 23 -m state --state NEW -j ACCEPT
-
- 对ssh进行限制,同一ip只允许发送两个请求
- iptables -A INPUT -d 192.168.184.136 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 2 -j ACCEPT
-
- 对网页内容字符串进行屏蔽,比如屏蔽包含test字样
- iptables -I OUTPUT 1 -m string --algo kmp --string "test" -j REJECT
-
- 开放ftp服务
- lsmod |grep ftp 查看内核的ftp模块
- modprobe ip_nat_ftp 装载内核的ftp模块
- 开放命令连接21号端口:
- iptables -A INPUT -d 192.168.184.136 -p tcp --dport 21 -m state --state NEW -j ACCEPT
- 开放数据端口:
- iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-
- 禁ping
- iptables -A FORWARD -p icmp --icmp-type 8 -j REJECT
-
- SNAT源地址转换
- iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.100.2
-
- DNAT目标地址转换
- iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2
-
- 日志记录功能
- iptables -t nat PREROUTING -d 172.16.100.1 -p tcp --dport 80 -j LOG --log-prefix "DNAT LOG"
- 注意:日志是记录在messages
-
- 利用iptables的recent模块来抵御DOS攻击:
- ssh: 远程连接
- 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同时使用
亿恩科技地址(ADD):郑州市黄河路129号天一大厦608室 邮编(ZIP):450008 传真(FAX):0371-60123888
联系:亿恩小凡
QQ:89317007
电话:0371-63322206