如何使用 Powershell 将 WAN IPv4 和 IPv6 地址放入变量中,而不是依赖外部 A 和 AAAA DynDNS 区域

问题描述 投票:0回答:1

这就是我目前正在尝试的方法,将内部 LAN IPv4/IPv6 地址获取到每个双 IP 堆栈变量中:

# This is a one liner(-ish) to get my LAN_IPv4 and IPv6 addresses:

# Begin
$ipv4 = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress
$ipv6 = Get-NetIPAddress -AddressFamily IPv6 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress
echo IPv4: $ipv4
echo IPv6: $ipv6

# Will be using this for external WAN IP (Below)
# [System.Net.Dns]::GetHostEntry('my.ddnshost.tld')

我想获取 WAN IPv4 和 IPv6 地址的唯一方法是使用 DNS 主机记录“A”和“AAAA”

Working Local IPv4 and IPv6 address 
#BEGIN 
$ipv4 = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress
$ipv6 = Get-NetIPAddress -AddressFamily IPv6 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress

#Use DNS to Resolve WAN_IPv4 and WAN_IPv6 via [Systems.Net.Dns]
$ddns_ipv4 = ([System.Net.DNS]::GetHostAddresses('ipv4.ddns.tld') | 
    Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString
$ddns_ipv6 = ([System.Net.DNS]::GetHostAddresses('ipv6zone.ddns.tld') |
    Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString

#$ddns_ipv4 = [System.Net.Dns]::GetHostEntry('my.ipv4zone.ddns.tld')
echo LAN-IPv4:"    "$ipv4
echo WAN-IPv4:"    "$ddns_ipv4
echo LAN-IPv6:"    "$ipv6
echo WAN-IPv6:"    "$ddns_ipv6

输出为:

LAN-IPv4:    172.16.12.10
WAN-IPv4:    151.14.98.172
LAN-IPv6:    fe80::325:be11:5aaa:2faa%7 2a00:22c3:113e:31aa:ffff:::31b3
WAN-IPv6:    2a00:22c3:113e:31aa:ffff:::31b3

如果有更好的方法可以在 Powershell 中使用变量内部获取此信息,那将非常有帮助,这样会更简单,并且不依赖于我的脚本从动态 DNS 提供商进行 ping / DNS 递归查找。

旁注:我一直在玩 cURL(对于 WAN 端查找,在我的 DynDNS A 和 AAAA 记录上使用相同的方法),但到目前为止,还没有完全设法将curl 的输出传输回 PowerShell $IP_Var 解决方案还没有让我陶醉。

-- 必须有一种简单的方法来实现 LAN/WAN 端 IPv4/6 查找,所有这些查找都在 Powershell 内完成,不必依赖 DDNS,而是直接从网络接口/路由表,例如查询 nbtstat -an 或达到这个效果的东西...... 欢迎任何建议。谢谢!


```lang-powershell-5.1
Working Local IPv4 and IPv6 address 
#BEGIN 
$ipv4 = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress
$ipv6 = Get-NetIPAddress -AddressFamily IPv6 -InterfaceIndex $(Get-NetConnectionProfile |
    Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress

#Use DNS to Resolve WAN_IPv4 and WAN_IPv6 via [Systems.Net.Dns]
$ddns_ipv4 = ([System.Net.DNS]::GetHostAddresses('ipv4.ddns.tld') | 
    Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString
$ddns_ipv6 = ([System.Net.DNS]::GetHostAddresses('ipv6zone.ddns.tld') |
    Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString

#$ddns_ipv4 = [System.Net.Dns]::GetHostEntry('my.ipv4zone.ddns.tld')
echo LAN-IPv4:"    "$ipv4
echo WAN-IPv4:"    "$ddns_ipv4
echo LAN-IPv6:"    "$ipv6
echo WAN-IPv6:"    "$ddns_ipv6

输出为:

LAN-IPv4:    172.16.12.10
WAN-IPv4:    151.14.98.172
LAN-IPv6:    fe80::325:be11:5aaa:2faa%7 2a00:22c3:113e:31aa:ffff:::31b3
WAN-IPv6:    2a00:22c3:113e:31aa:ffff:::31b3
powershell networking dns ip ipv6
1个回答
0
投票

没有办法。为什么?因为只有路由器知道 WAN IP 地址,并且路由器实际上是您的 DNS 服务器,所以它永远不需要通知您的计算机 WAN IP 地址是什么。 WAN IP 地址超出了您的本地计算机“本地”需要了解的范围。

现在这是一个奇怪的脚本来获取你需要的东西。只是疯狂地使用它。

Add-Type -AssemblyName System.Windows.Forms

# Retrieve WAN IP addresses
$wanIPv4 = Invoke-RestMethod -Uri 'http://api.ipify.org'
$wanIPv6 = Invoke-RestMethod -Uri 'http://api64.ipify.org'

# Create the form
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "WAN IP Addresses"
$Form.Size = New-Object System.Drawing.Size(300,200)
$Form.StartPosition = "CenterScreen"

# Create the label for IPv4
$LabelIPv4 = New-Object System.Windows.Forms.Label
$LabelIPv4.Location = New-Object System.Drawing.Point(10,10)
$LabelIPv4.Size = New-Object System.Drawing.Size(280,20)
$LabelIPv4.Text = "WAN IPv4: $wanIPv4"

# Create the label for IPv6
$LabelIPv6 = New-Object System.Windows.Forms.Label
$LabelIPv6.Location = New-Object System.Drawing.Point(10,40)
$LabelIPv6.Size = New-Object System.Drawing.Size(280,20)
$LabelIPv6.Text = "WAN IPv6: $wanIPv6"

# Add the labels to the form
$Form.Controls.Add($LabelIPv4)
$Form.Controls.Add($LabelIPv6)

# Show the form
$Form.ShowDialog()

# RUN: powershell -ExecutionPolicy ByPass -File hello.ps1
© www.soinside.com 2019 - 2024. All rights reserved.