我有一个 AWS Lightsail 实例
- 我希望将我网络中的所有流量路由到特定 IP 地址(即 192.168.1.225)
- 并且我希望通过我的公共 IP 路由所有指向 192.168.1.0/24 的流量
我一直在尝试通过 iptables NAT,但这似乎不起作用:
# on my router
iptables -t nat -A PREROUTING -d 192.168.1.225 -j DNAT --to-destination $AWS_ADDRESS
iptables -t nat -A POSTROUTING -s $AWS_ADDRESS -j SNAT --to-source 192.168.1.225
和
# on lightsail
iptables -t nat -A PREROUTING -d 192.168.1.144 -j DNAT --to-destination $PUBLIC_IP
iptables -t nat -A POSTROUTING -s $PUBLIC_IP -j SNAT --to-source 192.168.1.144
我在这里做错了什么?
答案1
您是否考虑过/尝试过使用 ssh 进行端口转发?我认为您只能转发几个端口,但这似乎正是它能为您做的事情。
答案2
第一个问题:您尝试使用子网本地的地址。同子网流量才不是通过路由器,不受路由器防火墙规则的影响。当 LAN 中的其他计算机想要访问 时192.168.1.225
,它们会立即发送本地 ARP 查询以了解其 MAC 地址。
可以通过为 AWS 主机使用不同的子网或在路由器上配置代理 ARP,使其欺骗该地址的 ARP 响应来避免这种情况。
第二个问题:IP 数据包只能携带一个目的地,因此 DNAT 会丢失信息 - 接收者(您的本地路由器)不再知道原始目的地应该是什么。(只有执行转换的同一主机才有此信息。)因此,AWS 主机可以将单个目的地 DNAT 到您的本地公共地址,但无法 DNAT 整个 /24。
为了避免这种情况,你需要隧道数据包 – 不是转换数据包,而是将原始数据包封装在第二个 IP 标头中。(也称为 VPN。)在 Linux 上配置隧道有很多选项,从普通的 IPIP 或 GRE 到 IPsec 到 WireGuard 或 Tinc 或 OpenVPN。
大多数隧道/VPN 类型都是 L3(它们内部承载 IP 数据包),因此你仍然需要使用与常规 LAN 子网不同的子网号,并且让路由器实际路线LAN 接口和 VPN/隧道接口之间。
一些隧道支持 L2 模式(内部承载以太网帧),例如 EoIP、gretap、OpenVPN --dev-type tap、ZeroTier。这些 L2 隧道接口可以桥接与您的 LAN 一起使用,允许两侧使用相同的子网(具有完全正常工作的 ARP),这正是您最初要求的。