简介(背景)
在现代网络环境中,我们经常面临各种网络配置的需求,例如在不同的网段之间进行端口转发、将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
命令行工具是一种常见的端口转发方法。具体操作步骤如下:
打开命令提示符窗口,并以管理员身份运行;
输入以下命令来创建一条端口转发规则:
netsh interface portproxy add v4tov4 listenport=2283 listenaddress=0.0.0.0 connectport=2283 connectaddress=172.27.187.142
netsh
工具查看现有的端口转发记录,可以通过以下命令来实现:
netsh interface portproxy show all
该命令会显示当前系统中的所有端口转发配置,包括 IPv4 和 IPv6 的记录。输出内容将包含:
监听的本地地址和端口
转发的远程地址和端口
这对于查看和管理通过 netsh
设置的端口转发规则非常有用。
Linux上实现端口转发
在Linux环境下,也有多种方法可以实现端口转发,其中最常见的是使用iptables
工具。iptables
是一个强大的防火墙工具,可以用来配置网络数据包过滤以及端口重定向等任务。
使用iptables
工具
配置:
假设你需要将Linux服务器上监听的某个端口(例如8080)重定向到另一个端口(例如80),你可以按照以下步骤操作:
打开终端;
输入以下命令来添加端口重定向规则:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
这条命令告诉iptables
,当接收到目的端口为80的数据包时,将其重定向到本地机器的8080端口。
持久化规则
需要注意的是,iptables
规则在重启后会丢失。如果你希望规则持久化,可以使用一些额外的工具,如iptables-persistent
或iptables-save
并结合系统的启动脚本,确保在系统重启后规则依然有效。
通过以上方法,无论是Windows还是Linux环境,都可以有效地实现端口转发,从而满足跨网络环境下的服务访问需求。
查看
要列出当前所有的端口转发规则,可以使用以下 iptables
命令:
iptables -t nat -L -n -v
这个命令的含义如下:
-t nat
:指定要查看的表为nat
表,端口转发规则通常在此表中。-L
:列出当前的规则。-n
:以数字形式显示地址和端口,避免进行 DNS 解析。-v
:显示详细信息,包括匹配的包和字节数。
如果想要只查看特定的链,比如 PREROUTING
或 OUTPUT
,可以在命令中添加相应的链名:
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. 使用 screen
或 tmux
你也可以使用 screen
或 tmux
创建一个会话,在其中运行 socat
。这样可以在后台运行,并且可以随时重新连接到该会话:
启动
screen
或tmux
:screen
或者
tmux
在会话中运行
socat
:socat TCP-LISTEN:9009,fork TCP:10.4.2.2:9009
分离会话:按
Ctrl + A
然后按D
(对于screen
),或按Ctrl + B
然后按D
(对于tmux
)。重新连接:使用
screen -r
或tmux attach
。
4. 使用 systemd
服务
如果你希望 socat
在系统启动时自动运行,可以创建一个 systemd
服务单元。示例配置如下:
创建服务文件:
sudo nano /etc/systemd/system/socat.service
添加以下内容:
[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
重新加载
systemd
配置并启动服务:sudo systemctl daemon-reload sudo systemctl start socat.service sudo systemctl enable socat.service
选择适合你的方法来在后台启动 socat
。
评论区