侧边栏壁纸
博主头像
慧棱镜 All In One 服务平台 博主等级

行动起来,活在当下

  • 累计撰写 14 篇文章
  • 累计创建 41 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

各平台如何实现端口转发/映射?

创始者
2024-09-18 / 0 评论 / 0 点赞 / 40 阅读 / 0 字
广告 广告

简介(背景)

在现代网络环境中,我们经常面临各种网络配置的需求,例如在不同的网段之间进行端口转发、将WSL(Windows Subsystem for Linux)内部的服务端口映射到宿主机(即运行WSL的Windows系统)的端口,或者为了实现内网穿透而进行内网与公网之间的端口映射等场景。这些情况下,掌握正确的端口转发技术就显得尤为重要。

Windows 上的端口转发

以WSL为例,当我们在WSL内部启动一个网络服务时,默认情况下该服务仅能在WSL内部访问,其IP地址通常是类似172.27.187.142这样的私有地址。这意味着,在WSL内部启动的服务只能通过类似http://172.27.187.142:端口的形式来访问,而不能使用http://localhost:端口http://127.0.0.1:端口http://0.0.0.0:端口这样的方式从宿主机或其他外部网络访问。

实现端口映射

为了解决这一限制,并让外部网络能够访问WSL内部的服务,我们需要配置端口转发,将WSL内部服务的端口映射到宿主机的相应端口上。例如,如果WSL内部有一个监听在2283端口的服务,我们可以通过配置使得此服务能够在宿主机的2283端口上被访问。

如何设置端口转发?

在Windows环境下,可以通过以下几种方法实现端口转发:

  • 使用内置的netsh命令行工具来创建端口重定向规则;

  • 利用第三方软件如Sygate Personal Network或Candela Technologies的SoftNet2VPN;

  • 在路由器上设置端口转发规则,如果宿主机位于局域网内部的话。

示例:使用netsh工具

使用netsh命令行工具是一种常见的端口转发方法。具体操作步骤如下:

  1. 打开命令提示符窗口,并以管理员身份运行;

  2. 输入以下命令来创建一条端口转发规则:

netsh interface portproxy add v4tov4 listenport=2283 listaddress=0.0.0.0 connectport=2283 connectaddress=172.27.187.142

20240911194918.jpg

Linux上实现端口转发

在Linux环境下,也有多种方法可以实现端口转发,其中最常见的是使用iptables工具。iptables是一个强大的防火墙工具,可以用来配置网络数据包过滤以及端口重定向等任务。

使用iptables工具

配置:

假设你需要将Linux服务器上监听的某个端口(例如8080)重定向到另一个端口(例如80),你可以按照以下步骤操作:

  1. 打开终端;

  2. 输入以下命令来添加端口重定向规则:

    sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

这条命令告诉iptables,当接收到目的端口为80的数据包时,将其重定向到本地机器的8080端口。

持久化规则

需要注意的是,iptables规则在重启后会丢失。如果你希望规则持久化,可以使用一些额外的工具,如iptables-persistentiptables-save并结合系统的启动脚本,确保在系统重启后规则依然有效。

通过以上方法,无论是Windows还是Linux环境,都可以有效地实现端口转发,从而满足跨网络环境下的服务访问需求。

查看

要列出当前所有的端口转发规则,可以使用以下 iptables 命令:

iptables -t nat -L -n -v

这个命令的含义如下:

  • -t nat:指定要查看的表为 nat 表,端口转发规则通常在此表中。

  • -L:列出当前的规则。

  • -n:以数字形式显示地址和端口,避免进行 DNS 解析。

  • -v:显示详细信息,包括匹配的包和字节数。

如果想要只查看特定的链,比如 PREROUTINGOUTPUT,可以在命令中添加相应的链名:

iptables -t nat -L PREROUTING -n -v

这样你就能看到当前的端口转发规则了。

使用1Panel: 小白用户友好

其实底层还是操作iptables.

使用socat: 解决回环(lo)问题

如果 iptables 的端口转发仍无法解决回环问题,你可以考虑下 socat, socat 是一个强大的网络工具,可以将流量从一个端口转发到另一个端口。 但是他不是系统自带的(非集成工具), 得自行安装, 下面以CentOS/RedHeat系列系统为例:

yum install -y socat

你可以使用以下命令在本地转发流量:

socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009

这条命令会监听本地的 9009 端口,并将所有流量转发到 10.4.2.2:9009

后台启动 socat
1. 使用 & 符号

在命令末尾添加 & 可以让 socat 在后台运行:

socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009 &

2. 使用 nohup

nohup 可以让程序在退出终端后继续运行,同时将输出重定向到 nohup.out 文件:

nohup socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009 > socat.log 2>&1 &

3. 使用 screentmux

你也可以使用 screentmux 创建一个会话,在其中运行 socat。这样可以在后台运行,并且可以随时重新连接到该会话:

  • 启动 screentmux

    screen

    或者

    tmux

  • 在会话中运行 socat

    socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009

  • 分离会话:按 Ctrl + A 然后按 D(对于 screen),或按 Ctrl + B 然后按 D(对于 tmux)。

  • 重新连接:使用 screen -rtmux attach

4. 使用 systemd 服务

如果你希望 socat 在系统启动时自动运行,可以创建一个 systemd 服务单元。示例配置如下:

  1. 创建服务文件:

    sudo nano /etc/systemd/system/socat.service

  2. 添加以下内容:

    [Unit]
    Description=Socat Port Forwarding
    
    [Service]
    ExecStart=/usr/bin/socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

  3. 重新加载 systemd 配置并启动服务:

    sudo systemctl daemon-reload
    sudo systemctl start socat.service
    sudo systemctl enable socat.service

选择适合你的方法来在后台启动 socat

0
广告 广告

评论区