Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通过命令获取IP参考 #531

Open
jeessy2 opened this issue Feb 7, 2023 · 85 comments
Open

通过命令获取IP参考 #531

jeessy2 opened this issue Feb 7, 2023 · 85 comments
Labels
documentation Improvements or additions to documentation keep

Comments

@jeessy2
Copy link
Owner

jeessy2 commented Feb 7, 2023

通过命令获取IP,可分享出自己的脚本,方便大家crtl+c crtl+v

@jeessy2
Copy link
Owner Author

jeessy2 commented Feb 7, 2023

  • 在Linux系统中获取网卡eth1的IPv6地址
    ip -6 addr show eth1
  • 在Linux系统中获取网卡eth1的IPv4地址
    ip -4 addr show eth1

@Camusama
Copy link

Camusama commented Feb 7, 2023

  • Linux get IPv6 prefix (移动开头2409)
    ip -6 route | awk '{print $1}' | awk '/2409:?/' | awk -F::/ '{print $1 "any other suffix of other mac"}'

@jeessy2 jeessy2 pinned this issue Feb 7, 2023
@jeessy2 jeessy2 added documentation Improvements or additions to documentation keep labels Feb 7, 2023
@solosing
Copy link

请问有办法通过命令获取同局域网其他设备Ipv6吗?

@jeessy2
Copy link
Owner Author

jeessy2 commented Feb 20, 2023

请问有办法通过命令获取同局域网其他设备Ipv6吗?

Linux get IPv6 prefix (移动开头2409)
ip -6 route | awk '{print $1}' | awk '/2409:?/' | awk -F::/ '{print $1 "any other suffix of other mac"}'
把any other suffix of other mac改成其它设备的IPv6(EUI-64)后缀

@qsrenl
Copy link

qsrenl commented Feb 26, 2023

Windows PowerShell获取ip

参阅微软文档根据网络环境自定义一些参数进行筛选

自用获取公网ipv6
Get-NetIPAddress -AddressFamily IPv6 -AddressState Preferred -SuffixOrigin Link -Type Unicast -PrefixOrigin RouterAdvertisement

@flyegg
Copy link

flyegg commented Mar 3, 2023

@jeessy2 目前匹配正则表达式只能按照顺序选择,大部分时候没问题,但偶尔会遇到一个问题。我这边网卡的IPV6地址,总是有2个地址,一个长一点的,一个短一点的。我发现只有长的才能用外网访问,短的没法访问。但是长的在前还是短的在前有些随机性。

比如这种:
eth0(2409:8a60:1111:2222:20c:29ff:feea:b763, 2409:8a60:1111:2222::3b3),有时候又会变成
eth0(2409:8a60:1111:2222::3b3, 2409:8a60:1111:2222:20c:29ff:feea:b763)

请问能不能设个选项,固定选择长一点的那个,这样就不用选具体1或者2了,谢谢

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 3, 2023

@jeessy2 目前匹配正则表达式只能按照顺序选择,大部分时候没问题,但偶尔会遇到一个问题。我这边网卡的IPV6地址,总是有2个地址,一个长一点的,一个短一点的。我发现只有长的才能用外网访问,短的没法访问。但是长的在前还是短的在前有些随机性。

比如这种: eth0(2409:8a60:1111:2222:20c:29ff:feea:b763, 2409:8a60:1111:2222::3b3),有时候又会变成 eth0(2409:8a60:1111:2222::3b3, 2409:8a60:1111:2222:20c:29ff:feea:b763)

请问能不能设个选项,固定选择长一点的那个,这样就不用选具体1或者2了,谢谢

ff:fe是长的那个?如果是直接正则表式中输入ff:fe

@flyegg
Copy link

flyegg commented Mar 3, 2023

ff:fe

请问不需要输入@之类的符号吗?直接在匹配正则表达式栏里面填写ff:fe就可以了吗?

@WaterLemons2k
Copy link
Contributor

请问不需要输入@之类的符号吗?直接在匹配正则表达式栏里面填写ff:fe就可以了吗?

应该可以

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 3, 2023

不加。@是指定第几个,你这个是匹配字符串正则

@flyegg
Copy link

flyegg commented Mar 3, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。

同谢 @WaterLemons2k

@WaterLemons2k
Copy link
Contributor

WaterLemons2k commented Mar 3, 2023

Linux 仅获取纯公网 IPv6 地址

  • ip

    ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'
  • ifconfig

    ifconfig | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'

    参考:https://superuser.com/a/1057290

  • dynv6

    ip -6 addr list scope global | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p

@rehack
Copy link

rehack commented Mar 10, 2023

MacOS下没有ip命令,可以使用ifconfig
ifconfig en0 | grep inet ipv4&ipv6
ifconfig en0 | grep inet6 ipv6
ipconfig getv6packet en0

或者安装iproute2mac工具,就可以使用ip命令了

@babyvox550
Copy link

babyvox550 commented Mar 17, 2023

ip -6 addr show dev eth0 | sed -n 's|^.inet6 ([^ ]/64).*$|\1|p' 选定/64ipv6

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /ca1a/ {print $3}' 选中尾号CA1A的ip

@kffnqtd
Copy link

kffnqtd commented May 8, 2023

根据网卡地址查询
ip -6 n | grep ^2.*00:11:22:33:44:55 | tail -n 1 | awk '{print $1}'

1 similar comment
@kffnqtd
Copy link

kffnqtd commented May 8, 2023

根据网卡地址查询
ip -6 n | grep ^2.*00:11:22:33:44:55 | tail -n 1 | awk '{print $1}'

@wcn666
Copy link

wcn666 commented May 18, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。

同谢 @WaterLemons2k

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

@WaterLemons2k
Copy link
Contributor

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

@wcn666
Copy link

wcn666 commented May 18, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。
同谢 @WaterLemons2k

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

前四组2409:8a60:1111:2222这几位长得v6和短的v6地址都是一样的无法区分,后面的地址我看了一下记录。每次都不一样,不像上面的朋友有一个ff:fe是一直不变的,我就没办法用这个方法进行筛选。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

好的,我去试一下看看能否生效。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

您好,我的版本不支持命令获取,我是centos7.9,升级镜像的命令是什么呀,没看到有

@WaterLemons2k
Copy link
Contributor

您好,我的版本不支持命令获取,我是centos7.9,升级镜像的命令是什么呀,没看到有

Releases 下载并解压 ddns-go 就可以了。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

好的,我去试一下看看能否生效。
最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

@WaterLemons2k
Copy link
Contributor

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

@wcn666
Copy link

wcn666 commented May 18, 2023

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

十分感谢,已经成功输出最长的ip地址。

@wcn666
Copy link

wcn666 commented May 18, 2023

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

您好,我又遇到一个问题 在我的群晖上输出的最长地址为fd7a开头的非公网v6地址,如何可以限制为240开通的最长地址啊

@WaterLemons2k
Copy link
Contributor

WaterLemons2k commented May 18, 2023

您好,我又遇到一个问题 在我的群晖上输出的最长地址为fd7a开头的非公网v6地址,如何可以限制为240开通的最长地址啊

先看一下 Linux 仅获取纯公网 IPv6 地址 输出的是什么:

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'

@asd2317419
Copy link

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

感谢回答
接口获取只能获取到eth0网口的公网地址 无法获取到eth1网口的公网地址 可否指定获取eth1的

@asd2317419
Copy link

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

配置文件有更改选择网口eth0还是eth1 但是是不起作用的

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 15, 2024

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

配置文件有更改选择网口eth0还是eth1 但是是不起作用的

建议补一下网络知识

@qingchuwudi
Copy link

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

@Se7enMuting
Copy link

Se7enMuting commented Mar 26, 2024

能不能在 ipv6 的通过网卡获取这里加点功能啊,利用@1指定第一个IPv6地址的这种内部变量,再加个例如@1:前64位 这种内部变量,来实现如下拼接:
@1:前64位"::abab:0001"
这样就不用费劲的去写通过命令获取了,你这里有现成的@1,@2,@3可以用多方便啊
或者把@1:前64位这种内部变量加到通过命令获取中,或者单独再开个通过网卡拼接 ipv6,反正就是利用现成的@1,@2

@HowieHz
Copy link

HowieHz commented Mar 29, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关
你猜为什么我要用命令获取

@HowieHz
Copy link

HowieHz commented Mar 29, 2024

能不能在 ipv6 的通过网卡获取这里加点功能啊,利用@1指定第一个IPv6地址的这种内部变量,再加个例如@1:前64位 这种内部变量,来实现如下拼接: @1:前64位"::abab:0001" 这样就不用费劲的去写通过命令获取了,你这里有现成的@1,@2,@3可以用多方便啊 或者把@1:前64位这种内部变量加到通过命令获取中,或者单独再开个通过网卡拼接 ipv6,反正就是利用现成的@1,@2

你开个issue吧

@qingchuwudi
Copy link

qingchuwudi commented Apr 2, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关 你猜为什么我要用命令获取

  1. IPv6 还有不准确的说法?
  2. 不在于网站是否稳定,重点在于这是一种获取IPv6的方式,而且用这种方式获取到的IP能保证网络可达。

    如你所说这种方式不可靠的话,现有的 ipv6 test 服务也都不可靠。

  3. Linux/Unix 体系下,用 cat /proc/net/if_inet6 | grep eth1 更直接
  4. 这是在讨论问题,为什么要让别人猜?

@HowieHz
Copy link

HowieHz commented Apr 2, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关 你猜为什么我要用命令获取

  1. IPv6 还有不准确的说法?
  2. 不在于网站是否稳定,重点在于这是一种获取IPv6的方式,而且用这种方式获取到的IP能保证网络可达。

    如你所说这种方式不可靠的话,现有的 ipv6 test 服务也都不可靠。

  3. Linux/Unix 体系下,用 cat /proc/net/if_inet6 | grep eth1 更直接
  4. 这是在讨论问题,为什么要让别人猜?

TLDR, 网站获取到的是临时ipv6地址,然而只出不进,导致IPV6业务不通

@caliban511
Copy link

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

@xfl12345
Copy link

xfl12345 commented Apr 6, 2024

按照 IPv6 的约定,对外暴露 IP地址 应当始终为 动态临时的IPv6地址
为了不受 网卡绑定 的约束,编写的命令都是可以动态获取已投入使用的 IP地址 。
以下命令均在 SLACC Only 的网络环境下工作良好。

Windows Powershell 代码

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress

Linux bash 代码

因为 Linux 执行 ip -6 addr 会看到错行的 valid_lft 582sec preferred_lft 582sec ,导致需要额外的工作选取合适的没过期的 IPv6 地址,所以我使用了简单粗暴的 ip route 命令。
(以下代码不确定也不保证 ash 可用)

ip route get 240c::6666 | grep -oE 'src.*$' | awk {'print $2'}

@qiuyesf
Copy link

qiuyesf commented Apr 7, 2024

通过软路由openwrt上安装DDns-go,来获取局域网中一台esxi主机的IPv6地址,我想的是通过mac地址来确定当前esxi的IPv6地址,输入ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 后,也拿到了正确的ipv6地址,但是多了个"\n"。
输出日志如下
2024/04/07 16:11:03 获取IPv6结果失败! 命令: /bin/bash -c ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1, 标准输出: "2408:822a:90:1f541C:83:41:41:A0:BA\n"
2024/04/07 16:11:03 未能获取IPv6地址, 将不会更新

请问怎么能把\n 删掉呢?

@WaterLemons2k
Copy link
Contributor

通过软路由openwrt上安装DDns-go,来获取局域网中一台esxi主机的IPv6地址,我想的是通过mac地址来确定当前esxi的IPv6地址,输入ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 后,也拿到了正确的ipv6地址,但是多了个"\n"。 输出日志如下 2024/04/07 16:11:03 获取IPv6结果失败! 命令: /bin/bash -c ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1, 标准输出: "2408:822a:90:1f541C:83:41:41:A0:BA\n" 2024/04/07 16:11:03 未能获取IPv6地址, 将不会更新

请问怎么能把\n 删掉呢?

在结尾添加 tr -d '\n'

ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 | tr -d '\n'

参考:https://stackoverflow.com/questions/12524308/bash-strip-trailing-linebreak-from-output

@Clown8888
Copy link

nic="$(ip 路由 | sed -En 's/. (rmnet_data[1-4])./ \1/p')" && ifconfig "$nic" | sed -En 's/. (240[89e][^\/]+)/。 /\1/p'

这个方法用在安卓手机上,比如手机在开启代理时,代理了IPv6流量,同时使用了随机虚拟网卡,导致通过接口获取的不是真实IP,而是代理IP,所以先通过ip route过滤路由,找到本机默认的网卡,再去打印匹配到真实的IPv6地址

@418667527
Copy link

418667527 commented Apr 22, 2024

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的:
可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3]  + "XXXX:XXXX:XXXX:XXXX" -join ':'}

@xfl12345
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3]  + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

@418667527
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

@xfl12345
Copy link

xfl12345 commented Apr 23, 2024

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

动态PD前缀不适合开启 DHCPv6 的 statefull ,最好 stateless 。有些地区的运营商仍会为旧的PD前缀提供路由,所以我的话也不能说得太满。你这种情况只能是 stateless 。方便的话,加我 tg: xfl12345 ,为你提供远程支持。

更多参考: https://www.v2ex.com/t/829436

@418667527
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

动态PD前缀不适合开启 DHCPv6 的 statefull ,最好 stateless 。有些地区的运营商仍会为旧的PD前缀提供路由,所以我的话也不能说得太满。你这种情况只能是 stateless 。方便的话,加我 tg: xfl12345 ,为你提供远程支持。

更多参考: https://www.v2ex.com/t/829436

可能是我表述的不清楚。路由器重新拨号,但是设备网卡没有重启,所以存在多个前缀不同的v6地址。我用这段命令可以正确获取最新v6前缀并使用。 感谢你的回复。

我还有另一个问题:我通过win上的ddns-go给我的小米10进行ddns。目前发现小米虽然会组成固定的后缀 ,但是并不是通过mac地址来生成。(路由器重新拨号的话不影响这个后缀)。如果重启手机的话会有一段新的后缀,我已经设置了使用真实mac来链接wifi。

@ATFieldBeast
Copy link

ATFieldBeast commented May 9, 2024

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

我的主路由是华硕的,自带ddns,我的问题是这个自带的ddns会同时解析非公网的ipv4和公网的ipv6,但是使用wireguard的时候客户端用域名的话总是会解析成ipv4导致连接不上,所以用ddnsgo,dig华硕给的那个域名来获取主路由的ipv6地址
dig +short aaaa *******.asuscomm.com
再解析到我自己的域名,只有一条aaaa,这样就可以在客户端里ddns我的域名建立连接了

不知道对你有没有用

我也想直接用ip neigh来着,毕竟少一个故障点,但是好像看不到主路由的公网ipv6地址,只有个ipv4的网关地址和内网ipv6地址(而且主路由自己得到的ipv6前缀好像和分配下去的前缀并不一样,不懂能不能这样搞

@ATFieldBeast
Copy link

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

#1107 更新了一下,应该能ssh到主路由的都能这样干了

@lurenJBD
Copy link

lurenJBD commented May 25, 2024

Linux脚本,可以通过输入 mac 地址获取 对应的EUI-64格式 的IPv6 地址

#!/bin/bash

# 检查是否提供了MAC地址
if [ -z "$1" ]; then
    echo "通过MAC地址获取其他设备的IPv6地址"
    echo "使用方法: $0 <MAC地址>"
    exit 1
fi

mac=$1

# 验证MAC地址格式
if ! [[ $mac =~ ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$ ]]; then
    echo "无效的MAC地址格式。请使用格式: XX:XX:XX:XX:XX:XX"
    exit 1
fi

# 提取以240开头并以/任意两位数字结尾的IPv6前缀
ipv6_prefix=$(ip -6 route | awk '{print $1}' | awk -F'/' '/^240.*\/[0-9][0-9]$/{print $1}' | head -n 1)

# 检查是否找到IPv6前缀
if [ -z "$ipv6_prefix" ]; then
    echo "没有找到以240开头并以/任意两位数字结尾的IPv6前缀"
    exit 1
fi

# 确保ipv6_prefix以冒号结尾
ipv6_prefix="${ipv6_prefix%::*}:"

# 将MAC地址分割为数组
IFS=':' read -r -a mac_array <<< "$mac"

# 转换为EUI-64格式
# 将第7位的二进制数反转 (翻转第7位)
mac_array[0]=$(printf "%02x" $(( 0x${mac_array[0]} ^ 0x02 )))

# 构建EUI-64标识符
eui64="${mac_array[0]}${mac_array[1]}:${mac_array[2]}ff:fe${mac_array[3]}:${mac_array[4]}${mac_array[5]}"

# 拼接完整的IPv6地址
ipv6_address="${ipv6_prefix}${eui64}"

# 输出完整的IPv6地址
echo "$ipv6_address"

实际使用(IPv6前缀隐藏了4位)

[root@localhost ~]# ./ipv6neigh.sh 62:c3:a5:8d:1b:63
2408:****:880:6e:60c3:a5ff:fe8d:1b63

@Emtier
Copy link

Emtier commented Jun 13, 2024

我自己路由器是华硕 IPv6用的Stateful模式 所以家里的设备IPv6不是按照标准EUI-64格式 而是短的IPv6,这里分享一下我用一台Linux获取家里其他设备的IPv6命令:
ip -6 route | awk '{print $1}' | grep "240" | awk -F:: '{print $1 "::aaaa"}' aaaa改为IPv6最后4位

@Mrxuanlian
Copy link

ip -6 neigh | awk '/240:?/' | awk '/9a:4d?/' | awk '{print $1}'

我是通过访问arp筛选的,匹配公网,mac地址,然后打印第一个。

@Zerorigin
Copy link
Contributor

Zerorigin commented Jul 30, 2024

分享一条自用两年左右的 Windows 获取 IPv6 的 PowerShell 命令(亦可稍微修改用于获取网卡上的公网 IPv4 地址)
后续可能会将 ddns-go 封装到 container 里放到网关路由器上使用,分享出来的同时存档顺便备份
其实这条命令和前面别人分享的差不多,只是更加优雅和可靠而已

(Get-NetIPAddress -InterfaceAlias "<此处填写网络适配器名称>" -AddressFamily IPv6 -AddressState Preferred -PrefixOrigin RouterAdvertisement -SuffixOrigin Link | Sort-Object -Property PreferredLifetime -Descending)[0].IPAddress

如果不知道网络适配器名称怎么填,可以用以下命令查询

(Get-NetIPAddress -IPAddress "<此处填写网络适配器上的局域网或公网 IPv4 地址>").InterfaceAlias

因为 PowerShell 是个面向对象的脚本语言,所以可以很方便的直接用管道符配合 Sort-Object 按特定属性直接排序
按 IPv6 PreferredLifetime 剩余租期倒序(从大到小)排序,有效避免了同一网适配器出现多个 PD 前缀(过期前缀残留)及老旧租赁 IPv6 地址的情况

Sort-Object -Property PreferredLifetime -Descending

排序完的数据仍然是个对象列表(如果只有一个元素,那可以直接用 .属性名 来引用)
因此可以使用列表下标和属性名来直接提取所需的 IPv6 地址,而无需手动写任何字符串匹配和拼接规则
可以按需灵活地增删修改 Get-NetIPAddress 的传递参数来筛选需要的公网 IPv6 地址

另外有的网关路由器可能会出现就算分配的是当前 PD 前缀的 IPv6 地址
但是因为租期太长,获取后经过一段时间而失效不能使用,不过不影响从外网进局域网,仅影响局域网出外网
这种情况不会影响内网服务响应通过 DDNS 进来的请求,但是仍建议缩短网关路由器的 DHCPv6 租期(1~2小时为优)
或者换用能通知前缀过期的路由器,以免影响 IPv6 的使用体验(浏览器、游戏、下载等)

这边贴个自己的博客链接,分享解决 Windows 平台 IPv6 连通性问题的方法:
https://blog.gazer.win/essay/make-windows-quickly-remove-deprecated-ipv6-addresses.html

更多用法可参考:
https://learn.microsoft.com/zh-cn/powershell/module/nettcpip/get-netipaddress

@hilen
Copy link

hilen commented Aug 14, 2024

openwrt 可以通过这个命令获取 ipv6 地址, 240e 是电信,其他可以自行替换
ip -6 addr | grep inet6 | awk '/240e:?/' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | head -n 1

@falseUtopia
Copy link

falseUtopia commented Sep 28, 2024

ip -6 addr show 指定网卡名,保留 global 且排除 deprecated noprefixroute 状态后的地址

ip -6 a s eth0 | grep inet6 | grep global | grep -vE 'deprecated|noprefixroute' | awk '{print $2}' | cut -d/ -f1

@yin1999
Copy link
Contributor

yin1999 commented Oct 21, 2024

使用 DNS 服务器获取设备的公网 IPv4 地址(IPv6类似):

dig TXT -4 o-o.myaddr.l.google.com @ns1.google.com +short | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"

参见:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation keep
Projects
None yet
Development

No branches or pull requests