Linux 端口转发入门教程

端口转发是网络管理中非常重要的一项技术,它可以实现网络流量的转发和连接,扩展局域网的应用范围。本文牛奇网将向您介绍端口转发的基本概念、实现方法和应用场景,并通过实例详细讲解了如何在 Linux 系统上利用 iptables 配置端口转发规则。

Linux 端口转发入门教程

什么是端口转发?

端口转发是一种网络技术,它可以让一个网络设备(比如路由器或者防火墙)把收到的数据包从一个端口转发到另一个端口,从而实现网络通信的转接或者改变。

端口是什么呢?端口就是一个数字,它标识了网络设备上的一个通信接口。每个网络设备都有很多个端口,每个端口都有一个唯一的编号,从 0 到 65535。

为什么要用端口转发呢?端口转发有很多用途,比如:

  • 可以让外网访问内网的服务,比如 Web 服务器、游戏服务器、远程桌面等。
  • 可以提高网络安全,比如隐藏内网的真实 IP 地址、过滤不安全的数据包、防止端口扫描等。
  • 可以优化网络性能,比如负载均衡、缓存、压缩等。

如何在 Linux 上设置端口转发?

在 Linux 上设置端口转发有很多种方法,比如使用 iptables、firewalld、nftables、socat 等工具。 这里我们只介绍一种最常用的方法,就是使用 iptables。

iptables 是 Linux 上的一个命令行工具,它可以管理 Linux 内核的防火墙规则。 iptables 可以对网络设备收发的数据包进行过滤、修改、重定向等操作。

iptables 的基本用法是:

iptables [options] [chain] [action] [match] [target]

其中:

  • options 是一些选项,比如 -t 指定表名,-A 追加规则,-D 删除规则,-L 列出规则等。
  • chain 是规则链的名字,比如 INPUT 表示进入本机的数据包,OUTPUT 表示从本机发出的数据包,FORWARD 表示经过本机转发的数据包等。
  • action 是规则动作的名字,比如 ACCEPT 表示接受数据包,DROP 表示丢弃数据包,REJECT 表示拒绝数据包等。
  • match 是规则匹配的条件,比如 -p 指定协议类型,-s 指定源 IP 地址或者网络段,-d 指定目标 IP 地址或者网络段,--sport 指定源端口号或者范围,--dport 指定目标端口号或者范围等。
  • target 是规则目标的名字,比如 DNAT 表示目标地址转换(Destination NAT),SNAT 表示源地址转换(Source NAT),MASQUERADE 表示伪装(Masking)等。

要使用 iptables 设置端口转发,我们需要了解两个重要的概念:NAT 和 PREROUTING。

NAT 是 Network Address Translation 的缩写,意思是网络地址转换。 NAT 可以把一个网络地址(比如 IP 地址或者端口号)转换成另一个网络地址,从而实现网络通信的转接或者改变。

PREROUTING 是 iptables 的一个规则链,它表示在路由决策之前处理数据包。 PREROUTING 可以用来修改数据包的目标地址或者端口,从而实现端口转发。

下面我们来看一个具体的例子,假设我们有一个 Linux 服务器,它的 IP 地址是 192.168.1.100,它上面运行了一个 Web 服务器,监听了 80 端口。我们想让外网通过这个 Linux 服务器的 8080 端口访问这个 Web 服务器,也就是说,我们想把 192.168.1.100:8080 转发到 192.168.1.100:80。

要实现这个目的,我们需要在 Linux 服务器上执行以下两个步骤:

  • 第一步,开启内核的 IP 转发功能。 这个功能可以让 Linux 服务器把收到的数据包转发给其他网络设备,而不是只处理自己的数据包。 开启这个功能的命令是:
echo 1 > /proc/sys/net/ipv4/ip_forward
  • 第二步,使用 iptables 设置 PREROUTING 规则。这个规则可以把收到的数据包的目标端口从 8080 改成 80,从而实现端口转发。设置这个规则的命令是:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

其中:

  • -t nat 表示指定表名为 nat,nat 表是专门用来处理 NAT 的表。
  • -A PREROUTING 表示追加规则到 PREROUTING 链。
  • -p tcp 表示匹配协议类型为 TCP 的数据包。
  • --dport 8080 表示匹配目标端口为 8080 的数据包。
  • -j DNAT 表示把数据包的目标地址转换成指定的地址。
  • --to-destination 192.168.1.100:80 表示指定转换后的目标地址为 192.168.1.100:80。

执行完这两个步骤后,我们就可以通过 Linux 服务器的 8080 端口访问 Web 服务器了。

如何测试和验证端口转发?

要测试和验证端口转发是否成功,我们可以使用一些网络工具,比如 curl、telnet、nc、nmap 等。 这里我们只介绍一种最简单的方法,就是使用 curl。

curl 是一个命令行工具,它可以发送和接收 HTTP 请求和响应。 curl 的基本用法是:

curl [options] [url]

其中:

  • options 是一些选项,比如 -v 显示详细信息,-o 指定输出文件名,-H 添加请求头等。
  • url 是要访问的网址,比如 http://example.com

要使用 curl 测试和验证端口转发是否成功,我们可以在另一台网络设备上执行以下命令:

curl -v http://192.168.1.100:8080

其中:

  • -v 表示显示详细信息。
  • http://192.168.1.100:8080 表示要访问 Linux 服务器的 8080 端口。

如果端口转发成功,我们应该能看到类似以下的输出:

*   Trying 192.168.1.100...
* TCP_NODELAY set
* Connected to 192.168.1.100 (192.168.1.100) port 8080 (#0)
> GET / HTTP/1.1
> Host: 192.168.1.100:8080
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 27 Aug 2023 04:35:25 GMT
< Server: Apache/2.4.29 (Ubuntu)
< Last-Modified: Mon, 21 Aug 2023 14:16:26 GMT
< ETag: "45-55a138c1b6277"
< Accept-Ranges: bytes
< Content-Length: 69
< Content-Type: text/html
<
<html>
<head>
<title>Welcome to Web Server</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
* Connection #0 to host 192.168.1.100 left intact
* Closing connection 0

这个输出表示我们成功地访问了 Web 服务器的首页,它返回了一个简单的 HTML 文档,内容是 Hello, world!

如果端口转发失败,我们可能会看到类似以下的输出:

*   Trying 192.168.1.100...
* TCP_NODELAY set
* connect to 192.168.1.100 port 8080 failed: Connection refused
* Failed to connect to 192.168.1.100 port 8080: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 192.168.1.100 port 8080: Connection refused

这个输出表示我们无法连接到 Linux 服务器的 8080 端口,可能是因为 iptables 规则没有设置正确,或者 Linux 服务器没有开启 IP 转发功能,或者其他原因。

如何修改和删除端口转发规则?

如果我们想修改或者删除已经设置的端口转发规则,我们可以使用 iptables 的一些选项,比如 -D 删除规则,-R 替换规则,-I 插入规则等。

比如,如果我们想删除之前设置的 PREROUTING 规则,我们可以执行以下命令:

iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

其中:

  • -t nat 表示指定表名为 nat。
  • -D PREROUTING 表示删除 PREROUTING 链上的规则。
  • -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 表示匹配之前设置的规则条件。

如果我们想把之前设置的 PREROUTING 规则修改成把目标端口从 8080 改成 443,我们可以执行以下命令:

iptables -t nat -R PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:443

其中:

  • -t nat 表示指定表名为 nat。
  • -R PREROUTING 表示替换 PREROUTING 链上的规则。
  • -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:443 表示新的规则条件。

如果我们想在 PREROUTING 链上插入一个新的规则,比如把目标端口从 9090 改成 22,我们可以执行以下命令:

iptables -t nat -I PREROUTING -p tcp --dport 9090 -j DNAT --to-destination 192.168.1.100:22

其中:

  • -t nat 表示指定表名为 nat。
  • -I PREROUTING 表示插入规则到 PREROUTING 链的最前面。
  • -p tcp --dport 9090 -j DNAT --to-destination 192.168.1.100:22 表示新的规则条件。

如何查看和保存端口转发规则?

如果我们想查看已经设置的端口转发规则,我们可以使用 iptables 的 -L 选项,它可以列出指定表或者链上的所有规则。

比如,如果我们想查看 nat 表上的所有规则,我们可以执行以下命令:

iptables -t nat -L

这个命令会显示类似以下的输出:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http-alt to:192.168.1.100:80
DNAT       tcp  --  anywhere             anywhere             tcp dpt:9090 to:192.168.1.100:22

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

这个输出表示 nat 表上有四个规则链:PREROUTING、INPUT、OUTPUT 和 POSTROUTING。其中,PREROUTING 链上有两个 DNAT 规则,分别是把目标端口从 8080 改成 80 和把目标端口从 9090 改成 22。

如果我们想保存已经设置的端口转发规则,我们可以使用 iptables-save 命令,它可以把 iptables 的规则导出成一个文本文件,方便备份和恢复。

比如,如果我们想把 iptables 的规则保存到一个文件 iptables.rules 中,我们可以执行以下命令:

iptables-save > iptables.rules

这个命令会把 iptables 的规则写入到 iptables.rules 文件中,文件内容类似以下:

# Generated by iptables-save v1.8.4 on Sun Aug 27 12:35:25 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-A PREROUTING -p tcp -m tcp --dport 9090 -j DNAT --to-destination 192.168.1.100:22
COMMIT
# Completed on Sun Aug 27 12:35:25 2023

如果我们想恢复之前保存的端口转发规则,我们可以使用 iptables-restore 命令,它可以把一个文本文件中的规则导入到 iptables 中。

比如,如果我们想把 iptables.rules 文件中的规则恢复到 iptables 中,我们可以执行以下命令:

iptables-restore < iptables.rules

这个命令会把 iptables.rules 文件中的规则加载到 iptables 中,覆盖原有的规则。

总结

本文牛奇网向您介绍了 Linux 上的端口转发的基本概念和方法,以及如何使用 iptables 工具设置、测试、修改、删除、查看和保存端口转发规则。希望这篇文章能对你有所帮助,让你能更好地理解和使用 Linux 上的端口转发功能。

作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/how-to-setup-port-forward-with-iptables/

(0)
牛奇网牛奇网
上一篇 2023年8月27日 下午1:54
下一篇 2023年8月27日 下午2:25

相关推荐

发表回复

登录后才能评论