Skip to content

Instantly share code, notes, and snippets.

@KuRRe8
Last active June 10, 2026 03:40
Show Gist options
  • Select an option

  • Save KuRRe8/fd4e0613dbd97ded17cf087a4419556b to your computer and use it in GitHub Desktop.

Select an option

Save KuRRe8/fd4e0613dbd97ded17cf087a4419556b to your computer and use it in GitHub Desktop.
网络相关

网络相关封面

常见保留网段分类如下:

一、私有地址(RFC1918)

  • 10.0.0.0/8 A类,一般来说公司学校内网使用10段地址,可以容纳2^24地址1600万个
  • 172.16.0.0/12 B类,100万个
  • 192.168.0.0/16 C类,家庭使用,6.5万个,家庭路由器一般用24位掩码,也就是只有254个可用地址 用途:局域网、VPN、NAT。

二、环回与本地链路

  • 127.0.0.0/8 → 本机环回(常用 127.0.0.1)。该类地址不会通过网卡,而是在操作系统协议栈内部发回本地。
  • 169.254.0.0/16 → 链路本地(DHCP 失败时自动回落的地址段,比如两个需要DHCP的PC机用网线直连,在30s后各自会分配该网段地址)。

三、文档和示例(不可路由)

  • 192.0.2.0/24 → TEST-NET-1
  • 198.51.100.0/24 → TEST-NET-2
  • 203.0.113.0/24 → TEST-NET-3 用途:示例、教材、文档。相当于三个假网段,路由器程序理应将这类网段加入黑名单,丢弃发往这些网段的包。在PC机上是否有限制未知。

四、特殊功能地址

  • 0.0.0.0/8 → 本网络(源地址用得多)。
  • 100.64.0.0/10 → Carrier-Grade NAT (CGNAT)。运营商级别的公共IP池,用户侧的WAN口,相当于拥有4,194,304地址的一个小型公网,依旧需要NAT到全球公网
  • 192.0.0.0/24 → IETF 协议保留(如 DS-Lite 用 192.0.0.8/32)。
  • 192.88.99.0/24 → 6to4 继任网段(已废弃)。

五、基准测试(RFC1544)

  • 198.18.0.0/15 → 网络设备性能测试。(比如用于测试路由器的吞吐量使用该地址段,不再向外路由)

六、多播和保留

  • 224.0.0.0/4 → IPv4 多播。(相当于在群聊里发公告,群组内设备都要被路由得到消息)
  • 240.0.0.0/4 → 保留,未来可能使用。

Clash

用于代理。

安装

可以下载桌面端的Clash Verge for Windows或者下载Linux命令行端的

git clone --branch master --depth 1 https://gh-proxy.org/https://github.com/nelvko/clash-for-linux-install.git \
  && cd clash-for-linux-install \
  && bash install.sh

使用

桌面端比较方便,可以直接从url导入,也可以按文件导入。命令行端安装完后可以根据提示导入url,或者打开clashctl/resources/runtime.yaml 来编辑。 桌面端点击按钮打开系统代理或者虚拟网卡tun。 命令行端执行clashctl on开启,虚拟网卡通过clashctl tun on开启(但是要提前配置好)。

Warning

配置文件一定要写好内网地址直连不走代理。之前就是忽略这个导致内网ssh失败,还查了一晚上其他原因以为服务器坏了。

测试和验证

浏览器访问外网是最直接的方法,因为浏览器会尊重代理Proxy。

其他桌面程序自由决定是否尊重代理设置,但如果是tun模式则一定流量转发。

命令行程序不一定默认走Proxy,如果可能的话,tun模式免除很多麻烦,但如果主机是多用户的,最好不要tun安装额外的虚拟网卡。

以下针对Proxy模式,仅凭命令行的检测方法:首先把clashctl/resources/runtime.yaml写好后,clashctl on开启代理

Important

在该模式下ping google.com是不行的,因为ICMP是网络层协议,和应用层代理设置无关。

成功的情况

由于curl git pip apt这类自带工具一般遵守代理所以可以用curl直接

curl -I https://google.com
image

如果得到类似上述结果,那么外网已经成功了。

Note

但是某些特定的cli程序会拒绝走代理,这个用户一般无法介入,比如Gemini Cli。

还可以通过下面的指令获取自己出口ip的详细信息。

curl https://ipinfo.io/json

失败的情况

如果刚才的检测失败,则执行以下一系列检验

# 查看clash日志,一般无法成功启动是因为配置文件有误导致
clashctl log
# 检测是否设置好了环境,这里的7897是配置文件里的端口,没有的话要么是没有on要么是配置文件问题
env | grep -i proxy
# 应该类似于下方内容,如果没有则查看clashctl log
#no_proxy=localhost,127.0.0.1,::1
#https_proxy=http://192.168.18.191:7897
#NO_PROXY=localhost,127.0.0.1,::1
#HTTPS_PROXY=http://192.168.18.191:7897
#HTTP_PROXY=http://192.168.18.191:7897
#http_proxy=http://192.168.18.191:7897
#ALL_PROXY=socks5h://192.168.18.191:7897
#all_proxy=socks5h://192.168.18.191:7897
# 检测clash是否监听了预设端口,没有的话一般也是配置文件问题
ss -tunlp | grep :7897
# 手动指定代理端口
curl -x http://127.0.0.1:7897 https://api.ipify.org
# 有可能是DNS污染等
nslookup google.com

个人的配置

mixed-port: 7897
allow-lan: true
bind-address: '*'
mode: rule
log-level: info

dns:
  enable: false
  ipv6: false
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  use-hosts: true
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query
    - tls://dot.pub
    - tls://dns.alidns.com
  fallback:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query
    - tls://dot.pub
    - tls://dns.alidns.com
  fallback-filter:
    geoip: true
    ipcidr:
      - 240.0.0.0/4
      - 0.0.0.0/32

proxies:
  - name: '🇺🇸 我的美国节点'
    type: vmess
    server: 填写自己的vps
    port: 填写自己的port
    uuid: 填写自己的id
    alterId: 0
    cipher: auto
    udp: true
    network: tcp
    tls: false

proxy-groups:
  - name: Proxy
    type: select
    proxies:
      - '🇺🇸 我的美国节点'


rules:
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - DOMAIN-SUFFIX,google.com,Proxy
  - DOMAIN-SUFFIX,googleapis.com,Proxy
  - DOMAIN-SUFFIX,github.com,Proxy
  - DOMAIN-SUFFIX,openai.com,Proxy
  - DOMAIN-SUFFIX,x.com,Proxy
  - DOMAIN-SUFFIX,youtube.com,Proxy
  - GEOIP,CN,DIRECT
  - MATCH,Proxy

Sniffer

ping同一个网段内所有地址嗅探主机

1..254 | ForEach-Object -Parallel {
    if (Test-Connection -ComputerName "192.168.1.$_" -Count 1 -Quiet -TimeoutSeconds 1) {
        "192.168.1.$_"
    }
} -ThrottleLimit 64

非并行嗅探,速度较慢

1..254 | ForEach-Object {
    if (Test-Connection "192.168.1.$_" -Count 1 -Quiet -TimeoutSeconds 1) {
        "192.168.1.$_"
    }
}

ARP嗅探

for /L %i in (1,1,254) do @ping -n 1 -w 50 192.168.1.%i >nul
arp -a

Bash内置语法检测网络端口

timeout 1 bash -c "echo > /dev/tcp/192.168.1.1/80" && echo "open" || echo "closed"

自动连接WiFi或者热点

在诸如Jetson 这类嵌入式板卡二次开发过程中,有可能面临无显示器远程登陆的需求。而远程登陆需要一个确定的网络,要么是外部的WiFi(通常有Internet),要么是Jetson主动开启Hotspot,然后PC接入该热点后远程连接(无Internet)。连接工具可以是SSH,VSCODE,NoMachine,ToDesk, VNC,向日葵等。但由于Jetson已经处于Headless状态,无法在桌面环境配置网络,所以需要提前写好服务,使得其能够开机自适应连接。该服务逻辑:如果有已知的WiFi则接入,如果没有已知WiFi或者连接失败,则fallback到hotspot。

需要准备:

sudo apt install network-manager
sudo systemctl enable NetworkManager
sudo systemctl start NetworkManager

脚本如下

#!/bin/bash
INTERFACE="自己的无线网卡名称wlP7p1s0"
SSID="某个网络"
PASSWORD="某个密码"

HOTSPOT_NAME="热点名"
HOTSPOT_PASSWORD="热点密码"

CHECK_INTERVAL=15

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 判断是否已连接(包括 WiFi / hotspot / 正在连接)
is_connected() {
    STATE=$(nmcli -t -f GENERAL.STATE dev show "${INTERFACE}" | cut -d: -f2 | awk '{print $1}')
    if [ "$STATE" -ge 50 ]; then
        return 0
    else
        return 1
    fi
}

connect_wifi() {
    log "Trying to connect to ${SSID}"
    nmcli dev wifi connect "${SSID}" password "${PASSWORD}" ifname "${INTERFACE}"
    return $?
}

start_hotspot() {
    log "Starting hotspot ${HOTSPOT_NAME}"
    nmcli dev wifi hotspot ifname "${INTERFACE}" ssid "${HOTSPOT_NAME}" password "${HOTSPOT_PASSWORD}"
    log "nmcli return status $?"
}

while true; do
    #sleep ${CHECK_INTERVAL}
    if is_connected; then
        log "Network is active (wifi or hotspot)"
    else
        log "Not connected, trying WiFi"
        connect_wifi
        if [ $? -ne 0 ]; then
            log "WiFi failed, fallback to hotspot"
            start_hotspot
        else
            log "Connected to ${SSID}"
        fi
    fi
    sleep ${CHECK_INTERVAL}
done

然后脚本使用chmod +x赋予执行权。

添加服务到/etc/systemd/system/wifi-monitor.service

[Unit]
Description=WiFi Monitor Service
After=NetworkManager.service
Wants=NetworkManager.service

[Service]
Type=simple
ExecStart=/usr/local/bin/wifi_monitor.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

最后执行命令开启服务

systemctl daemon-reexec
systemctl daemon-reload
systemctl enable wifi-monitor.service
systemctl start wifi-monitor.service
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment