2023.6.6

问:

在linux中,我有两个网卡,eth0和eth1,其中eth0的ip是10.168.1.1,eth1的ip是172.16.209.252。
我现在想把eth1上的端口10386转发至eth0的6666端口上,从而能够让10.168.1.0/24的设备通过此机器的eth0网卡获取172.16.209.252的10386端口上的服务,我应该怎么做呢?

答:

在 Linux 中,你可以使用 iptables 工具进行端口转发和网络地址转换 (NAT) 的配置。下面是一种可能的方法来实现你的需求:

  1. 确保你的系统上安装了 iptables 工具。可以通过运行以下命令来检查是否安装:

    sudo iptables --version
    
  2. 启用网络包转发。编辑 /etc/sysctl.conf 文件并确保以下行被取消注释(没有前面的 #):

    net.ipv4.ip_forward=1
    
  3. 应用网络包转发的配置:

    sudo sysctl -p
    
  4. 设置 iptables 规则以进行端口转发。运行以下命令:

    sudo iptables -t nat -A PREROUTING -p tcp -d 10.168.1.1 --dport 6666 -j DNAT --to-destination 172.16.209.252:10386
    sudo iptables -t nat -A POSTROUTING -p tcp -d 172.16.209.252 --dport 10386 -j SNAT --to-source 10.168.1.1
    

    这些规则的含义如下:

    • 第一条规则将所有目标地址为 10.168.1.1,目标端口为 6666 的 TCP 流量转发到 172.16.209.252:10386
    • 第二条规则将所有从 172.16.209.252 目标地址、目标端口为 10386 的 TCP 流量的源地址修改为 10.168.1.1,确保返回流量正确路由。
  5. 保存 iptables 规则,以便在系统重启后仍然生效:

    sudo iptables-save | sudo tee /etc/iptables/rules.v4
    

现在,你的系统应该已经配置好将来自 10.168.1.0/24 网络的设备的流量从 eth0 网卡的 6666 端口转发到 eth1 网卡的 10386 端口。请记得根据你的具体网络配置进行适当调整,以确保转发规则与你的环境匹配。

2023.6.7

经过实践,发现iptables使用起来真的是五味成杂...针对某些ip可以成功,而有一些则不行,而且通过lsof -i:$port这种指令也无法查询到其端口的占用情况...总之就是给人的感觉非常玄学😓,所以,继续向ChatGPT请教:

问:

除了用iptables,还有其他方法吗?这个iptable很奇怪,有时候可以,有时候又不行了,不太稳定

答:

除了使用iptables,还有其他一些方法可以实现端口转发或网络地址转换(NAT)功能。以下是其中一些常见的选项:

  1. 使用firewalld:Firewalld是CentOS中的默认防火墙管理工具,它提供了一种更简单的方式来管理防火墙规则,并支持端口转发和NAT功能。可以使用firewall-cmd命令来配置端口转发规则,例如:

    firewall-cmd --add-forward-port=port=10386:proto=tcp:toport=6666
    

    要查看当前的规则,可以使用firewall-cmd --list-all命令。

  2. 使用socat:socat是一种多功能的网络工具,它可以在不修改防火墙规则的情况下实现端口转发。通过在命令行上运行socat命令,可以创建一个将输入和输出重定向到不同端口的连接。例如:

    socat TCP-LISTEN:10386,fork TCP:localhost:6666
    

    这将在本地监听10386端口,并将传入的连接转发到本地的6666端口。

  3. 使用代理软件:代理软件(如Nginx、HAProxy等)通常具有强大的转发和负载均衡功能,可以用于实现端口转发。通过配置代理软件,可以将传入的请求转发到目标端口。具体配置方法因软件而异,请参考相应软件的文档。

无论使用哪种方法,都需要确保操作系统和网络环境的配置正确,并遵循安全最佳实践。在配置端口转发时,务必注意网络安全和防火墙规则,以确保只允许必要的流量通过。

问:

那么用nginx如何实现我的需求呢?需求信息如下:

“User
在linux中,我有两个网卡,eth0和eth1,其中eth0的ip是10.168.1.1,eth1的ip是172.16.209.252。
我现在想把eth1上的端口10386转发至eth0的6666端口上,从而能够让10.168.1.0/24的设备通过此机器的eth0网卡获取172.16.209.252的10386端口上的服务,我应该怎么做呢?”

答:

要使用Nginx实现端口转发,您可以按照以下步骤进行配置:

  1. 确保已在Linux系统上安装Nginx。您可以使用以下命令安装Nginx:

    sudo apt update
    sudo apt install nginx
    
  2. 打开Nginx配置文件以进行编辑。配置文件的位置通常是/etc/nginx/nginx.conf。可以使用文本编辑器(如nano或vi)进行编辑:

    sudo nano /etc/nginx/nginx.conf
    
  3. 在配置文件中,找到http块,并在其中添加以下配置来实现端口转发:

    http {
        server {
            listen 10.168.1.1:10386;
            location / {
                proxy_pass http://172.16.209.252:6666;
            }
        }
    }
    

    这将配置Nginx监听10.168.1.1的10386端口,并将传入的请求转发到172.16.209.252的6666端口。

  4. 保存并关闭配置文件。

  5. 检查Nginx配置文件是否有语法错误:

    sudo nginx -t
    

    如果没有错误,将显示配置文件语法正确的消息。

  6. 重新加载Nginx以使配置生效:

    sudo systemctl reload nginx
    

现在,Nginx将监听10.168.1.1的10386端口,并将传入的请求转发到172.16.209.252的6666端口。您可以通过从10.168.1.0/24的设备上访问10.168.1.1:10386来访问172.16.209.252的10386端口上的服务。请确保防火墙规则允许流量通过相应的端口。

问:

socat 如何实现呢?

答:

要使用socat实现端口转发,您可以按照以下步骤进行配置:

  1. 确保已在Linux系统上安装socat。您可以使用以下命令安装socat:

    sudo apt update
    sudo apt install socat
    
  2. 打开终端并运行以下命令来设置端口转发:

    sudo socat TCP-LISTEN:3333,fork TCP:172.16.209.252:6666
    #sudo socat TCP-LISTEN:3333,fork TCP:140.238.217.222:50121
    

    这将使socat监听本地的10386端口,并将传入的TCP连接转发到172.16.209.252的6666端口。fork选项表示socat将为每个连接创建一个子进程来处理转发。

  3. 现在,10.168.1.0/24的设备可以通过访问10.168.1.1的10386端口来获取172.16.209.252的10386端口上的服务。

请注意,当使用socat进行端口转发时,如果终端窗口关闭或socat进程终止,转发将停止。您可以将socat命令添加到系统启动脚本中,以确保在系统重新启动后自动进行端口转发。


正如GPT自己所说,如果你关闭了socat进程,那么映射也会终止,所以,继续提问

问:

socat如何silent执行呢?在后台常驻?

答:

要在后台以静默方式执行socat并使其常驻,您可以使用以下命令结合使用nohup&

nohup socat TCP-LISTEN:3333,fork TCP:140.238.217.222:50121 > /dev/null 2>&1 &

这将使socat在后台以静默模式执行,并将其输出重定向到/dev/null以忽略任何输出和错误。使用&符号将命令放入后台执行,并且nohup将使socat在终端关闭后继续运行。

请注意,上述命令中的IP地址和端口号应替换为您实际需要的值。

2023.8.14

心得体会:socat还是有点蛋疼,后台守护做的不太好,动不动掉,掉了又不自己重连,所以索性更换了更为完备的服务rinetd,其github地址为:戳我🙋,安装使用啥的请自行搜索吧很简单的😄