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 中配置的端口作为转发端口的主要内容,如果未能解决你的问题,请参考以下文章