AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-582826

Janne Paalijarvi's questions

Martin Hope
Janne Paalijarvi
Asked: 2020-07-14 09:34:29 +0800 CST

DHCP & macvlan:只有第一个虚拟接口适用于单播 DHCPREQUEST

  • 0

我想做什么?

我正在尝试通过 DHCP 在单个物理 ISP 上行电缆上获取 3 个公共 IP 地址。

出了什么问题?

续订有点不对劲。从接口来看,virtual0 在尝试通过与 DHCP 服务器的单播连接进行更新时工作得很好。virtual1 和 virtual2 接口因单播而失败。他们进入后备模式以使用广播并成功使用广播,但垃圾日志中充满了不好的东西。我正在运行 Debian 8 和 isc-dhcp-client v. 4.3.1 。

我在启动时设置了这样的接口:

IF_VIRTUAL_BASE=eth0
IF_PUB0=虚拟0
IF_PUB1=虚拟1
IF_PUB2=虚拟2
IF_LAN=eth2

ifconfig "$IF_VIRTUAL_BASE" 向上
ip link add link "$IF_VIRTUAL_BASE" 地址 00:90:0b:ff:10:5b "$IF_PUB0" type macvlan
ip 链接设置“$IF_PUB0”
ip link add link "$IF_VIRTUAL_BASE" 地址 00:90:0b:ff:11:5b "$IF_PUB1" type macvlan
ip 链接设置“$IF_PUB1”
ip link add link "$IF_VIRTUAL_BASE" 地址 00:90:0b:ff:12:5b "$IF_PUB2" type macvlan
ip 链接设置“$IF_PUB2”

# 启用转发
回声 1 > /proc/sys/net/ipv4/ip_forward

unset new_routers在为 virtual1 和 virtual2 完成 dhcprequest 时,我也会这样做。

猜猜看,这种怪物的作品:

7 月 11 日 20:45:43 gw dhclient:虚拟 0 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:43 gw dhclient:virtual1 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:43 gw ifup [582]:虚拟 0 到 255.255.255.255 端口 67 上的 DHCPREQUEST
7 月 11 日 20:45:43 gw ifup [592]:虚拟 1 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:43 gw dhclient:virtual2 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:43 gw ifup [634]:虚拟 2 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:46 gw dhclient:virtual1 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:46 gw ifup [592]:虚拟 1 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:46 gw dhclient:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:46 gw ifup [592]:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:46 gw logger: virtual1 (REBOOT): IP: -> 88.113.75.59; GW:-> 88.113.75.1

7 月 11 日 20:45:47 gw dhclient:virtual0 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:47 gw ifup [582]:虚拟 0 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:47 gw dhclient:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:47 gw ifup [582]:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:47 gw logger: virtual0 (REBOOT): IP: -> 88.113.75.65; GW:-> 88.113.75.1

7 月 11 日 20:45:50 gw dhclient:virtual2 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:50 gw ifup [634]:虚拟 2 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 20:45:50 gw dhclient:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:50 gw ifup[634]:来自 88.113.75.2 的 DHCPACK
7 月 11 日 20:45:50 gw logger: virtual2 (REBOOT): IP: -> 88.113.75.61; GW:-> 88.113.75.1

所以他们工作了,对吧?它们是广播请求。好的,快进一个小时左右,我们得到了这样的战利品:

7 月 11 日 21:45:09 gw dhclient:virtual2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:11 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:22 gw dhclient:虚拟 2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:25 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:32 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:43 gw dhclient:虚拟 2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:46 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:45:56 gw dhclient:virtual2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:05 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:11 gw dhclient:虚拟 2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:21 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:30 gw dhclient:虚拟 2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:33 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:42 gw dhclient:virtual2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:46:47 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:47:00 gw dhclient:virtual2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:47:01 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 21:47:09 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67

virtual1 和 virtual2 接口拼命尝试通过单播连接到以前的 DHCP 服务器 195.74.6.55 来更新它们的 IP。他们失败了单播。但是接下来发生了一些有趣的事情,最后他们切换到广播作为后备并成功了!

7 月 11 日 22:30:41 gw dhclient:virtual1 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 22:30:47 gw dhclient:virtual2 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 22:30:52 gw dhclient:virtual1 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 22:30:52 gw dhclient:来自 88.113.75.2 的 DHCPACK
7 月 11 日 22:30:52 gw logger: virtual1 (RENEW): IP: 88.113.75.59 -> 88.113.75.59; GW: 88.113.75.1 -> 88.113.75.1

7 月 11 日 22:30:58 gw dhclient:虚拟 2 上的 DHCPREQUEST 到 255.255.255.255 端口 67
7 月 11 日 22:30:58 gw dhclient:来自 88.113.75.2 的 DHCPACK
7 月 11 日 22:30:59 gw logger: virtual2 (RENEW): IP: 88.113.75.61 -> 88.113.75.61; GW: 88.113.75.1 -> 88.113.75.1

观察 virtual0 接口:

7 月 11 日 22:38:17 gw dhclient:虚拟 0 上的 DHCPREQUEST 到 195.74.6.55 端口 67
7 月 11 日 22:38:18 gw dhclient:来自 195.74.6.55 的 DHCPACK
7 月 11 日 22:38:18 gw logger: virtual0 (RENEW): IP: 88.113.75.65 -> 88.113.75.65; GW: 88.113.75.1 -> 88.113.75.1

结论是,对于 virtual0 接口,单播 (dhclient) DHCP 请求有效,而对于 virtual1 和 virtual2,仅广播 DHCP 更新有效。所以,一定是路由问题吧?以下是典型启动后 ip route 显示的内容:

root@gw:~# ip 路由
默认通过 88.113.75.1 dev virtual0
88.113.75.0/24 dev virtual0 proto 内核范围链接 src 88.113.75.65
88.113.75.0/24 dev virtual1 proto 内核范围链接 src 88.113.75.59
88.113.75.0/24 dev virtual2 proto 内核范围链接 src 88.113.75.61
172.16.8.0/28 via 172.16.8.2 dev tun0 # 对于 openvpn
172.16.8.0/24 dev eth2 proto kernel scope link src 172.16.8.254 # For LAN
172.16.8.2 dev tun0 proto kernel scope link src 172.16.8.1 #For openvpn

如何使基于 macvlan 的接口 virtual1 和 virtual2 上的 dhclients 正确路由其单播续订请求并正确接收响应?

我已经完成了大量的谷歌搜索,试图触发许多设置,包括防火墙策略、基于策略的路由、eth0 promisc 模式和 sysctl 变量、剥离通用网络设置等。我目前正在 dhclient 上进行 strace。这些设置的一种组合必须有效。如果需要更多信息,我很乐意提供。

EDIT1:dhclient strace 已准备就绪。

这发生在一开始:

绑定(5, {sa_family=AF_PACKET, proto=0x7669, if1635087474, pkttype=PACKET_HOST, addr(0)={12652, }, 16) = 0
绑定(6, {sa_family=AF_INET, sin_port=htons(68), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
sendto(5, "......", 342, 0, {sa_family=AF_PACKET, proto=0x7669, if1635087474, pkttype=PACKET_HOST, addr(0)={12652, }, 18) = 342

据我了解,“sendto(5”) 是第一个成功的基于广播的 dhclient 发送。

然后,稍后第一个失败的单播发送:

sendto(6, "......", 300, 0, {sa_family=AF_INET, sin_port=htons(67), sin_addr=inet_addr("195.74.6.55")}, 16) = 300

并且下一个成功的广播发送:

sendto(5, "......", 342, 0, {sa_family=AF_PACKET, proto=0x7669, if1635087474, pkttype=PACKET_HOST, addr(0)={12652, }, 18) = 342
dhcp ips unicast
  • 1 个回答
  • 524 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve