如何通过 iptables 访问远程服务器的本地网络

如何通过 iptables 访问远程服务器的本地网络

我有 2 台具有公共 IP 的 Linux 服务器。在其中一台服务器(例如 A 服务器)上,我已通过 ipsec 配置 VPN,可以访问某些私有网络(10.0.0.0/16)。我的问题如下:如何配置(通过 iptables)从第二台服务器(B 服务器)访问 A 服务器的私有网络?我知道可以通过 NAT 和 ip 路由来实现,但我对此并不十分熟悉。我知道最简单的方法是在 B 服务器上配置 VPN,但 B 服务器的操作系统已过时,并且无法配置 IKEv2 ipsec 连接 :(

服务器 A:

  • 公网 IP 1.2.3.4eth0
  • VPN IP 10.0.0.1 开启ipsec0

服务器B:

  • 公网 IP 1.2.3.5eth0

请帮助我并给出建议,我应该在 A 和 B 服务器上添加哪些规则,以便从 B 服务器访问 A 服务器的本地网络。

注意:不幸的是,服务器 A 和 B 之间没有专用网络

答案1

如果我正确理解了这个问题,你可以通过两种方式实现这一点:1-完全使用路由2-使用 NAT

仅路由方法

从服务器 A 的角度来看,两个网络直接连接,因此这里不需要 iptables 转发规则。

在服务器 A 上:

net.ipv4.ip_forward = 1通过添加来启用 IP 转发/etc/sysctl.conf并使用 来应用它sysctl -p /etc/sysctl.conf

在服务器 B 上:

为私有 IP 块添加一条通往服务器 A 的路由:route add -net 10.0.0.0/16 gw 1.2.3.4

NAT 方法

在此方法中,您可以使用 iptablesnat表在服务器 A 上对私有 IP 进行 NAT:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

或者

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j SNAT --to-source 1.2.3.4

然后,在 iptables 表中添加在两个接口之间转发流量所需的任何规则filter,并在 中启用 IP 转发sysctl

但是,在此方法中,服务器 B 与私有 IP 设备之间的连接应始终从私有 IP 端发起(由于多对一 NAT,又称 PAT)。如果您需要一对一 NAT,则需要一个公共 IP 池。

答案2

设置仍不清楚。请根据需要编辑问题。

假设您有服务器 A 和服务器 B 通过 VPN 连接,其配置如下:

服务器 A:

  • 公网 IP 1.2.3.4eth0
  • VPN IP 10.0.0.1 开启vpn0
  • 192.168.10.1/24 上的服务器 A 后面的私有网络eth1,服务器 A 充当网关

服务器B:

  • 公网 IP 1.2.3.4eth0
  • VPN IP 10.0.0.2 开启vpn0
  • 192.168.20.1/24 上的服务器 A 后面的私有网络eth1,服务器 B 充当网关

然后您需要设置路由,例如ip route add 192.168.20.0/24 via 192.168.20.1 dev eth1在服务器 A 和ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1服务器 B 上。

ip route get <dest-addr>首先在两台服务器上使用和ping(如有必要,使用)进行验证ping -I ...,然后在服务器后面的机器上进行验证。使用tcpdump -ni eth1等查看 ping 的距离。

编辑

好的,看起来你在服务器 A 和 B 之间有一个 VPN,而您要访问的“专用网络”不在服务器 A 后面,而是实际上就是 VPN,具有专用 IP 地址范围。

这行不通:您无法通过公共互联网路由私有 IP 目的地。您也不能用iptables它来做到这一点。

所以你需要一些服务器 A 和服务器 B 之间的隧道类型。即使服务器 B 有一个过时的操作系统,没有可配置的 IPsec 隧道,也有很多其他选择(Tinc、OpenVPN,甚至是ip gre20 年前已经运行的未加密隧道……)。

因此,请找出服务器 B 支持哪种隧道。然后在服务器 A 和服务器 B 之间建立隧道(加密或非加密),并按上述步骤进行。

答案3

如果你真的当您说公共 IP 时,指的是公共 IP,而不是以太网 LAN 中的私有 IP(即不是虚拟私人网络(又称 VPN),那么您很可能必须设置某种 VPN。虽然您会说服务器 B 的操作系统过时了等等,但它甚至不必(事实上最好不要)是 VPN 服务器。您只需设置其他VPN服务端在服务器A上,仅供服务器B作为客户端。

如果 A 和 B 实际上在同一个 LAN 中,这样 A 就可以成为 B 的网关(据我所知,这基本上意味着您可以使用 ARP 从 B 定位 A 并在它们之间进行第 2 层交换),您可以在 B 上添加以下路由:

ip route add 10.0.0.0/16 via 1.2.3.4 dev eth0 src 1.2.3.5

(据我所知,devsrc部分是可选的,在某些情况下甚至可能不是必需的)


如果服务器 A 是 VPN 服务器,并且是 的默认网关10.0.0.0/16,则您无需在路由方面做任何进一步的操作。如果不是,则需要向默认网关或任何需要通过服务器 B 访问的主机添加返回路由。

ip route add 1.2.3.5 via 10.0.0.1

当服务器 A 不是 VPN 服务器而是客户端时,可能需要进一步配置10.0.0.0/16,例如对于 OpenVPN,您需要添加iroute


如果您想避免添加返回路由,或者出于某种原因您需要将服务器 B “伪装”为服务器 A 到 10.0.0.0/16 中的主机,您可以使用iptables 的MASQUERADE或:SNAT

iptables -t nat -A POSTROUTING -s 1.2.3.5 -o ipsec0 -d 10.0.0.0/16 -j MASQUERADE

或者

iptables -t nat -A POSTROUTING -s 1.2.3.5 -o ipsec0 -d 10.0.0.0/16 -j SNAT --to-source 1.2.3.4

-s和部分-d是可选的,只是为了细化规则,以便它们中的任何一个仅适用于从 B 到 的流量10.0.0.0/16。(特别是-d,因为您可能只想使用filter表中的规则将转发限制到特定目的地。-s但是 部分可以避免伪装应用于不需要它的源,因此可能更可取。)

SNAT出于性能原因,优先使用MASQUERADEif is static。本质上它们是等价的。1.2.3.5


以上所有内容都假设服务器 A 上已经启用转发,并且没有应用任何过滤规则(更准确地说,允许所有转发流量)。

此外,此设置仅适用于服务器 B 本身。如果您尝试10.0.0.0/16从服务器 B 拥有的 VPN 中的主机等进行访问,则可能需要进一步设置。

相关内容