问题——将 10.8.ab 翻译为 10.0.ab?

问题——将 10.8.ab 翻译为 10.0.ab?

问题——将 10.8.ab 翻译为 10.0.ab?

我已将 VPN 设置到堡垒主机。我正尝试进行映射,10.8.0.0/17以便10.0.0.0/17将 IP 地址10.8.1.1映射到10.0.1.1我的本地网络中。

我认为这个问题的罪魁祸首是

iptables -t nat -A PREROUTING -d 10.8.0.0/17 -j DNAT --to-destination 10.0.0.0-10.0.127.255
                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
####
# This allows you to DNAT connections in a round-robin way over a given range of destination addresses.
# --to-destination ipaddr-ipaddr
#     Address range to round-robin over. 
# What I Want:
#    10.8.0.1 -> 10.0.0.253 -> 10.0.0.1
# What I Get:
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
04:41:15.934726 IP 10.8.255.1 > 10.8.0.1: ICMP echo request, id 93, seq 1, length 64

listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
05:50:27.228399 IP 10.0.0.253 > 10.0.52.24: ICMP echo request, id 93, seq 1, length 64
                                ^^^^^^^^^^
                              Wrong IP Address!!!

如何将目的地的(前 17 位/后 15 位)写入新目的地。我想要实现的一个更清晰的例子是10.8.0.100在 VPN 中关联到10.0.0.100在我的 LAN 网络中。

注意:这是我第一次在两个网络之间设置路由,如果有任何明显的错误或与正常惯例不一致,请解决,我还在学习。IPTables 如何将 10.8.ab nat 到 10.0.ab?

网络

局域网 (10.0.0.0/16)

网络 VPN IP
10.0.0.1 ISP 网关
10.0.0.253 首页 OpenVPN 网关 (10.8.255.2

VPN(10.8.0.0/16)

网络 VPN IP
10.8.0.0/16 预留客户(开始于10.8.128.1
10.8.0.0/17 IP 转发 NAT10.8.0.0/17 -> 10.0.0.0/17 通过 10.8.255.2
10.8.255.1 云服务器网关
10.8.255.2 主页 OpenVPN 网关 (LAN:10.0.0.253

VPN 路由

网络 网关 笔记
10.8.0.0/16 10.8.255.1 整个网络
10.8.0.0/17 10.8.255.2 所有 IP 地址都应将最后 15 位转换为目的地(10.8.0.100 -> 10.0.0.100

IP表

root@gwhome# iptables -A FORWARD -i tun0 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
root@gwhome# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
root@gwhome# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
root@gwhome# iptables -t nat -A PREROUTING -d 10.8.0.0/17 -j DNAT --to-destination 10.0.0.0-10.0.127.255

此机器不是网络网关,所以我看到有人提到需要SNAT,但我认为应该通过 来缓解这种需要MASQUERADE。如能确认这一点,我将不胜感激。

ping 10.8.0.1(局域网:10.0.0.1)

root@cloud-server# ping 10.8.0.1 -c 3
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.

--- 10.8.0.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2078ms

tun0 嗅探

root@gwhome# tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
04:41:15.934726 IP 10.8.255.1 > 10.8.0.1: ICMP echo request, id 89, seq 1, length 64
04:41:16.989078 IP 10.8.255.1 > 10.8.0.1: ICMP echo request, id 89, seq 2, length 64
04:41:18.013008 IP 10.8.255.1 > 10.8.0.1: ICMP echo request, id 89, seq 3, length 64
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel

eth0 嗅探

root@gwhome# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
05:50:27.228399 IP 10.0.0.253 > 10.0.52.24: ICMP echo request, id 93, seq 1, length 64
05:50:28.234007 IP 10.0.0.253 > 10.0.52.24: ICMP echo request, id 93, seq 2, length 64
05:50:29.257588 IP 10.0.0.253 > 10.0.52.24: ICMP echo request, id 93, seq 3, length 64
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel

答案1

目标DNAT在这里不起作用;它将所有内容翻译成主机或从指定范围中随机选择的主机。(基本上,它是用于匹配目标主机,即-d foo/32.)

对于前缀翻译,您需要寻找NETMAP目标:

  • iptables:
    -d 10.8.0.0/16 -j NETMAP --to 10.0.0.0/16

  • nftables(新):
    ip daddr 10.8.0.0/16 dnat ip prefix to ip daddr map { 10.8.0.0/16 : 10.0.0.0/16 }

  • nftables(所有版本):
    ip daddr 10.8.0.0/16 dnat to ip addr & 0.0.255.255 | 10.8.0.0

(除此之外,它NETMAP仍然是一种 DNAT 形式,并使用相同的 iptables NAT/conntrack 基础设施DNAT。)

这台机器不是网络网关,所以我看到有人提到需要 SNAT,但我认为 MASQUERADE 应该可以缓解这种需要。如能确认这一点,我将不胜感激。

是的,MASQUERADE也是 SNAT,只不过它会自动从出站接口选择新的源地址,而SNAT目标需要手动指定。

即使您无法在 LAN 网关上为 VPN 配置路由,您仍可以通过在每台主机上直接配置相同的路由(例如route -p add在 Windows 上使用,或 DHCP 选项 121)来(部分)避免使用 SNAT。这是您无法在全部设备,但如果您只想访问 PC 或服务器,这可能就足够了。

答案2

您想要的 IPTables 目标是NETMAP

此目标允许您将整个地址网络静态映射到另一个地址网络。它只能在 nat 表中的规则中使用。

- 到 地址[/面具]
    要映射到的网络地址。生成的地址将按以下方式构建:掩码中的所有“1”位都从新“地址”填充。掩码中所有为零的位都从原始地址填充。自 Linux 内核 >= 3.7 起,支持 IPv6。

还请记住,您的本地主机(在10.0.0.0/17) 必须将其响应流量导向 VPN。

答案3

另一个可行的解决方案是通过一次性重新编号的痛苦让您的家庭网络变得更加独特。

不要选择常见的网络,而是使用 172.16.0.0/12 中的一个块重新编号,最高可达 172.31.255.255。

这可能只是重新配置路由器的 LAN 端口和 DHCP 范围,并使用静态 DHCP 保留或静态本地 IP 配置更新任何设备。您可能还需要重新配置网络打印机或相机。

如果您不需要那么多 IP,那么 172.27.0.0 /16 或较小的网络块是一个不错的选择。

192.168.(100 到 254 之间的某个值)/24 也很有用。192.168.0 和 1 和 10 中的块往往被过度使用。

其他不常见的 RFC1918 块可能包括来自 198.18.0.0/15 的子网,完整列表请见https://en.wikipedia.org/wiki/Reserved_IP_addresses#IPv4尽管您的结果可能会因某些专业网络而有所不同。

明智地选择,您将不再需要这样做。

相关内容