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

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

  •  
  •   yyy134341 · 1 天前 · 1880 次点击

    如果一个 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

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

    35 条回复    2025-09-07 15:07:12 +08:00
    arrow629
        1
    arrow629  
       1 天前
    能接受像阿里云 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
       1 天前
    @arrow629
    那好像就跟 ikuai 的方案其实是一样的?
    主楼中给出的 ikuai 链接提到
    “以上账号校验成功后,将地址进行用户内网 IP 和代拨成功的 IP 数据进行一对一 NAT 转换,实现内网用户代拨上网的功能。”
    也就是说客户端的私有 IP 和所代拨回来的公有 IP 是绑定的,相当于 DMZ 过去而已

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

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

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

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

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


    路由器下游设备既有公网 ipv4 还能访问内网是安全短板,完全绕过了路由器防火墙
    2397613259qqq
        31
    2397613259qqq  
       19 小时 49 分钟前
    最简单的,在主路由开 pppoe relay
    NSAgold
        32
    NSAgold  
       19 小时 38 分钟前 via Android
    所以子设备为什么需要拿到公网 ip 这才是问题的关键
    直接在路由器端口转发得了呗
    不然就路由器开 pppoe relay 然后子设备拨号拿 ip
    busang
        33
    busang  
       13 小时 37 分钟前
    直接多拨负载均衡有没实现你需求的地方吗?
    383394544
        34
    383394544  
       11 小时 39 分钟前
    这不就是 pppoe relay 吗
    piero66
        35
    piero66  
       4 小时 30 分钟前
    划一个 vlan
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2562 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:37 · PVG 19:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.