我正在尝试在EC2实例上制作自定义SIP软件。我的软件目前没有NAT处理功能,我想知道我是否可以透明地使用与EC2实例关联的公共(弹性)IP工作。
这是我的EC2盒子上运行的“iconfig -a”的输出:
eth0链接封装:以太网HWaddr XXXXXX
inet addr:PRIVATE-IP-ADDRESS Bcast:10.48.195.255掩码:255.255.254.0
inet6 addr:XXXXXX / 64范围:链接
UP BROADCAST RUNNING MULTICAST MTU:1500公制:1
RX数据包:3825错误:0丢弃:0超限:0帧:0
TX数据包:3596错误:0丢弃:0超限:0载波:0
碰撞:0 txqueuelen:1000
RX字节:259666(253.5 KiB)TX字节:1106872(1.0 MiB)
lo link encap:Local Loopback
inet addr:127.0.0.1掩码:255.0.0.0
inet6 addr ::: 1/128范围:主机
UP LOOPBACK RUNNING MTU:16436公制:1
RX数据包:78个错误:0丢弃:0超限:0帧:0
TX数据包:78个错误:0丢弃:0超限:0载波:0
碰撞:0 txqueuelen:0
RX字节:6892(6.7 KiB)TX字节:6892(6.7 KiB)
有没有办法改变这个,以便我的应用程序可以在PUBLIC(弹性)IP地址上透明地打开UDP套接字?并且基本上好像公共IP通常被分配给eth0。
我考虑过使用iptables DNAT / SNAT或手动添加IP地址,但到目前为止还没有成功。
答案 0 :(得分:3)
答案是否定的。当SIP服务器应用程序使用私有IP地址时,没有好办法让它在Internet上透明地工作。服务器应用程序需要知道它的公共IP地址以及它应该优先使用该IP地址的事实。 SIP要求将公共地址插入多个标题中,例如Record-Route,Route和Contact。作为服务器,它还需要在SDP有效载荷中使用公共IP地址来进行INVITE请求和响应。大多数SIP服务器应用程序都能够执行此操作,如果您正在编写自定义服务器,那么建议您将该功能添加到您的服务器中。
除了上述内容之外,您还可以通过一种方式使用私有IP地址,即在应用程序前安装SIP应用层网关(ALG)并使用它来破坏所有私有IP地址来自服务器的SIP数据包。然而,SIP ALG是一场灾难,总是会导致比他们解决的问题更多的问题所以我强烈建议你不要走这条路。
答案 1 :(得分:2)
我建议为EC2购买静态IP。您将节省很多的努力。尽管如此,您将不得不考虑SIP通信中的NAT。顺便说一句,在大多数情况下,nat遍历是从基础设施处理的 - sip路由器/网关/ SIP服务器 - 添加/删除"路由" SIP消息中的标头。 SIP服务意图拥有公共端点,所以我不确定您是否必须实现NAT功能。您谈论的这个自定义SIP软件,我假设它是客户端,而不是服务器。
答案 2 :(得分:2)
我遇到了类似的问题,我通过编辑我的sip_nat.conf文件解决了以下问题:
externip=x.x.x.x
localnet=10.0.0.0/255.0.0.0
nat=yes
当然,你的里程可能会有所不同,但这似乎解决了很多问题。当然,如果您的IP发生变化或启动了新实例,您必须弄清楚更新Asterisk的配置并重新加载设置。
我的理解是没有告诉它IP地址,它总是ping一些服务器来取回它,但Asterisk有一个问题,如果它在ping响应之前收到任何其他数据,它不够聪明,知道它是不是IP地址。硬编码似乎解决了很多问题。
答案 3 :(得分:0)
来自https://forums.aws.amazon.com/
的回答弹性IP地址使用1:1 NAT映射到实例。实例本身并不知道公共地址。由于这个地址不能绑定到接口,我担心你需要以另一种方式处理它。您将希望避免更改网络配置,因为它可能会导致连接丢失。
答案 4 :(得分:0)
这是另一种方法,可以让你的啜饮与星号一起使用。
在sip.conf或chan_sip.conf中 - > [general]
设置,添加这些
nat=force_rport,comedia
externip=<PUBLIC_IP/ELASTIC_IP>
localnet=<PRIVATE_IP>/20
如果您不使用弹性IP,则每次重新启动服务器时都可能需要更改公共IP。 希望这有帮助