如何从NetworkManager配置文件提取并通过iptables封禁VPN IP
管理NetworkManager VPN IP的iptables封禁脚本
问题根源分析
你当前脚本的核心问题包括:
- 未过滤普通网络连接文件,误处理非VPN配置
grep返回结果包含文件名,导致IP变量是带路径的多值字符串,iptables无法解析- 未对IP去重、验证有效性,也没有逐个应用规则
针对性解决方案
1. 筛选VPN配置文件的方法
NetworkManager的VPN配置文件必然包含[vpn]配置段,直接用grep过滤这类文件:
grep -l '\[vpn\]' /etc/NetworkManager/system-connections/*.nmconnection 2>/dev/null
-l:仅输出匹配到的文件名2>/dev/null:忽略无权限或不存在文件的错误提示
2. 提取独立有效IP地址
- 用
grep -h去掉文件名前缀,只保留IP - 自定义验证函数过滤合法IPv4(避免匹配999.999.999.999这类无效值)
- 用
sort -u去重,避免重复处理相同IP
3. 遍历封禁每个IP的正确方式
用循环逐个处理IP,同时用iptables -C检查规则是否已存在,防止重复添加冗余规则
完整实现脚本
#!/bin/bash # 验证IPv4地址合法性的函数 validate_ip() { local ip="$1" local IFS='.' read -r a b c d <<< "$ip" # 检查每个段是否为0-255之间的整数 [[ $a =~ ^[0-9]+$ && $b =~ ^[0-9]+$ && $c =~ ^[0-9]+$ && $d =~ ^[0-9]+$ ]] && [[ $a -ge 0 && $a -le 255 && $b -ge 0 && $b -le 255 && $c -ge 0 && $c -le 255 && $d -ge 0 && $d -le 255 ]] } # 第一步:筛选所有VPN配置文件 vpn_files=$(grep -l '\[vpn\]' /etc/NetworkManager/system-connections/*.nmconnection 2>/dev/null) if [ -z "$vpn_files" ]; then echo "未找到任何VPN配置文件" exit 0 fi # 第二步:提取并过滤有效IP地址(去重) valid_ips=$(grep -h -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $vpn_files | sort -u | while read -r ip; do if validate_ip "$ip"; then echo "$ip" fi done) # 第三步:遍历IP添加iptables封禁规则 for ip in $valid_ips; do # 检查INPUT规则是否已存在,不存在则添加 if ! iptables -C INPUT -s "$ip" -j DROP 2>/dev/null; then iptables -A INPUT -s "$ip" -j DROP echo "已封禁INPUT方向IP: $ip" fi # 检查OUTPUT规则是否已存在,不存在则添加 if ! iptables -C OUTPUT -d "$ip" -j DROP 2>/dev/null; then iptables -A OUTPUT -d "$ip" -j DROP echo "已封禁OUTPUT方向IP: $ip" fi done
脚本关键说明
- 精准过滤VPN文件:通过
[vpn]段识别,确保只处理目标配置 - IP有效性保障:验证函数排除格式合法但数值无效的IP
- 规则冗余避免:
iptables -C检查已存在规则,重复执行脚本不会生成重复条目 - 错误处理:忽略无权限文件提示,无VPN文件时友好退出
内容的提问来源于stack exchange,提问作者user21379959
相关产品推荐
相关产品推荐

