我正在部署一个闭源服务。但是由于某些限制,它的监听端口只能绑定到 上的某个端口127.0.0.1
。因此,我无法自定义它的代码。
下面,我以 Python 的 HTTP 服务器为例。
python -m http.server --bind 127.0.0.1 8800
现在,只有这台电脑可以访问此服务。
但是,我想让所有可以访问这台电脑的人都可以访问此服务。就像:
python -m http.server --bind 0.0.0.0 9999
许多类似的问题建议我使用SSH转发来解决。
ssh -g -L 9999:localhost:8800 -f -N [email protected]
但是 ssh 会加密数据,sshd 会解密。我是在同一台计算机之间转发。加密和解密只是浪费时间和资源。
其他一些问题指出我可以使用反向代理,例如 Nginx。但我不知道该服务使用什么协议(可能是 UDP,或者 TCP,但上层没有 HTTP),我不知道 Nginx 是否可以使用这种非 HTTP 协议。此外,我的主管不允许我安装其他软件。
那么,有没有办法通过使用iptables
或者大多数 Linux 发行版中通常安装的任何程序来解决这个问题?谢谢。
答案1
但我不知道该服务使用什么协议
那么,你将需要无论使用哪种方法,您都无法知道传输协议。端口仅存在于里面传输协议。套接字是为特定传输协议创建的;NAPT 在传输协议级别完成;匹配端口号的 iptables 规则必须知道协议;等等。
您的程序本身指定了它在创建侦听套接字时使用的传输协议,它显示在 的最左边一列netstat -ln
。最有可能的是 TCP。
你不需要知道具体应用层协议。反向代理需要支持 HTTP,因为它们的工作实际上是在 HTTP 级别处理单个请求。但是,如果您不需要任何此类处理,那么代理根本不需要支持应用程序协议 - 它只需要来回推送原始字节。
因此您可以使用各种通用的用户空间工具:
- Nginx确实有TCP代理模式。
- 据我记得,HAproxy 也是如此。
- Socat 是一个通用的“网络管道”,可以配置为监听一个地址并连接到另一个地址。
- Netcat“nc”通常是预先安装的,可以从 systemd .socket 单元启动。
如果您只想坚持使用 iptables,那么您可以使用 DNAT 规则来实现这一点:
-t nat -A PREROUTING -p tcp -m tcp --dport 8800 -j DNAT --dnat-to 127.0.0.1
但是,这将要求您启用net.ipv4.conf.all.route_localnet
sysctl,因为它会导致数据包以 127.0.0.1 为目标,但不是回环。默认情况下会丢弃此类数据包,我认为允许它们可能会存在安全问题(例如,外部主机可能能够连接到其他由于 iptables 不支持潜在敏感的“127.0.0.1”服务,因此请确保您已经拥有仅接受特定端口连接的 iptables。
答案2
您可能可以使用 iptables 类似这样的命令:
iptables -t nat -A PREROUTING -i eth0 -p tcp \
--dport 9999 -j DNAT --to-destination 127.0.0.1:8800
替换eth0
为您需要监听的接口。
您还可以抱怨收到的任务没有完成任务所需的全部详细信息。为了选择最适合该案例的解决方案,例如反向代理对阵转发端口你至少需要知道用于通信的协议/API。但你说得对SSH 隧道这不是一个好的选择!