实现 PPPoE 半桥/ip-passthrough 以适应带有 Linux 的 IPSec VPN 防火墙设备

MeM*_*lfI 6 linux pppoe

(我正在编辑我自己的问题,并为发现自己处于类似位置的其他人发布答案。)

我想要一个需要在其外部接口上使用公共静态 IP 的防火墙设备,以便与 ISP 批准的 ADSL 调制解调器一起使用。(不推荐这种设置,因为 ADSL 服务和调制解调器是消费级的,但我们需要省钱。)

调制解调器可以充当路由器,这意味着它将对所有流量进行 NAT,并在其外部接口上使用服务的 1 个公共静态 IP。我们不能在此 NAT 后面使用公共子网,因为此 ADSL 服务不支持此功能。

另一种选择是该调制解调器可以充当全桥,但防火墙设备不能终止 PPP 链接。

我可以购买一个调制解调器(DrayTek Vigor 120),它具有半桥模式(DrayTek 称之为“True-DMZ”),其中调制解调器后面的一台设备被分配了 ADSL 链路的一个公共静态 IP 地址。这奏效了,但不幸的是,我们遇到了与 ADSL 线路无关的问题,并且在使用此调制解调器时无法从我们的 ISP 获得任何支持。

如何配置 Linux PC 以使其在半桥模式下终止 PPP 链路?

MeM*_*lfI 4

我在一台带有三个网卡的 PC 上使用 Debian(1 个用于管理,1 个用于连接调制解调器,1 个用于连接防火墙)。我最终得到了 eth0=管理、eth1=调制解调器、eth2=防火墙、ppp0=ADSL 服务,瞧。

  1. 使用 ppp 准备 PC(如果需要,还可以使用 pppoeconf)[注意:完成所有设置后,此 PC 将失去与互联网的连接]
  2. 将调制解调器设置为全桥模式
  3. 配置ppp并连接、测试连接等
  4. 在 /etc/network/interfaces 中将eth1 和 eth2 配置为“auto eth x ”和“iface eth x ”
  5. 将以下内容添加到 /etc/ppp/ip-up (就在“run-parts”行之前):

    ifconfig ppp0一个您永远不会使用的子网中的 IP /该子网的 CIDR

    ifconfig eth2 up

    ifconfig eth2你的公共IP /你的公共子网

    ip 路由删除默认值

    ip 路由添加默认 dev ppp0

    ip 路由刷新缓存

您最终应该得到如下所示的路由表:

  • 0.0.0.0/0 ppp0
  • 您的公共 IP 的网络/您的公共 IP 的子网eth2
  • 您不关心的网络/子网ppp0

其工作方式:

  • eth1 不需要 IP 地址,因为 PPPoE 是帧协议
  • eth2 获取与您的公共 IP 在同一子网中的另一个 IP
  • ppp0 获得一个您不关心的 IP(但不会与您关心的任何内容发生冲突)
  • 当数据包从 ADSL 到达时,其源将是其他公共 IP,其目的地将是您的公共 IP:它将从 eth2 出口(由于路由 #2)
  • 当数据包从防火墙到达时,其源将是您的公共 IP,其目的地将是其他公共 IP:它将出口 ppp0(由于默认路由)

例子:

假设您的公共 IP 是 1.1.1.100/24,您的网关是 1.1.1.1(我们的 ISP 为我们分配了这样的内容;据我了解,您通常会在没有网关的情况下获得 1.1.1.100/32)。还可以说 172.16.1.0/24 是一个您永远不会在任何地方使用的网络。所以:

ifconfig ppp0 172.16.1.1/24

ifconfig eth2 up

ifconfig eth2 1.1.1.101/24

ip route delete default

ip route add default dev ppp0

ip route flush cache
Run Code Online (Sandbox Code Playgroud)

您的路线表:

  • 0.0.0.0/0 ppp0
  • 1.1.1.0/24 eth2
  • 172.16.1.0/24 ppp0

请注意,您分配的是 eth2 1.1.1.101 而不是 1.1.1.100。Eth2 需要与您的公共 IP 位于同一子网,但不是公共 IP 本身。

警告:

您需要使用 ISP 使用的真实子网(例如 1.1.1.0/24)或创建一个假装子网(并使用 /30 使其尽可能小)。您将无法访问互联网上此子网中的其他 IP(通常是 ISP 的其他客户)。