使用nftables完成 HTTPS , MQTTS ,GB28181视频流转发
场景是:无人机遥控->网关设备->物联网平台
无人机遥控连接网关设备WIFI热点
请求由无人机遥控主动发起
网关设备通过nfttables转发无人机遥控发起的请求
HTTPS请求地址:10.100.1.100:443
MQTTS请求地址: 10.100.1.101:8883
GB28181请求地址: 10.100.1.102:5060
无人机遥控地址: 10.100.1.2
网关设备地址:10.100.1.1
目标端地址:
HTTPS请求地址:10.100.1.100:443
MQTTS请求地址: 10.100.1.101:8883
GB28181请求地址: 10.100.1.102:5060
假设场景中,HTTPS、MQTTS 和 GB28181 的目标地址与请求地址完全一致。这意味着网关不需要进行传统意义上的“地址转换”,而只是承担路由器的角色,让遥控器与目标服务器能够跨网段通信。
如果你的目标确实不是映射到其他内网服务器,那么只需要配置基础转发和 SNAT(源地址转换)即可。以下是针对该场景的 nftables 配置方案。
1. 启用 IP 转发
网关必须开启内核转发功能,否则数据包不会被路由到外部网络。
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
2. 完整 nftables 规则
以下规则假设网关的 WIFI 接口为wlan0(连接遥控器),上游网络接口为eth0(连接物联网平台)。请根据实际接口名调整。
#!/usr/sbin/nft -f flush ruleset table inet gateway { # 1. 转发链:允许已建立的连接回包,并放行从 WIFI 到上游的流量 chain forward { type filter hook forward priority filter; policy drop; # 允许已建立或相关的连接回包 ct state established,related accept # 允许遥控器(WIFI 接口)发起的到物联网平台的流量 iifname "wlan0" oifname "eth0" accept } # 2. NAT 链:对从 WIFI 接口出去的流量做源地址伪装 chain postrouting { type nat hook postrouting priority srcnat; policy accept; # 将来自遥控器的流量源地址改为网关的上游接口地址 oifname "eth0" masquerade } }3. 规则说明
转发链 (forward):由于遥控器请求需要经过网关转发到外部网络,必须显式允许forward流量。这里只允许wlan0到eth0的新建连接,并允许回程流量。
NAT 链 (postrouting):使用masquerade是最适合网关场景的选择。它会自动将数据包的源地址改为eth0的 IP 地址,这样物联网平台的服务器(10.100.1.100 等)才能将响应正确回传给网关,再由网关转给遥控器。
4. 关于“目标地址”的澄清
在你的描述中,请求地址和目标端地址完全相同(例如 HTTPS 都是10.100.1.100:443)。这意味着:
不需要 DNAT(目标地址转换)。DNAT 通常用于将“公网 IP 的端口”映射到“内网服务器的真实 IP”。既然目标服务器本身就在10.100.1.x网段且可达,网关只需要做路由转发即可。
5. 验证与持久化
应用规则后,可以简单验证:
# 查看规则是否加载 nft list ruleset # 在遥控器上测试连通性(如果遥控器支持 ping 或 curl) # 检查网关转发计数 nft list chain inet gateway forward
将上述配置保存到/etc/nftables.conf并启用服务即可开机自启。