使用firewall-cmd配置SIP端口转发,实现双网卡互通,内外网方式

发布于:2025-03-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

使用firewall-cmd配置SIP端口转发,实现双网卡,内外网方式

脚本内容

这里以内网IP: 192.168.2.88

这里以外网IP: 10.3.3.3

以下是一个用于启用和停用端口转发的Shell脚本:

#!/bin/bash

# 配置变量
ZONE="public"
TARGET_IP="192.168.2.88"
PORT="5060"
PROTO_TCP="tcp"
PROTO_UDP="udp"
RANGE_PORT_START="16384"
RANGE_PORT_END="32768"

function enable_forwarding() {
    # 启用IP伪装
    firewall-cmd --permanent --zone=$ZONE --add-masquerade
    # 添加5060 TCP端口转发规则
    firewall-cmd --permanent --zone=$ZONE --add-forward-port=port=$PORT:proto=$PROTO_TCP:toaddr=$TARGET_IP
    # 添加5060 UDP端口转发规则
    firewall-cmd --permanent --zone=$ZONE --add-forward-port=port=$PORT:proto=$PROTO_UDP:toaddr=$TARGET_IP
    # 添加16384-32768 UDP端口范围转发规则
    firewall-cmd --permanent --zone=$ZONE --add-rich-rule="rule family='ipv4' forward-port port='$RANGE_PORT_START-$RANGE_PORT_END' protocol='udp' to-addr='$TARGET_IP'"
    # 重新加载防火墙配置
    firewall-cmd --reload
    # 验证配置
    firewall-cmd --zone=$ZONE --list-forward-ports
    firewall-cmd --zone=$ZONE --list-rich-rules
    echo "端口转发已启用,将5060端口的TCP和UDP流量以及16384-32768端口范围的UDP流量转发到$TARGET_IP"
}

function disable_forwarding() {
    # 移除5060 TCP端口转发规则
    firewall-cmd --permanent --zone=$ZONE --remove-forward-port=port=$PORT:proto=$PROTO_TCP:toaddr=$TARGET_IP
    # 移除5060 UDP端口转发规则
    firewall-cmd --permanent --zone=$ZONE --remove-forward-port=port=$PORT:proto=$PROTO_UDP:toaddr=$TARGET_IP
    # 移除16384-32768 UDP端口范围转发规则
    firewall-cmd --permanent --zone=$ZONE --remove-rich-rule="rule family='ipv4' forward-port port='$RANGE_PORT_START-$RANGE_PORT_END' protocol='udp' to-addr='$TARGET_IP'"
    # 移除IP伪装
    firewall-cmd --permanent --zone=$ZONE --remove-masquerade
    # 重新加载防火墙配置
    firewall-cmd --reload
    # 验证配置
    firewall-cmd --zone=$ZONE --list-forward-ports
    firewall-cmd --zone=$ZONE --list-rich-rules
    echo "端口转发已停用"
}

function list_forwarding() {
    # 列出当前的转发规则
    firewall-cmd --zone=$ZONE --list-forward-ports
    firewall-cmd --zone=$ZONE --list-rich-rules
}

case "$1" in
    enable)
        enable_forwarding
        ;;
    disable)
        disable_forwarding
        ;;
    list)
        list_forwarding
        ;;
    *)
        echo "用法: $0 {enable|disable|list}"
        echo "  enable - 启用端口转发"
        echo "  disable - 停用端口转发"
        echo "  list - 列出当前的转发规则"
        exit 1
        ;;
esac

exit 0

使用说明

启用端口转发

./forwarding.sh enable

停用端口转发

./forwarding.sh disable

列出当前的转发规则

./forwarding.sh list

注意事项

  1. 确保firewalld服务已启动:如果firewalld未启动,规则将无法生效。
  2. 检查内核IP转发功能:如果转发仍然无效,可能需要检查内核是否启用了IP转发功能。可以通过以下命令启用:
    sysctl -w net.ipv4.ip_forward=1
    sysctl -p
    
  3. 确保目标IP地址可访问:确认TARGET_IP在内部网络中是可访问的。

OK

这样如果你是用freeSwitch就可以去把 conf/vars.xml里的变量改一下,就可以注册使用呼叫了 :

  <X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=10.3.3.3"/> 
   <X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=10.3.3.3"/>

以上配置完后,你就可以通过 originate user/1003 3503 直接接入会了
但这里默认freeswitch还不允许外网直接呼叫内网,还要把:
conf/dialplan/public.xml 以下代码前后注释去掉,那么就通了

    <extension name="check_auth" continue="true">
      <condition field="${sip_authorized}" expression="^true$" break="never">
        <anti-action application="respond" data="407"/>
      </condition>
    </extension>

    <extension name="transfer_to_default">
      <condition>
        <action application="transfer" data="${destination_number} XML default"/>
      </condition>
    </extension>