一、什么是内网转发
Linux内网转发是指将一台Linux服务器作为网络中转站,把从一个网卡或端口接收到的数据包,转发到另一个目标地址。它常被用于:让无公网IP的内网服务被外网访问、打通不同网段的隔离网络、或者隐藏真实业务服务器的IP。
二、开启内核IP转发
内网转发的第一步是开启Linux内核的IP转发功能,否则系统会丢弃非本机的数据包。
临时开启(重启失效):
```bash
echo 1 > /proc/sys/net/ipv4/ip_forward
```
永久开启(编辑 `/etc/sysctl.conf`):
```bash
net.ipv4.ip_forward = 1
sysctl -p 使配置生效
```
三、两种主要的转发方式
| 转发方式 | 实现工具 | 适用场景 | 特点 |
|---------|---------|---------|------|
| 端口转发 | iptables/firewalld | 将特定端口的流量转发到另一台服务器 | 精确控制,适合暴露内网服务 |
| IP转发+SNAT | iptables | 整个网段或所有流量通过中转服务器路由 | 让内网设备共享公网出口,或连接不同网段 |
1. iptables端口转发(TCP/UDP)
```bash
将访问本机8080端口的流量转发到内网192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -j MASQUERADE 关键:让返回包能正确路由
```
2. IP转发+SNAT(共享上网/网段互通)
如果想让内网其他设备通过这台Linux服务器上网,需要添加SNAT规则:
```bash
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
```
这条命令让从内网网段发出的流量,在经过eth0网卡出去时,源IP被替换为eth0的IP,从而实现“上网共享”。
四、应用场景举例
| 场景 | 解决方案 |
|------|---------|
| 外网访问内网Web服务 | 端口转发:公网IP:8080 → 内网服务器:80 |
| 内网设备通过一台服务器上网 | IP转发 + SNAT + 内网设备设置中转机为网关 |
| 打通两个不同网段的VPC | 中转服务器开启IP转发,配置静态路由 |
五、关键注意事项
- 防火墙放行:确保iptables或firewalld的FORWARD链允许转发流量
- 开启MASQUERADE:端口转发务必添加MASQUERADE规则,否则回包无法送达客户端
- SELinux干扰:可临时`setenforce 0`测试是否为SELinux导致转发失败
一句话总结:开启`ip_forward` → 用iptables添加DNAT+MASQUERADE规则 → 配置防火墙允许转发,即可实现Linux内网转发。