前序
iptables的起源发展防火墙的工作原理等这里我们就不在复述。这里主要记录下日常运维过程中关于iptables的命令,参数及实际运用。
链路管理命令
iptables -F 清除预设表filter中的所有规则链的规则
iptables -X 清除预设表filter中使用者自定链中的规则
iptables -P :设置默认策略的
iptables -Z:清空链,及链中默认规则的计数器
iptables -N:NEW 支持用户新建一个链
iptables -L -n 查看规则
链表规则管理命令
-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
-I 3 :插入为第三条
-o 指定数据包传出的那个网络接口。经常与OUTPUT链配合
-p 指定规则使用的协议
常用 tcp,udp,icmp,all
-s 指定来源ip或者网络,可以整个段,可以单个ip
例如 192.168.31.0/24 192.168.31.2
规则前加 !表示取反 例如:
iptables -A INPUT -i eth0 -p tcp --dport=80 -s 192.168.31.0/24 -j ACCEPT
这表示允许192.168.31.0网段的机器通过eth0网卡访问本机80端口
iptables -A INPUT -i eth0 -p tcp --dport=80 -s !192.168.31.0/24 -j ACCEPT
这就表示不允许了 因为!取反
-d 与-s类似功能
-j 需要执行的动作
主要有ACCEPT,DROP,REJECT,REDIRECT
-i 指定数据包进入的那个网卡。
如 eth0,lo 此参数一般配合INPUT链使用
-m 指定使用的模块
例如: multiport(启用多端口扩展)
state(状态监测)
limit(限制)
mac(网卡物理地址)
.......
-R num:Replays替换/修改第几条规则
格式:iptables -R 3 …………
-D num:删除,明确指定删除第几条规则
设置预置规则
-P 指定链策略
-t 指定链表
例如允许所有数据流出
iptables -P OUTPUT ACCEPT (不指定-t 默认为filter表)
--sport与--dport
--sport 限制来源的端口号
tcp连接实际是两个端口建立连接。
所以来源端口号就是别人访问你这个服务时他的端口号
--dport 恰恰相反.也就是你服务的端口号。所以我们基本使用的都是dport
状态检测
-m state --state <状态>
有数种状态,状态有:
- INVALID:无效的封包,例如数据破损的封包状态
- ESTABLISHED:已经联机成功的联机状态;
- NEW:想要新建立联机的封包状态;
- RELATED:表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
一般当我们需要建立一些临时规则时 一般会在开头加上这3句
这样的作用:
不影响现有的传入数据。而且也不用担心开放了之前拒绝的端口
不影响流出数据
不影响本地Lo环路数据(访问本地127.0.0.1)
常用的规则配置:
允许192.168.31.0网段访问80端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.31.0/24 -j ACCEPT
不允许
iptables -A INPUT -p tcp --dport 80 -s !192.168.31.0/24 -j ACCEPT
或
iptables -A INPUT -p tcp --dport 80 -s 192.168.31.0/24 -j DROP
只允许 mac地址为aa:bb:cc:dd:ee:ff 的机器访问本地ssh端口
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -p tcp --dport 22 -j ACCEPT
将80端口重定向到8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
443端口限流,每秒最多150个连接(防ddos)
iptables -A INPUT -i eth0 -p tcp --dport 443 -m limit --limit 150/s --limit-burst 150 -j ACCEPT
防SYN_FLOOD
iptables -N syn-flood (新建一条链)
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN
iptables -A syn-flood -j DROP
单个ip最大并发数50
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
对访问本机的22端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
(上面recent规则只适用于默认规则为DROP中,如果要适用默认ACCEPT的规则,需要--set放前面 并且无-j ACCEPT)
预防cc攻击
tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
查找发包最多的ip
iptables -I INPUT -s ip -j REJECT
封掉