Iptables学习笔记
*规则顺序从上到下执行,上面查询到有符合条件的规则下面不再执行
1,iptables –t 表命令链规则 –j 动作
表:filter,nat ,mangle 默认是filter
Iptables –L 查看filter表
-P 等于 --policy 定义默认测量
例如:更改默认策略
Iptables –t filter --policyFORWARD DROP
Iptables –t filter -P FORWARD ACCEPT
-A 等于 --append 在规则列表的最后添加一条规则
-I 等于 --insert 在指定的位置插入一条规则
例如:
Iptalbes –t filter –I INPUT –p icmp –jDROP
Iptalbes –t filter –I INPUT 3 –p icmp –j DROP
-D 等于 --delete 删除一条规则
例如:删除第一天规则
Iptables –t filter –D INPUT 1
-R 等于 --replace 替换规则列表中的某条规则
例如:
Iptables –t filter -R INPUT 2 –p icmp–j DROP
-F 等于 --flush 删除表中所以规则
例如:可以指定链,也可以不指定链,不指定链,清除表
Iptables –t filter –F INPUT
-L 查看iptables 信息
例如:iptables –t filter -L
iptables –t filter -L –v(-v:查看更多信息)
-n 以数字的形式显示
Iptables 匹配选项
-i 或 --in-interface 指定数据包从那个网络接口进入,如 ppp0 ,eth0和eth1等;
-o 或 –out-interface 指定数据包从哪块网络接口输出,如:ppp0,eth0和eth1等;
-p 或 –protocol 协议类型指定数据包匹配的协议,如 tcp,udp 和icmp等;
-s 或 –source 指定数据包匹配的源地址;
-d 或 –destination 指定数据包匹配的目标地址;
--sport 指定数据包匹配的源端口号,可以使用“起始端口:结束端口”的格式指定一个范围的端口;
--dport 目标端口号,指定数据包匹配的目标端口号,可以使用“起始端口:结束端口”的格式指定一个范围的端口。
例:
Iptables -t filter -I INPUT –p icmp -i eth0 –jDROP
Iptables–t filter –I FORWARD –p tcp –s 172.17.31.233/32 –d 172.16.31.8/32 –dport 3389–j DROP
Iptables 扩展参数
1, -m state --state <状态>
状态有:
1,NEW:想要新建立的封装包;
2,ESTABLISHED:已经连接成功的封装包;
3,INVALID:无效的封装包,例如数据损坏的封装包;
4,RELATED:这个最常用!表示这个封装包是与我们主机发送出去的封装包有关,可能是响应封装包或者是连接成功后的传输数据包。
2, icmp协议 –m icmp --icmp-type <状态> 实现单方向ping
icmp 状态类型:
echo-request 或 8
echo-reply 或 0
实例:拒绝172.16.31.2 ping通 172.16.31.7
例如:iptables –t filter –I INPUT –s 172.16.31.2/32 –d172.16.31.7/32 –p icmp –m icmp --icmp-type echo-request –j DORP
3, 参数 –m multiport 指定多端口号
-m multiport
--sports
--dports
--ports
实例:拒绝192.168.80.0/24 访问 192.168.10.0/24 1-1024和 3389
例如:iptables –t filter –I FORWARD –p tcp –d192.168.10.0/24 –s 192.168.80.0/24 –m multiport --dports 1:1024,3389 –j DROP
4, 指定IP段
-m iprange
--src-range ip-ip
--dst-range ip-ip
实例:禁止192.168.80.1-100 地址段访问 192.168.10.0/24
例如:iptables –t filter –I FORWARD –m iparnge --src-range192.168.80.1-192.168.80100 –j DROP
5, 最大连接数限制
-m connlimit
--connlimit-above <限制的最大连接数>
示例:只允许192.168.80.0/24 使用远程桌面连接192.168.10.123/32最多两个会话
例如:iptables –t filter –I FORWARD –s 192.168.80.0/24 –d192.168.10.123/32 –p tcp –dport 3389 –m connlimit --connlimit-above 2 –j DROP
6, 使用扩至选项限速
-m limit --limit
可以每秒钟、每分钟、每小时或每天平均一次,默认值为每小时平均一次,参数如:/second, /minute, /hour, /day
示例:192.168.10.0/24 发送数据包不能超过300个,(一个包最大1500字节)1500*300=450 000=450k
例如(需要两条命令,这是对网段进行限制):#:iptables –t filter –I FORWARD –s192.168.10.0/24 –d 192.168.80.0/24 –m limit --limit 300/second –j ACCEPT
#:Iptables –t filter –A FORWARD –s 192.168.10.0/24 –d192.168.80.0/24 –j DROP
对每个ip进行限制
公司使用Linux服务器来当网关,配置iptables NAT上网,使用iptables对每一个用户进行带宽限制:
vi /etc/sysconfig/limit.sh
#!/bin/bash
for((i=2; i<254; i++))
do
iptables –I FORWARD –s 192.168.10.$i –j DROP
iptables –I FORWARD –s 192.168.10.$I –m limit --limit 300/sec --limit-burst400 –j ACCEPT
done
注:--limit-burst (瞬间流量)上面的脚步是对192.168.10.1-254 限制每秒只运行最多300个数据包通过的限制。
7, 瞬间流量控制
参数--limit-burst 用来比对瞬间最大封装包数量,超过数量的封装包将直接丢弃。
示例:允许192.168.10.123/32 ping 192.168.80.123/32 4个包
例如:iptables –t filter –I FORWARD –s 192.168.10.123/32 –d192.168.80.123/32 –p icmp –m limit --limit-burst 4 –j ACCEPT
iptables –t filter –IFORWARD –s 192.168.10.123/32 –d 192.168.80.123/32 –p icmp –j DROP
# iptables –t filter –Z #清除filter表的计数器
8, 基于mac地址的过滤流量
参数–m mac --mac-source
说明:用来对比封装包来源网络接口地址的硬件地址,这个参数不能用在OUTPUT和PSOTROUTING链上,这是因为封装包要送出到网卡后,才能由网卡驱动程序通过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封装包对比时,并不知道封装包会送到哪个网络接口去。
示例:拒绝xp计算机的mac能够访问192.168.80.0/24 网段
例如:iptables –t filter –I FORWARD –d 192.168.80.0/24 –mmac --mac-source 00-50-56-C0-00-08 –jDROP
Filter表处理动作介绍
-j 参数用来指定要进行的处理动作,常用的处理动作有:ACCEPT, DROP, REJECT, LOG , REDIRECT , MASQUERADE , DNAT , SNAT,MIRROR , QUEUE ,RETURN ,MARK .
Filter 表使用的主要动作
ACCEPT : 封装包放行,进行完此处理后,将不再匹配其他规则,直接跳往下一个规则链。
DROP : 丢弃封装包不予处理,进行完此处理后,将不在匹配其他规则,直接中断过滤程序。
REJECT : 拦截封装包,并传送封装包通知对方,可以传送的封装包有下列选择:ICMP port-unreachable 、 ICMP echo-reply 或 tcp-reset(这个封装包要求对方关闭连接),进行完此处理后,将不再匹配其它规则,直接中断过滤程序。
示例:拦截192.168.10.0/24 ping 和 192.168.10.0/24 3389端口
例如:iptables –t filter –I FORWARD –s 192.168.10.0/24 –picmp –j REJECT
Iptables –t filter –I FORWARD–s 192.168.10.0/24 –p tcp --dport 3389 –j REJECT
LOG : 将封装包相应通讯记录在/var/log中,详细位置请查阅/etc/syslog.conf 配置文件,进行完此处理动作后,将会继续匹配其它规则。
示例:记录192.168.10.0/24网段连接远程桌面和ping过服务器
例如:iptables –t filter –I FORWARD –s 192.168.10.0/24 –ptcp –dport 3389 –j LOG --log-prefix “iptables-rdp”
iptables –t filter –IFORWARD –p icmp –j LOG --log-prefix “iptables-icmp”
注:--log-prefix 是给日志添加一个标记,方便以后查询
保存还原iptable设置
显示防火墙状态
Service iptables status
防火墙配置文件位置
/etc/sysconfig/iptables
防火墙服务配置文件
/etc/sysconfig/iptables-config
IPTABLES_MODULES=”ip_connrack_ftp ip_nat_ftp” #是否需要支持其它模块例如在地址转换的情况下支持FTP;
IPTABLES_MODULES_UNLOAD=”yes” #当iptables服务停止的时候自定义的模块是否被卸载,yes是卸载;
IPTABLES_SAVE_ON_STOP=”no” #当服务停止的时候定义的规则是否保存,默认是不保存;
IPTABLES_SAVE_ON_RESTART =”no” #当服务重启的时候默认规则是否保存,默认是不保存;
IPTABLES_SAVE_COUNTER=”no” #当配置保存的时候,防火墙计数器是否保存,默认是不保存;
IPTABLES_STATUS_NUMERIC=”yes”#当显示防火墙状态时,是否以数字的形式显示端口号和ip地址;
IPTABLES_STATUS_VERBOSE=”no” #当显示防火墙状态时,显示网卡接口;
IPTABLES_STATUS_LINENUMBERS=”yes”#查看时,是否显示行号;
清空防火墙配置
iptables –F
保存配置文件
/etc/rc.d/init.d/iptables save
把配置文件保存到另为一个文件
iptables-save > iptables.conf.bak
导入配置文件
Iptables-restored < iptables.conf.bak
Recent模块实现服务器网络安全
常用参数:
--name #设定列表名称,默认DEFAULT
--rsource #源地址,此为默认
--rdest #目的地址
--seconds #指定时间内
--hitcount #命中次数
--set #将地址添加进列表,并更新信息,包含地址加入的时间戳
--rcheck #检测地址是否在列表,以第一匹配开始计算时间
--update #和rcheck类似,以最后一个匹配计算时间
--remove #在列表里删除相应地址,后跟列表名称及地址
示例1:
SSH连接一个客户端60秒内只允许连接2次
1,用来设置多长时间,几次拒绝
#iptables –t filter –A INPUT –p tcp --dport 22 –m state --state NEW –m
recent --name SSHPOOL --rcheck--seconds 60 --hitcount 2 –j DROP
2,连接计算
#iptables –t filter –A INPUT –p tcp --dport 22 –m state --state NEW –mrecent --name SSHPOOL --set –j ACCEPT
3,建立的会话就允许进入
#iptables –t filter –A INPUT –m state --state ESTABLISHED –j ACCEPT
示例2:
限制TCP 80 端口 60 秒内每个IP只能发10个新建连接,超过记录日志及丢弃数据包,可防CC及非伪造IP的syn flood
#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--rcheck --seconds 60 --hitcount 10 –j LOG --log-frefix “DDOS” --log-ip-options
#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--rcheck ---seconds 60 --hitcount 10 –j DROP
#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--set –j ACCEPT
设置打开端口的钥匙
#记录日志,前缀是SSHOPEN(可选)
iptables –A INPUT –p icmp –icmp-type echo-request –m length –length 1078–j LOG –log-prefix “SSHOPEN:”
#指定数据包1078字节,包含IP头部20字节,icmp头部8字节。(1078=1050+20+8:ping 172.16.31.7 –l 1050)
iptables –A INPUT –p icmp --icmp-type echo-request –m length --length 1078–m recent --set --name sshoopen --rsource –j ACCEPT
#检查sshopen表中60秒内的记录如果有有源地址则允许访问tcp的22端口;
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds60 --name sshopen --rsource -j ACCEPT
#发送ping包指定数据包1178个字节,将客户端地址从sshopen表中移除,客户端将不能使用tcp的22端口建立连接;
iptables -A INPUT -p icmp --icmp-type echo-request -m length --length1178 -m recent --set --name sshopen -rmove -j ACCEPT
#已经连接的保持连接
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
NAT地址转换
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth3 -j SNAT--to-source 192.168.20.10-192.168.20.11
NAT端口映射
端口映射选做地址转换
iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp--dport 3389 -j DNAT --to 192.168.10.110:3389
iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp--dport 4000 -j DNAT --to 192.168.10.222:3389