V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yyy134341
V2EX  ›  宽带症候群

有没有 PPPoE 代拨转为 DHCP 下发 IP 的方法?

  •  
  •   yyy134341 · 3 天前 · 2305 次点击

    如果一个 ISP 提供多个动态 IP ,但需要 PPPoE 认证取得 现在有一台路由器,接入到了 ISP 的末端设备。

    • 按照一般家庭正常的配置来讲,应该是路由器进行 PPPoE 拨号,路由器拿到公网 IP ,这个作为出口的 SourceIP ;与此同时路由器开启 DHCP 并设置地址池为 192/10 之类的私有 IP 并下发给下级设备,下级设备拿到的是私有 IP ,访问互联网的时候通过路由器 NAT 进行路由。

    但我想实现的是:

    • 下级设备没有 PPPoE 条件,每当下级设备接入路由时,需要路由器进行 PPPoE 代拨,但是拨回来的 IP 通过 DHCP 方式直接下发给该下级设备,设备拿到的 IP 为公网 IP ,无需经过路由器 NAT 。

    一句话总结相当于是当 ISP 仅提供 PPPoE ,实现通过某种方式使路由器其下设备无感获取来自 ISP 的动态 IP

    目前经过搜寻只得到 ikuai 有所谓“PPPoE 代拨”的功能,但是已经实操过,发现旗下的设备拿到的也是在 ikuai 上面设定 PPPoE Server 时设定好的地址池里面的地址,并不是实际 ISP 分配的动态公网地址,该方案失败 https://www.ikuai8.com/support/ymgn/lyym/rzjf/2023-02-17-01-14-57.html

    想问问大家有没有可以实现的方法?

    40 条回复    2025-09-09 02:28:44 +08:00
    arrow629
        1
    arrow629  
       3 天前
    能接受像阿里云 ECS 那样的 1:1 NAT 吗,因为目前 IP 地址肯定是分配到 PPPoE 的 Endpoint 也就是你路由器上的,如果要修改就要自己改代码重新编译,目前我是想在路由器上同时建立多个 PPPoE Session ,拿到多个公网 ip ,内网设备分配固定的内网 IP ,在 NAT Rule 上做动态的 1:1NAT 。目前我是看到 OpenWRT 上有这个方案 https://chehtan.dev/97-openwrt-11-nat-with-a-public-ip-address-pool/ 你可以考虑一下行不行。
    yyy134341
        2
    yyy134341  
    OP
       3 天前
    @arrow629
    那好像就跟 ikuai 的方案其实是一样的?
    主楼中给出的 ikuai 链接提到
    “以上账号校验成功后,将地址进行用户内网 IP 和代拨成功的 IP 数据进行一对一 NAT 转换,实现内网用户代拨上网的功能。”
    也就是说客户端的私有 IP 和所代拨回来的公有 IP 是绑定的,相当于 DMZ 过去而已

    但还是无法解决客户端拿到的 IP 是私有的问题

    不过谢谢提供思路:)
    arrow629
        3
    arrow629  
       3 天前
    @yyy134341 能说下你在什么场景下需要将公网 IP 直接分配到内网设备吗?一般 1:1NAT 的使用体验和公网 IP 是差不多的,如果你是要在设备上获取这个 NAT 后的 IP 所对应的公网 IP 的话,在公网搭建一个 api 返回公网 IP 就行了
    tavimori
        4
    tavimori  
       3 天前   ❤️ 1
    如果是 Linux 路由器的话,应该可以用某种方式 hook dhcp server 的请求,然后用脚本触发一个 PPPoE 连接,并依据连接的信息分配 IP 地址。但是如果要让 IP 地址和 PPPoE 一样的话,那么通常路由器也需要有一个同网段的 IP 地址作为告知用户的网关地址。
    听起来技巧主要是找一个合适的 DHCP 服务器软件,可以 hook 出地址池分配的逻辑就行。或许也可以借用一些 RADIUS 认证的机制。
    另外就是要注意一下生命周期,比如可以在租约有效期限内维持 PPPoE ,租约到期以后断开,这样的话或许也要 hook 到 DHCP 租约到期的逻辑。
    ttvast
        5
    ttvast  
       3 天前   ❤️ 1
    你的需求违反了 ip 协议最基本的逻辑.
    比如 pppoe 的这台机器获得的 ip,和你 dhcp 机器获得的 ip 是完全一样的,这就不是 ip 协议的初衷.
    只有 hack 得很深的方案,才有可能实现你的需求,而且还需要打磨很久才可能稳定.
    Ipsum
        6
    Ipsum  
       3 天前 via Android
    有个加钱上专线的固定 ip 的方案,看你要不要😁
    xqzr
        7
    xqzr  
       3 天前
    DHCP 服务器,似乎无法主动更换,客户端的 IP
    jayhuang0044
        8
    jayhuang0044  
       3 天前
    光猫 路由器 设备
    设备想跳过 光猫 路由器 获得公网 IP?

    IPv6?
    jayhuang0044
        9
    jayhuang0044  
       3 天前
    或者你是想实现, 动态代理 IP 多功能?
    fuzzsh
        10
    fuzzsh  
       3 天前 via Android   ❤️ 1
    理论上可以,重写 bridge/dial-in/dhcp ,两个网口加到 bridge ,client 先拿取 pc mac 后在 dial-in 即停止,将信息转交 dhcp
    xjzshttps
        11
    xjzshttps  
       2 天前   ❤️ 1
    理论手写 bpf+xdp ,
    拦截修改包应该能做到你要的效果。
    busier
        12
    busier  
       2 天前 via Android   ❤️ 2
    OP 需求其实是 BGP 和 AS 自治域

    在 PPPoE 这个二层协议上纠结个毛线
    life90
        13
    life90  
       2 天前 via iPhone
    楼主应该只是想解决一个下发地址认证的问题。但是其实有很多方法实现。不用纠结在 pppoe 拨号认证这个方式。802.1 认证,Mac 地址认证,或者自己编写特殊的认证方式配合 dhcp 也是可行的。
    life90
        14
    life90  
       2 天前 via iPhone
    但是你后面说的接收来自 ISP 的 dhcp 那肯定是不行的。你要控制,就只能自建 dhcp 服务。
    unused
        15
    unused  
       2 天前 via Android   ❤️ 1
    预拨号,hook 脚本把地址、dhcp 地址池、路由配好就行了。
    按需拨号比较麻烦,dhcp 需要支持外接 IPAM ,或者绕道 radius 。
    yyy134341
        16
    yyy134341  
    OP
       2 天前
    @jayhuang0044 #8
    v6 是路由器拿到 DHCP-PD 通过 DHCP 下发给子设备的,这个路由器普遍都有这个功能
    但是 v4 地址运营商只提供了 PPPoE 的方式,拨一个号就给一个,可以多拨多拿,但是是动态的,所以才会有这样的问题,想找个方法让子设备拿公网 IP
    yyy134341
        17
    yyy134341  
    OP
       2 天前
    @life90 #13
    PPPoE 是运营商提供的方法,不是我部署的服务。就跟普通家宽一样,拨一个号能拿到一个 public IP ,多拨多拿,这样就能形成一个公网地址池,有没有方法将这些公网 IP 以 DHCP 分配给下面设备而已
    life90
        18
    life90  
       2 天前 via iPhone
    @yyy134341 dhcp 不是你控制的不太可能通过你的 pppoe 去分配,除非你另建地址池。到是地址池可以跟运营商一致。前提你知道他的地址池信息。
    jayhuang0044
        19
    jayhuang0044  
       2 天前
    @yyy134341 #17
    不说分配线路的问题?
    应该有多个 PPPoE 了吧
    PPPoE A - A 设备
    PPPoE B - B 设备
    ............................

    想分配 和固定进出口?
    yyy134341
        20
    yyy134341  
    OP
       2 天前
    @jayhuang0044 #19
    对 可以理解是有多个 pppoe client ,但主要需求是子设备拿公网 IP
    yyy134341
        21
    yyy134341  
    OP
       2 天前
    @life90 #18 DHCP 就是自己建的,不是运营商提供的,只不过传统普通家宽情况下的路由器的 DHCP 地址池是私有地址 eg. 192.168.1.0/24 之类的,现在的情况是需要将从运营商里面拿到的多个公网 IP (随机的、分开的、不连续的、零散的、不一定在同一个网段的)当作地址池然后用自建的 DHCP 服务分发给设备
    wolonggl
        22
    wolonggl  
       2 天前
    dhcp 需要指定网段和网关,dhcp 好像无法支持类似 ppp 点对对链接,就无法实现将强制分配给 DHCP 的公网 ip 通过点对点映射到公网 ppp 接口上;
    wolonggl
        23
    wolonggl  
       2 天前
    @yyy134341 子网设备拿到内网 IP 后,一对一映射后,也可以通过公网 api 接口获取分配它的公网 IP 地址;
    yyy134341
        24
    yyy134341  
    OP
       2 天前 via iPhone
    @wolonggl #22 PPPOE 拿到的公网地址也是有网关和子网掩码的
    life90
        25
    life90  
       2 天前 via iPhone
    @yyy134341 这个功能除了自己写。我估计没人会有这种需求。想想实现还挺麻烦的。除非特别需要。我建议你放弃这种方案。
    不过我想你应该不会放弃。我猜你是要拿他盈利。doge
    luozhsky
        26
    luozhsky  
       2 天前 via Android
    光猫出来的线接路由器 lan 口。你设备也接 lan 口。用设备直接 pppoe 拨号。
    ysc3839
        27
    ysc3839  
       2 天前 via Android   ❤️ 1
    @tavimori 不需要 Hook ,开源的 DHCP 服务器项目 Kea 就有插件机制,写个插件就完事了。
    cnyang
        28
    cnyang  
       2 天前   ❤️ 1
    协议完全不一样,拨号成功后的上下行包都会多个 PPPOE 包头,怎么搞都需要中转一下,中间人改包导致的性能下降和 nat1 差不了多少,如果只是为了公网 ip 好看,不如多搞一层 nat ,即 NAT4444
    William2024
        29
    William2024  
       2 天前 via Android
    你直接用这台机器拨号,再把这台机器做软路由。
    vmebeh
        30
    vmebeh  
       2 天前
    能多拨的话简单的可以:
    1. 路由器支持多拨,新拨到的 IP 单独转发给这个设备用
    2. 路由器 wan 口前面加个交换机,下级设备插根网线连过去就可以 PPPoE 拨号了,路由器上设置软交换机也是一样


    路由器下游设备既有公网 ipv4 还能访问内网是安全短板,完全绕过了路由器防火墙
    2397613259qqq
        31
    2397613259qqq  
       2 天前
    最简单的,在主路由开 pppoe relay
    NSAgold
        32
    NSAgold  
       2 天前 via Android
    所以子设备为什么需要拿到公网 ip 这才是问题的关键
    直接在路由器端口转发得了呗
    不然就路由器开 pppoe relay 然后子设备拨号拿 ip
    busang
        33
    busang  
       2 天前
    直接多拨负载均衡有没实现你需求的地方吗?
    383394544
        34
    383394544  
       2 天前
    这不就是 pppoe relay 吗
    piero66
        35
    piero66  
       1 天前
    划一个 vlan
    djw123
        36
    djw123  
       1 天前
    其实你需要的是 IPOE
    bao3
        37
    bao3  
       1 天前
    你只能 ppoe relay ,由子设备自己拨号取得 ppoe 指定的 IP 。
你做不到让路由获取 ppoe 的指定 IP 后再分发给其他设备,就算你答应,其他设备也不答应,别说高级协议有问题,就是连低层有 ARP 都会疯了。
    qwvy2g
        38
    qwvy2g  
       1 天前 via Android
    估计是想一个硬路由 pppoe 拨号,后面的服务由另一个路由负责。这种跨设备组合不是很常见。理论上需要配置 PPP 接口和另一个设备有线端口桥接。CPE 穿透模式里面见过这种类似拨号方式,不清楚 pppoe 拨前是否应用这种。
    qwvy2g
        39
    qwvy2g  
       1 天前 via Android
    查了一下好像不行,pppoe 拨号前没有接口不存在。不能像传统接口那样直接与一个物理端口划分。
    lin559671
        40
    lin559671  
       8 小时 14 分钟前 via iPhone
    好久以前就有这种了,2000 年 adsl 年代有一种外置 adsl 猫,可以内部 pppoe 拨号后,ether 口 dhcp 下发是是公网 IP 。掩码是 4 个 255 ,居然能通信,到现在都没想通原理
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:43 · PVG 10:43 · LAX 19:43 · JFK 22:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.