为 Linux 特定程序绑定特定 IP 与端口

用途很明确的一个小工具,标题就说了,这个可以在不修改程序本身任何配置文件的情况下将其绑定到另外的端口或者是 IP 地址。

介绍

Bindp on Github

基于 LD_PRELOAD 机制,可以作用于:

已有的网络程序客户端 / 服务器程序,比如 nc,curl,wget,nginx 等
使用 Java 、 Python 等语言编写的网络 Server 或客户端 Client 程序
特性如下:

  • 绑定制定 IP 地址和端口
  • 添加 SO_REUSEADDR 特性支持
  • 添加 SO_REUSEPORT 特性支持
  • 添加 IP_TRANSPARENT 特性支持

安装

也没什么特别的,简单易用,直接编译一把梭

1
2
3
git clone https://github.com/yongboy/bindp.git
cd bindp
make

老铁千万别 make install 了啊,这东西编译出来是个静态库 libindp.so 文件,只需要在使用时预载就行。

这个和 tsocks 的原理其实比较像,都是通过 LD_PRELOAD 来劫持实现功能的。

使用

  • 假设本地多个可用 IP 地址包含 10.10.10.10 ,并且假设端口 49999 没被占用,那么我们可以在作为客户端访问远程服务器时进行制定 IP 地址和端口:

    1
    REUSE_PORT=1 BIND_ADDR="10.10.10.10" BIND_PORT=49999 LD_PRELOAD=/your/path/to/libindp.so nc 10.10.10.11 80
  • 假设 Nginx 配置监听 80 端口,不想修改配置文件的话而使之监听 9090 端口,可以使用

    1
    BIND_PORT=9090 LD_PRELOAD=/your/path/to/libindp.so /usr/sbin/nginx -c /etc/nginx/nginx.conf
Author: Jason Cooper
Link: https://blog.dwx.io/bind-ip-and-port-for-linux-program/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.