【问题标题】:Could bind() take a port that was configured in IPTABLES as forwarding portbind() 可以将 IPTABLES 中配置的端口作为转发端口
【发布时间】:2016-03-09 17:08:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 转发独立于绑定而存在。如果没有进程绑定到某个端口,则该端口可用于绑定,即使进出该端口的任何流量已被转发到其他地方。
  • @MarcB 有没有办法找出用 C 进行 iptables 转发时使用的所有端口?
  • iptables 必须能够读出它自己的内部规则表,所以可能有一个 api/interface 可以在某个地方获取这种数据。

标签: c++ c linux sockets bind


【解决方案1】:

bind() 返回 ok 并且它不检查任何防火墙规则。 bind() 忽略防火墙规则有几个很好的理由。

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

可以通过libiptc等C接口读取iptables规则,但不推荐:

正如在邮件列表中多次指出的那样,libiptc 从来没有打算用作公共接口。我们不保证 一个稳定的接口,计划在下一个移除它 linux数据包过滤的化身。 libiptc 太底层了 无论如何都要合理使用。

我们很清楚这种 API 根本就缺乏, 我们正在努力改善这种情况。在那之前,它是 建议使用 system() 或打开管道进入标准输入 iptables-恢复。后者将为您提供更好的性能。

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2015-06-17
    • 2013-06-27
    • 2016-09-30
    • 2020-05-14
    相关资源
    最近更新 更多