bind()可以将在IPTABLES中配置的端口作为转发端口

时间:2016-03-09 17:08:30

标签: c++ c linux sockets bind

我有一个基于Linux固件系统的网关。

我有iptables规则,允许将端口8080转发到本地主机。

我正在为这个linux网关开发一个应用程序。 此应用程序将选择8000和8100之间的随机端口。然后它将在此随机端口上生成bind()

如果随机端口是8080,bind()是否会返回OK。然后应用程序可以在端口8080上启动侦听服务器?

我不想与iptables规则发生冲突。 因此,如果bind()返回NOK,那么我可以重试选择另一个随机端口,然后重试绑定。

1 个答案:

答案 0 :(得分:0)

bind()返回正常,但不会检查任何防火墙规则。 bind()忽略防火墙规则有几个很好的理由。

  • bind()比iptables早得多,它是一个符合POSIX标准的电话。检查iptables可能会破坏向后兼容性。
  • Iptables规则可能相当复杂,很难确定bind()是否有意义。可能存在复杂的修改规则,分配给各种物理和逻辑接口的规则......
  • 即使可以确定特定端口的bind()没有意义,但规则可能会在不久的将来发生变化,绑定端口可能会变得有用。
  • ...

有可能通过C接口(如libiptc)读取iptables规则,但不建议这样做:

  

正如已经多次在邮件列表中指出的那样,libiptc   是从不意味着用作公共接口。我们不保证   一个稳定的界面,计划在下一个删除它   linux包过滤的化身。 libiptc太低层了   无论如何都要合理使用。

     

我们很清楚这种API基本缺乏,   我们正在努力改善这种状况。在那之前,它是   建议使用system()或打开stdin的管道   iptables的-恢复。后者将为您提供更好的表现。