Linux 内部端口转发

实现外网访问80端口,由内部转发至8080端口

问题背景

通过 frp + docker 实现了外网访问小主机的 nextcloud 云盘(开放8080端口),问题在于 80 端口被占用,只好用域名+端口的形式来实现访问,如 xxx.wuzhiping.top:8080,不够优雅,想把域名后面的端口号直接去除。
一顿查阅各种资料,找到了 Linux 内部端口转发的方法,即外部访问80端口时( http 域名的默认端口)内部转发到8080端口,实现不填写端口号即可访问。

环境简述

  • 本地主机:docker 搭建了 nextcloud 服务
  • 远程主机:阿里云服务器,固定ip,Ubuntu21 系统
  • 远程访问:frp 实现二级域名转发到本地主机上的 nextcloud(云主机8080端口映射本地主机 nextcloud 的端口)
  • iptables 如未安装,可通过命令 sudo apt install iptables-services

关键步骤

  1. 准备:释放内部端口转发的功能

编辑 /etc/sysctl.conf,取消这一行的注释

1
#net.ipv4.ip_forward=1
  1. 保存并验证上一步的操作

保存文件,通过命令确认是否生效,打印出的是 net.ipv4.ip_forward=1 即生效

1
sudo sysctl -p
  1. 手动操作内部端口转发

基本命令及释义:

1
iptable -t nat -A  PREROUTING -p tcp --dport  "
原端口"  -j  REDIRECT --to-port  "


目标端口"

参数释义:
-t: table table to manipulate (default: `filter’)
-A: 向规则链中添加条目
PREROUTING链:用于目标地址转换(DNAT),路由前。
-p:指定要匹配的数据包协议类型;
–dport: 目的端口,即客户端要访问的端口
-j: jump 指定要跳转的目标
REDIRECT: 重定向、映射、透明代理
–to-port: 跳转到的端口号

以本次要解决的问题为例,外网输入网址–访问80端口–内部转发至8080端口–获取对 nextcloud 服务的访问

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

保存配置

1
service iptables save
  1. 查询与撤销操作
1
sudo iptables -t nat -nL --line

找到 Chain PREROUTING (policy ACCEPT) 这一栏,注意查看 num 序号

删除指定表的指定链上的规则, -D 并指定对应序号即可(对应的序号会及时变动)。

1
iptables -t nat -D PREROUTING 1

彩蛋:高级玩法

一点小思考:明白了内网中转的办法,想到一个场景,通过一台远程主机管理另一台远程主机,相当于一台跳板,不过前提是两台主机都要有固定 ip 才行吧!

要是未来 ipv6 全面普及了,估计能解放不少生产力!

这个网站可以测测自己是不是有 ipv6地址:IPv6 测试

Ref

Changelog

  • 210913 米斯特乌建立初稿
查看评论