3

我正在尝试使自定义 SIP 软件在 EC2 实例上运行。我的软件目前没有 NAT 处理能力,我想知道是否可以让它与与 EC2 实例关联的公共(弹性)IP 透明地工作。

这是在我的 EC2 机器上运行的“iconfig -a”的输出:

eth0 Link encap:Ethernet HWaddr XXXXXX
inet addr: PRIVATE-IP-ADDRESS Bcast:10.48.195.255 Mask:255.255.254.0
inet6 addr: XXXXXX/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packet: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 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packet:78 errors:0 dropped:0 overruns: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 地址,但目前没有成功。

4

5 回答 5

3

我建议为 EC2 购买静态 IP。你会省很多力气。尽管如此,您通常必须考虑 SIP 通信中的 NAT。顺便说一句,在大多数情况下,nat 遍历是从基础设施处理的 - sip 路由器/网关/sip 服务器 - 它在您的 SIP 消息中添加/删除“路由”标头。SIP 服务意图拥有公共端点,所以我不确定您是否必须实现 NAT 功能。你所说的这个定制的 SIP 软件,我假设它是客户端,而不是服务器。

于 2012-04-04T15:46:46.900 回答
3

答案是不。当 SIP 服务器应用程序使用私有 IP 地址时,没有好的方法可以让其在 Internet 上透明地工作。服务器应用程序需要知道它的公共 IP 地址以及它应该优先使用该 IP 地址而不是私有 IP 地址这一事实。SIP 需要在多个标头中插入公共地址,例如 Record-Route、Route 和 Contact。作为服务器,它还需要使用 SDP 有效负载中的公共 IP 地址来进行 INVITE 请求和响应。大多数 SIP 服务器应用程序都具有执行此操作的能力,如果您正在编写自定义服务器,那么建议您添加该功能。

除了上述之外,还有一种方法可以让您摆脱使用私有 IP 地址,那就是在您的应用程序前面安装一个 SIP 应用层网关 (ALG),并使用它来破坏 SIP 中的所有私有 IP 地址来自您的服务器的数据包。然而 SIP ALG 是一场灾难,并且总是导致比他们解决的问题更多的问题,所以我强烈建议你不要走这条路。

于 2012-04-04T23:05:55.797 回答
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地址。硬编码似乎可以解决很多问题。

于 2012-04-18T22:49:32.633 回答
0

来自https://forums.aws.amazon.com/的回答

弹性 IP 地址使用 1:1 NAT 映射到实例。实例本身不知道公共地址。由于这个地址不能绑定到接口上,恐怕你需要换一种方式处理。您需要避免更改网络配置,因为它可能会导致连接丢失。

于 2012-04-10T09:02:06.973 回答
0

这是另一种使您的 sip 与星号配合良好的方法。

在 sip.conf 或 chan_sip.conf ->[general]设置中,添加这些

nat=force_rport,comedia
externip=<PUBLIC_IP/ELASTIC_IP>
localnet=<PRIVATE_IP>/20

如果您没有使用弹性 IP,那么您可能必须在每次重新启动服务器时更改公共 ip。希望这可以帮助

于 2016-08-16T12:59:02.457 回答