添加firewall-cmd转发脚本

This commit is contained in:
CN-JS-HuiBai
2026-01-28 20:19:59 +08:00
parent 02a6707fa9
commit 9e6c00ac73

View File

@@ -0,0 +1,113 @@
#!/bin/bash
set -e
if [ "$EUID" -ne 0 ]; then
echo "❌ 请使用 root 用户运行"
exit 1
fi
if ! command -v firewall-cmd >/dev/null 2>&1; then
echo "❌ 未检测到 firewall-cmd仅支持 RHEL 系)"
exit 1
fi
if ! systemctl is-active firewalld >/dev/null 2>&1; then
echo "❌ firewalld 未运行"
exit 1
fi
ZONE=$(firewall-cmd --get-default-zone)
get_forward_ports() {
mapfile -t RULES < <(
firewall-cmd --permanent --zone="$ZONE" --list-forward-ports || true
)
}
list_rules() {
get_forward_ports
echo
echo "📋 当前端口转发规则zone=$ZONE"
echo "--------------------------------------"
if [ "${#RULES[@]}" -eq 0 ]; then
echo "(暂无端口转发规则)"
return 1
fi
for i in "${!RULES[@]}"; do
printf "%2d) %s\n" "$((i+1))" "${RULES[$i]}"
done
}
add_rule() {
echo
read -rp "本地监听端口: " LOCAL_PORT
read -rp "目标 IP 地址: " TO_ADDR
read -rp "目标端口: " TO_PORT
echo "协议类型:"
echo "1) TCP"
echo "2) UDP"
read -rp "选择 (1/2): " P
case "$P" in
1) PROTO="tcp" ;;
2) PROTO="udp" ;;
*) echo "❌ 无效选择"; return ;;
esac
RULE="port=${LOCAL_PORT}:proto=${PROTO}:toport=${TO_PORT}:toaddr=${TO_ADDR}"
firewall-cmd --permanent --zone="$ZONE" --add-forward-port="$RULE"
firewall-cmd --reload
echo "✅ 已添加端口转发规则"
}
############################
# 删除规则
############################
delete_rule() {
list_rules || return
echo
read -rp "请输入要删除的规则编号: " IDX
[[ "$IDX" =~ ^[0-9]+$ ]] || { echo "❌ 输入无效"; return; }
RULE="${RULES[$((IDX-1))]}"
[[ -n "$RULE" ]] || { echo "❌ 编号不存在"; return; }
echo "⚠️ 即将删除规则:"
echo "$RULE"
read -rp "确认删除?(y/N): " CONFIRM
[[ "$CONFIRM" =~ ^[Yy]$ ]] || return
firewall-cmd --permanent --zone="$ZONE" --remove-forward-port="$RULE"
firewall-cmd --reload
echo "🗑️ 规则已删除"
}
############################
# 主菜单
############################
while true; do
echo
echo "====== firewalld 端口转发管理forward-port ======"
echo "1) 添加端口转发规则"
echo "2) 查看端口转发规则"
echo "3) 删除端口转发规则"
echo "0) 退出"
echo "==================================================="
read -rp "请选择: " C
case "$C" in
1) add_rule ;;
2) list_rules ;;
3) delete_rule ;;
0) exit 0 ;;
*) echo "❌ 无效选择" ;;
esac
done