环境:
防火墙 - Ubuntu Server 17.10.
SIP - Yate客户端,Asterisk服务器
网络拓扑:
1)防火墙配置IP,打开转发:
ifconfig enp2s0 192.168.1.131
ifconfig enp3s0 192.168.100.1
echo 1 > /proc/sys/net/ipv4/ip_forward
2)加载nf_nat_sip模块建立expectations:
modprobe nf_nat_sip
3)配置FORWARD链,仅接收192.168.1.0/24网段的新建数据流和已建立或关联的数据流:
iptables -t filter -P FORWARD DROP
iptables -t filter -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -A FORWARD -p udp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -j LOG
4)使能conntrack的SIP helper:
echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
或者:
iptables -t raw -A PREROUTING -p udp -m udp --dport 5060 -j CT --helper sip
5) 配置SNAT:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.100.1
6)检查conntrack建立情况:
root@localhost:~# conntrack -L
udp 17 28 src=192.168.1.104 dst=192.168.100.100 sport=20551 dport=15061 src=192.168.100.100 dst=192.168.100.1 sport=15061 dport=20551 mark=0 use=1
udp 17 179 src=192.168.1.104 dst=192.168.100.100 sport=20550 dport=15060 src=192.168.100.100 dst=192.168.100.1 sport=15060 dport=20550 [ASSURED] mark=0 use=1
udp 17 3596 src=192.168.1.104 dst=192.168.100.100 sport=65309 dport=5060 src=192.168.100.100 dst=192.168.100.1 sport=5060 dport=65309 [ASSURED] mark=0 helper=sip use=3
root@localhost:~#
创建了一条dport等于5060的主session和一条RTP(dport等于20550)、一条RTCP的子session。
或者配置DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.131 -i enp2s0 -j DNAT --to-destination 192.168.100.100
再次检查conntrack建立情况:
root@localhost:~# conntrack -L
udp 17 179 src=192.168.1.104 dst=192.168.1.131 sport=29448 dport=16988 src=192.168.100.100 dst=192.168.1.104 sport=16988 dport=29448 [ASSURED] mark=0 use=1
udp 17 3595 src=192.168.1.104 dst=192.168.1.131 sport=53966 dport=5060 src=192.168.100.100 dst=192.168.1.104 sport=5060 dport=53966 [ASSURED] mark=0 helper=sip use=3
udp 17 27 src=192.168.1.104 dst=192.168.1.131 sport=29449 dport=16989 src=192.168.100.100 dst=192.168.1.104 sport=16989 dport=29449 mark=0 use=1
root@localhost:~#
测试间隔必须清空conntrack -D,以免残留connection对新连接造成影响。