使用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
注意事项
- 确保
firewalld
服务已启动:如果firewalld
未启动,规则将无法生效。 - 检查内核IP转发功能:如果转发仍然无效,可能需要检查内核是否启用了IP转发功能。可以通过以下命令启用:
sysctl -w net.ipv4.ip_forward=1 sysctl -p
- 确保目标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>