校园网内串流时,内网IP变动监控

在讨论这个话题之前,我们需要进行一个情况的设想:

假如我是一个大学生,手头有一台Nivdia显卡的电脑(不论是台式机还是笔记本),同时还有一个平板电脑,现在我希望能够用平板电脑配合键鼠来实现对电脑的访问,从而使我能够在图书馆/宿舍/学校的咖啡厅/家里以及其他地方访问我的电脑,我该如何操作?

图文无关

众所周知,把大象放进冰箱只需要三步,那么我们在执行这个操作时也需要三步:进入内网、获取IP、进行串流。

我想有关Moonlight或其他软件进行N卡串流的教程网上以及说的足够清楚,此处不加以赘述。但由于我们有可能无法访问校园网IPV6的防火墙以进行一系列设置,因此在大多数情况下我们还是要通过IPV4的形式来进行串流。在国内,你很难找到一个10M带宽且延迟在50ms以内的VPS,因此这种试图通过公网IP服务器作为中转的串流方式往往质量很低。而由于不同学校的校园网状况不同,我们这里重点介绍借助校园VPN来实现内网连接。

虽然各大高校的校园网可以看作是一个大内网,由各大教育网给定其专用的公网IP(例如天津大学的202.113.13.*),同时将内网IP分配给各个登录校园网的设备(172或198开头等),然而即使你的平板和你的电脑分配在了一个频段下,往往也无法在Moonlight串流时正确的访问,原因见此。这种情况就很糟糕,不过校园网VPN则可以有效的缓解这个情况。然而内网IP可能随时都在进行变化(如果你的工作室/专业课教室自建了路由器则可以通过设置使其不变),这使得我们不可能每次都查询这个IP地址,一旦IP发生变化,我们的串流软件就有可能搜索不到已经连接的设备。

针对这个问题,我在我的电脑上部署了一段python程序,当本地内网IP一旦发生变化,就可以通过邮件提醒的方式来通知我。我也可以根据变动的IP地址帮我重新进行Moonlight的连接。此方法也适用于其他路由器等形式连接,一旦IP发生变化即可得到通知。

import time
import socket
import smtplib
from email.mime.text import MIMEText

def get_ipv4_address():
    # 创建一个 socket 对象
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    try:
        # 连接到 Google 的 DNS 服务器获取本地 IPv4 地址
        sock.connect(('8.8.8.8', 80))
        ip = sock.getsockname()[0]
        return ip
    except socket.error:
        return None
    finally:
        sock.close()

def send_email(ip):
    # 邮箱配置信息
    smtp_server = 'smtp.163.com'  # 邮箱SMTP服务器地址,可自行查询
    smtp_port = 25  # SMTP服务器端口号,可自行查询
    sender_email = 'example1@163.com'  # 发件人邮箱
    sender_password = 'EXAMPLEPASSWD'  # SMTP密钥
    receiver_email = 'example2@163.com'  # 收件人邮箱

    # 构造邮件内容
    message = MIMEText(f'Your current IPv4 address is {ip}')
    message['Subject'] = 'IP Address Notification'
    message['From'] = sender_email
    message['To'] = receiver_email

    # 发送邮件
    try:
        with smtplib.SMTP(smtp_server, smtp_port) as server:
            server.starttls()
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, receiver_email, message.as_string())
        print('Email sent successfully')
    except smtplib.SMTPException as e:
        print('Failed to send email:', str(e))

# 初始化上次获取到的 IP 地址为空
previous_ip = None

# 获取初始 IPv4 地址并发送邮件
initial_ip = get_ipv4_address()
if initial_ip:
    send_email(initial_ip)

while True:
    # 获取当前 IPv4 地址
    current_ip = get_ipv4_address()

    if current_ip:
        # 比较当前 IP 与上次 IP,只有在发生变化时才发送邮件
        if previous_ip is not None and current_ip != previous_ip:
            send_email(current_ip)

        # 更新上次 IP 为当前 IP
        previous_ip = current_ip
    else:
        print('Failed to get IP address')

    # 间隔半小时再次获取 IP
    time.sleep(1800)  # 1800 秒 = 30 分钟

将这段Python程序部署在本地,通过各种方式使其开机启动,即可让电脑每半个小时获取一次IP。一旦当你无法检索到自己的电脑时(前提是你知道是由于IP变动导致的,而不是校园网VPN连接失败/断电等原因导致的),在半个小时以内你就会收到IP变动的邮件,将新的IP输入回Moonlight或其他串流软件,你就可以继续使用了。

Leave a Comment