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

Posted

技术标签:

【中文标题】bind() 可以将 IPTABLES 中配置的端口作为转发端口【英文标题】:Could bind() take a port that was configured in IPTABLES as forwarding port 【发布时间】: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 可以在某个地方获取这种数据。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于bind() 可以将 IPTABLES 中配置的端口作为转发端口的主要内容,如果未能解决你的问题,请参考以下文章

Linux中,iptables如何信任一种服务。。

配置iptables,把80端口转到8080

配置iptables,把80端口转到8080

centos 6.5 搭建 dns服务器 详细步骤

在配置文件中保存 ember-cli 的端口号

CentOS下配置redis允许远程连接