背景
由于有些时候我们无法直接连接到应用机器的某些端口,所以需要使用流量包/连接转发才能实现。
解决方案
由于linux有iptables这个工具,而且iptables可以编写nat转发规则,所以我们选择iptables的nat表来实现转发效果。
实现原理
由于连接内部端口(如Mysql或postgres)需要一次完整的tcp连接,所以我们需要在nat表中加入两条相反的规则。一条负责外部向内的通路,一条负责内部向外的通路。当一个完整的tcp连接被模拟出来的时候,就可以实现端口的转发了。
具体操作
按照以下模板修改具体信息,并执行。
MYSQLIP='x.x.x.x' #修改此ip为Mysql主机的内网ip
NGINX='x.x.x.x' #修改此ip为nginx主机的内网ip
iptables -t nat -A PREROUTING -p tcp --dport 5432 -j DNAT --to-destination $MYSQLIP #从外向内的规则
iptables -t nat -A POSTROUTING -p tcp --dst $MYSQLIP --dport 5432 -j SNAT --to-source $NGINX #从内向外的规则
iptables-save > /etc/iptables #保存iptables规则到/etc/iptables文件
iptables-restore < /etc/iptables #加载刚才保存的文件到系统内核,修改iptables规则
补充
iptables的nat表里,有3个不同的规则链,分别是:
POSTROUTING
FORWARD
PREROUTING
这三个规则的意思分别是:
POSTROUTING: 用于修改源地址,即将源地址的公网ip修改为内网ip。
FORWARD: 流量转发。
PREROUTING: 用于修改目的地址,即将目的地址的内网ip修改为公网ip。
流量包从外网进来,会依次经过POSTROUTING->FORWARD->PREROUTING三条链,然后才可以正确地进行转发。
About me: 资深大猪蹄子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)