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)
牛奇网牛奇网
Linux如何用不同的用户身份执行命令?
上一篇 2023年8月27日 下午1:54
如何清空iptables的防火墙规则
下一篇 2023年8月27日 下午2:25

相关推荐

  • Linux如何用不同的用户身份执行命令?

    Linux 是一个多用户的操作系统,可以同时支持多个用户登录和使用。每个用户都有自己的用户名和密码,以及一定的权限和限制。有时候,我们可能需要用另一个用户的身份来执行一些命令,比如…

    2023年8月27日
    00
  • Linux中free命令用法详解

    Linux 中的 free 命令可以输出内存使用情况的概要,包括总内存、已用内存、剩余内存、共享内存以及可用内存和交换空间。该命令可以帮助监控资源使用情况,并允许管理员确定是否有足…

    2023年2月1日
    00
  • Linux如何退出vi或vim编辑器

    Vim 是一款非常流行的文本编辑器,因其强大的功能和工作效率而闻名。然而,对于刚刚接触 Vim 的新手来说,在进入Vim编辑模式时,不清楚如何退出编辑器。接下来,牛奇网为您介绍如何…

    2023年5月25日
    00
  • 如何在 Linux 上自动上传 MySQL 备份到 FTP

    如何在 Linux 上自动上传 MySQL 备份到 FTP如何在 Linux 上自动上传 MySQL 备份到 FTP如何在 Linux 上自动上传 MySQL 备份到 FTP如何在 Linux 上自动上传 MySQL 备份到 FTP

    DBA 在部署数据库后应该做的第一件事是确保定期创建备份。 但是,将备份文件存储在与 MySQL 服务器所在的同一台服务器上将是一个很大的错误。因此,应该创建一个备份,并将其放在 …

    2022年5月7日 Linux知识
    00
  • Linux中如何删除目录

    在Linux系统中,如果你想永久地删除一个目录,可以使用rmdir或者rm命令。rmdir或者rm -d命令是用来删除空目录的,而rm -r命令是用来删除非空目录和它里面的内容的。…

    2023年9月8日
    00
  • PHP有哪些版本?如何查询PHP版本?

    PHP是一种开源的服务器端脚本语言,主要用于开发网站。PHP可以在不同的操作系统平台上运行,并支持大多数主流的Web服务器,如Microsoft IIS和Apache。它还支持多种…

    2023年1月29日
    00
  • Linux系统怎么看硬盘空间使用情况?

    如果你用的是Windows电脑,那么查看电脑的硬盘空间非常简单。但是如果你用的是没有图形界面的服务器系统,比如CentOS,要怎么查看磁盘空间呢?是不是需要安装什么工具?答案是不需…

    2023年9月5日
    00
  • Linux系统中chmod命令的用法

    chmod 命令用于更改文件或目录的访问权限。在 Linux 和 Unix 系统中,每个文件和目录都有一组访问权限,它们确定了用户或组可以执行的操作,如读取、写入和执行。 chmo…

    2023年2月12日
    00
  • chmod 777命令用法详解

    chmod 777 是一条常见的Linux命令,用于更改文件或目录的权限。这个命令将文件或目录的权限设置为最宽松的状态,即所有用户都具有读取、写入和执行的权限。 下面的表格,详细介…

    2023年11月16日
    00
  • 常用的 Linux 操作命令

    一听到 Linux,大多数人都会认为,那是一个只有程序员才能使用的复杂操作系统。但事实并不像看起来那么可怕。 Linux 是一个基于 Linux 内核的开源 Unix 操作系统的整…

    2022年4月25日
    00
  • 在Linux中sudo和su有什么区别?

    sudo 和 su 是 Linux 系统中两个重要的命令。sudo(superuser do)允许用户以超级用户或具有管理权限的另一个用户的身份执行命令。当需要执行需要更高权限的任…

    2023年2月12日
    00
  • Linux 中 ls 命令及示例

    在Linux系统中,掌握ls命令的使用一直都是新手必备的技能之一。为了帮助大家更好地理解和使用这个非常实用的命令,今天牛奇网就为大家深入介绍一下ls命令。本文将从ls命令的基本用法…

    2023年8月28日
    00

发表回复

登录后才能评论