FirewallD 端口转发脚本

#!/bin/bash # 规则数组 forward_ports= # 规则记录数 count= # 获取当前所有转发端口 function fetch_forward_rules { forward_ports=( $(firewall-cmd --list-forward) ) count=${#forward_ports[@]} } function print_cur_rules { fetch_forward_rules # 打印所有转发端口,添加序号 local i=1 echo "================ 当前所有转发规则 ================" for port in "${forward_ports[@]}"; do echo "$i. $port" ((i++)) done echo "===============================================" } function add_rule() { read -rp "请输入协议 (tcp 或 udp 默认: tcp): " proto proto=${proto:-tcp} read -rp "请输入本地端口号或范围 (例如: 80, 8080, 8000-8010): " port read -rp "请输入远端端口号或范围 (例如: 80, 8080, 8000-8010 默认:相同端口): " toport toport=${toport:-${port}} read -rp "请输入远端地址 (例如: 192.168.1.1): " toaddr local rule="port=$port:proto=$proto:toport=$toport:toaddr=$toaddr" # 添加转发规则 firewall-cmd --add-forward "$rule" --permanent && firewall-cmd --reload if test $? -eq 0; then echo "已添加转发规则: $port ($proto) -> $toaddr:$toport" #echo "同步操作到k8s-lb2..." #ssh root@k8s-lb2 "firewall-cmd --add-forward $rule --permanent && firewall-cmd --reload" else echo "添加转发规则失败!" >&2 fi } function del_rule() { fetch_forward_rules print_cur_rules # 判断是否有转发规则 if [[ $count -le 0 ]]; then echo "当前没有转发规则!" exit 0 fi read -rp "请输入需要删除的规则序号(1-${count}): " port_index # 校验输入的序号是否合法 if [[ $port_index -gt 0 && $port_index -le ${count} ]]; then # 获取要删除的端口 port_to_delete=${forward_ports[$((port_index - 1))]} # 打印选中的规则,进行二次确认 echo "您选择删除的规则是: $port_to_delete" read -rp "是否确认删除 (Y/N): " confirm confirm=$(echo "$confirm" | tr '[:upper:]' '[:lower:]') # 如果确认删除 if [[ "$confirm" == "y" ]]; then # 删除转发规则 firewall-cmd --remove-forward "$port_to_delete" --permanent && firewall-cmd --reload if test $? -eq 0; then echo "已删除转发规则: $port_to_delete" #echo "同步操作到k8s-lb2..." #ssh root@k8s-lb2 "firewall-cmd --remove-forward $port_to_delete --permanent && firewall-cmd --reload" else echo "删除转发规则失败!" >&2 fi else echo "已取消删除操作。" fi else echo "无效的端口序号!$port_index" fi } function main() { # 用户选择添加或删除端口 read -rp "请选择操作 (查看: P, 添加: A, 删除: D, 退出: Q): " choice choice=$(echo "$choice" | tr '[:upper:]' '[:lower:]') # 查看 if [[ "$choice" == "p" ]]; then print_cur_rules main # 添加 elif [[ "$choice" == "a" ]]; then add_rule main # 删除 elif [[ "$choice" == "d" ]]; then del_rule main # 退出 elif [[ "$choice" == "q" ]]; then exit 0 # 无效选择 else echo "无效选择!" main fi echo "" } echo "╔═════════════════════════════════════════════════════╗" echo "║ FirewallD交互式端口转发配置脚本 ║" echo "║ v1.0 ║" echo "╚═════════════════════════════════════════════════════╝" echo "" main

十月 9, 2024 · 2 分钟 · Sulan