环境:Win10
需求:每个端口单独增加一条入站规则
方案:使用脚本批量增加规则
脚本:
@echo off & setlocal enabledelayedexpansion
REM 服务器别名
set server_alias=135
REM 端口列表
set port_list=9922,8090
REM 实测入站规则的作用域(远程地址)是有长度限制的,所以IP如果比较多,可分为多组
set ip_list_1=192.168.1.1,192.168.1.2,192.168.1.3
set ip_list_2=192.168.1.4,192.168.1.5,192.168.1.6
REM 调用add_rule_batch模块
call :add_rule_batch
goto :eof
REM 定义add_rule_batch模块
:add_rule_batch
for /f "tokens=1,* delims=," %%i in ("!port_list!") do (
set rule_name1=%server_alias%端口白名单-%%i-1
echo 正在删除入站规则:!rule_name1!
netsh advfirewall firewall delete rule name="!rule_name1!"
netsh advfirewall firewall add rule name="!rule_name1!" dir=in action=allow protocol=TCP localport=%%i enable=yes profile=domain,private,public remoteip=!ip_list_1!
echo=
set rule_name2=%server_alias%端口白名单-%%i-2
echo 正在删除入站规则:!rule_name2!
netsh advfirewall firewall delete rule name="!rule_name2!"
netsh advfirewall firewall add rule name="!rule_name2!" dir=in action=allow protocol=TCP localport=%%i enable=yes profile=domain,private,public remoteip=!ip_list_2!
echo=
set port_list=%%j
goto add_rule_batch
)
goto :eof
实测效果图:两个端口,两组IP列表

**************************************************
Linux脚本(使用iptables):
# 禁用
iptables -I INPUT -p tcp --dport 1521 -j DROP
# 单IP
iptables -I INPUT -s 192.168.10.0 -p tcp --dport 1521 -j ACCEPT
# 多IP
iptables -I INPUT -s 192.168.10.49,192.168.10.33 -p tcp --dport 54321 -j ACCEPT
# 掩码
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 1521 -j ACCEPT
# IP段
iptables -I INPUT -m iprange --src-range 192.168.10.0-192.168.10.255 -p tcp --dport 1521 -j ACCEPT
# 指定网卡
iptables -I INPUT -s 192.168.10.0 -p tcp -i eno1 --dport 1521 -j ACCEPT
# 指定目的IP
iptables -I INPUT -s 192.168.10.0 -p tcp -d 192.168.10.1 --dport 1521 -j ACCEPT
# 多个端口(连续)
iptables -I INPUT -s 192.168.10.0 -p tcp --dport 65530:65535 -j ACCEPT
# 多个端口(不连续)
iptables -I INPUT -s 192.168.10.0 -p tcp -m multiport --dport 65530:65535,1521,2181 -j ACCEPT
Linux脚本(使用firewall-cmd):
#!/bin/bash
file="ip-list.txt"
ZONE=public
if [ -f "$file" ]; then
while IFS= read -r IP; do
# 需要替换掉换行符
IP=${IP//\n/}
IP=${IP//\r/}
IP=$(echo -n "$IP" | tr -d '\n')
IP=$(echo -n "$IP" | tr -d '\r')
# 去掉收尾空格
IP=`echo $IP | xargs`
echo "$IP"
# 移除
# firewall-cmd --permanent --zone=public --remove-source=$IP
firewall-cmd --permanent --zone=$ZONE --add-rich-rule="rule family="ipv4" source address="$IP" port protocol="tcp" port="54321" accept"
done < "$file"
firewall-cmd --reload
echo "添加完成"
else
echo "文件 $file 不存在"
fi