文章目录
- 注意事项
- 1. 地址列表填写规范
- 2. 代码块
- 3. 执行结果
- 4. 地址与端口获取方法
- 4.1 tcpdump抓包分析(推荐使用)
- 4.2 TCP连接分析(仅能识别TCP连接)
注意事项
- 请务必按照格式填写具体参数,否则会影响到匹配规则的创建,严重时会影响到业务流量!!!
- 请务必按照格式填写具体参数,否则会影响到匹配规则的创建,严重时会影响到业务流量!!!
- 请务必按照格式填写具体参数,否则会影响到匹配规则的创建,严重时会影响到业务流量!!!
1. 地址列表填写规范
ip.txt
文件内容填写案例:
ip port # 单个地址和单个端口格式
ip port1,port2... # 单个地址和多个端口格式
ip/net port # 网段地址和单个端口格式
ip/net port1,port2... # 网段地址和多个端口格式
- 地址文件名称为
ip.txt
,若需替换则修改代码块第9
行if test -s ./ip.txt;
处ip.txt
即可; - 多个IP地址请务必隔行输出;
- 添加IP地址不可重复,但支持包含关系;
- 支持CIDR格式添加IP地址;
- 多个端口使用 [英文格式逗号] 间隔;
- IP地址与端口之间使用 [空格] 字符进行间隔。
- 若不了解该服务,可先查阅iptables服务详解
2. 代码块
#!/bin/bash
file_path=$(dirname "$0")
cd $file_path
chain="IP_WHITELIST" # 创建链名称为:IP_WHITELIST
ip_list=""
if test -s ./ip.txt; then
cat ip.txt | awk '{print$1}' > ./ip_temp.txt # IP地址去重
ip_list=($(sort -u ./ip_temp.txt))
rm -f ./ip_temp.txt
fi
function create_rule(){
# 注意iptables插入顺序
iptables -w -t filter -N $chain # 创建新链
iptables -w -t filter -I $chain -j DROP # 匹配所有流量,执行动作拒绝
for ip in ${ip_list[@]}; do
dports=`cat ip.txt | grep "$ip" | awk '{print$2}'`
if [ -z "$dports" ]; then # 判断端口列表是否为空
iptables -w -t filter -I $chain -s $ip -j ACCEPT
else
iptables -w -t filter -I $chain -s $ip -p tcp -m multiport --dports $dports -j ACCEPT
fi
done
echo -e "\033[32miptables service rule crete complete!\033[0m"
}
function delete_rule(){
# 清理iptables创建的匹配规则
while iptables -w -t filter -D INPUT -p tcp -j $chain 2>/dev/null; do # 忽略删除匹配规则错误信息
sleep 0.1s
done
#
iptables -w -t filter -F $chain 2>/dev/null
iptables -w -t filter -X $chain 2>/dev/null
echo -e "\033[32miptables service rule cleanup complete!\033[0m"
}
function backup_rule(){
# 备份当前环境下iptables规则到指定目录下临时文件
iptables-save > ./iptables_bk_$(date +"%Y-%m-%d %H:%M:%S") # 以时间指定文件名称
echo -e "\033[32miptables service rule backup complete,path is "$file_path"/iptables_bk_<local_time>\033[0m"
}
case ${1:-help} in
"create" )
# 先备份规则,再清理规则,后创建新规则
backup_rule && delete_rule && create_rule
;;
"delete" )
# 先备份规则,再清理规则
backup_rule && delete_rule
;;
"backup" )
# 直接备份规则
backup_rule
;;
"help" )
# 可用参数说明
echo -e "\033[31m Usage: \n\t$0 options is [create/delete/backup/help]\033[0m"
;;
esac
3. 执行结果
ip.txt
配置参考
4. 地址与端口获取方法
4.1 tcpdump抓包分析(推荐使用)
tcpdump -i any -s56 -lnnqt 'inbound and (dst port 2181 or dst port 2888 or dst port 3888)' | cut -d'.' -f1-4 | awk '!a[$NF]++ {print $NF; fflush();}' | tee <file_path>/ip.txt
命令解析:
- tcpdumo:-i any 抓取所有接口数据包,-s56 截取报文前56字节内容,-lnnqt 使用数字格式显示IP地址和端口号,inbound 只抓取入站数据包,dst port 目标端口列表
- cut:切割出IP地址
- awk:对每个IP地址进行去重操作
4.2 TCP连接分析(仅能识别TCP连接)
ss -nat | grep -E ":2181|2888|3888" | awk '{print $NF}' | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | awk '!a[$0]++' | tee <file_path>/ip.txt
命令解析:
- ss:查找当前系统中所有TCP连接的状态信息,并同时过滤端口
- awk:第一个为输出最后一行信息并过滤出IP地址,第二个为对每个IP地址进行去重操作