分类 技术 下的文章

IPv4地址10进制转16进制IPv6地址批处理脚本

最近做IPv6项目时遇到了ipv4地址的十进制数字转ipv6地址的十六进制,用计算器换算太麻烦,所以撸了一个批处理轮子。
可以参考我之前的《批处理脚本封装成exe可执行文件》,转成exe方便使用。

此脚本可以实现对输入的ipv4地址格式做判断,只把v4的a.b.c.d转成v6的ff:ff格式。
注意批处理脚本要保存成ansi格式。

#batch_ipv4_trans_hex.bat
chcp 936&cls
@echo off&PUSHD %~DP0 &TITLE IPv4地址转IPv6
mode con cols=90 lines=30&COLOR f0

:input_ipv4_address
cls
echo;请输入IPv4地址:
setlocal enabledelayedexpansion
set /p ipv4=
set "s=[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
echo %ipv4%|findstr /be "%s%" >nul||set flag=a
set n=%ipv4:.= %
for %%a in (%n%) do (
   set /a var=1%%a 2>nul
   if !var! gtr 1255 set flag=a
)
if defined flag echo;IPv4地址格式错误,按任意键重新输入&pause>nul&endlocal&goto :input_ipv4_address
for /f "tokens=1 delims=." %%a in ("%ipv4%")  do ( set ipv4_a=%%a)
if not defined ipv4_a echo;IPv4地址格式错误,按任意键重新输入&pause>nul&goto :input_ipv4_address
for /f "tokens=2 delims=." %%a in ("%ipv4%")  do ( set ipv4_b=%%a)
if not defined ipv4_b echo;IPv4地址格式错误,按任意键重新输入&pause>nul&goto :input_ipv4_address
for /f "tokens=3 delims=." %%a in ("%ipv4%")  do ( set ipv4_c=%%a)
if not defined ipv4_c echo;IPv4地址格式错误,按任意键重新输入&pause>nul&goto :input_ipv4_address
for /f "tokens=4 delims=." %%a in ("%ipv4%")  do ( set ipv4_d=%%a)
if not defined ipv4_d echo;IPv4地址格式错误,按任意键重新输入&pause>nul&goto :input_ipv4_address
call :dec2hex %ipv4_a% ipv4_a_hex
call :dec2hex %ipv4_b% ipv4_b_hex
call :dec2hex %ipv4_c% ipv4_c_hex
call :dec2hex %ipv4_d% ipv4_d_hex
cls
echo;IPv4地址:%ipv4%
echo;IPv6地址:%ipv4_a_hex%%ipv4_b_hex%:%ipv4_c_hex%%ipv4_d_hex%
echo;按任意键重新输入,或按右上角X退出
pause>nul
set ipv4=
set ipv4_a=
set ipv4_b=
set ipv4_c=
set ipv4_d=
cls
goto :input_ipv4_address

:dec2hex
setlocal EnableDelayedExpansion
set n=%1
for /l %%i in (1,1,2) do set/a"H%%i=n&15,n>>=4"&set o=!H%%i!:!o!
for %%e in ("10:=A" "11:=B" "12:=C" "13:=D" "14:=E" "15:=F" ":=") do set o=!o:%%~e!
endlocal & set %2=%o%

RouterOS使用DNS转发功能实现域名分流解析

20220718更新:更新域名匹配正则,添加每周更新脚本。由于缓存查询时间增加过多,此方法不推荐,详情参考文章后部。

之前写过两篇文章介绍实现域名分流解析的方案,一个是使用dnsmasq基于大陆域名白名单分流解析域名,另一个是使用overture替换dnsmasq做域名分流解析
这次介绍的方案与dnsmasq类似,默认使用境外dns服务器解析,境内域名使用白名单转发到境内dns服务器。
routeros在v6.47中增加了静态条目规则type属性,其中包含FWD类型。FWD类型可以将指定域名转发到指定的DNS服务器。
以下以routeros v7.3.1的chr版本为环境,dns服务器是8.8.8.8和8.8.4.4
增加alicdn.com域名及子域名转发给114.114.114.114解析。正则匹配如下

^(.*\.)?alicdn\.com$

命令如下

/ip/dns/static/add regexp="^(.*\\.)?alicdn\\.com\$" forward-to=114.114.114.114 ttl=300s

详细命令请参考官方wiki
这里使用dnsmasq-china-list做白名单转发给境内dns服务器解析,生成脚本如下

/ip/dns/static/remove [/ip/dns/static/find type=FWD]
/ip/dns/static/add regexp="^(.*\\.)?0-100\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0-6\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00\\.net\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?000\\.link\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00000\\.host\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00042\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?00058\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0006266\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp="^(.*\\.)?0007\\.net\$" forward-to=114.114.114.114 ttl=300s
...

脚本有接近7万行,使用intel i5-7200u分配2逻辑核心的虚拟机首次执行需要约3.5分钟,阿里云1核心服务器首次执行需要2.5分钟,再次执行需要7.5分钟,再次执行时会先删除type=FWD的静态条目,脚本执行时cpu占用100%,所以cpu性能较差时需要耐心等待。

这里下载每周自动生成的脚本。
导入方法:使用

/import dns.rsc

导入,等待完成。

使用RouterOS自带dns转发功能做域名分流解析优点是可以抛弃openwrt或者linux服务器的小尾巴,实现routeros单一系统完成全部网络功能,特别适合不支持直通的cpu裸装routeros的情况。
缺点和使用dnsmasq分流解析一样,境内域名列表更新不及时,可能导致一些新的域名解析成境外地址。

另外,导入dns转发脚本后不要使用webfig打开dns静态列表,条目太多会卡死。
附:自动生成dns.rsc脚本

#!/bin/bash
echo "/ip/dns/static/remove [/ip/dns/static/find type=FWD]">/tmp/dns.rsc && curl -s https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf|sed '/#/d'|sed 's/\/114.114.114.114//g'|sed 's/\./\\\\./g'|sed 's/server=\//\/ip\/dns\/static\/add regexp=\"^(.*\\\\.)?/g'|sed 's/$/&\\$\" forward-to=114.114.114.114 ttl=300s/g'>>/tmp/dns.rsc

发现问题:
1,routeros的dns本地缓存查询时间显著增加,使用dig命令发现未导入时缓存查询时间小于1ms,导入后缓存查询时间约28ms,白名单域名反而查询时间更短。
2,在dns设置增加缓存到1gb后观察,发现导入后占用约180mb缓存。另可以通过观察缓存大小来大致确定导入进度。

windows单网卡实现802.1x认证的有线网络共享

以下内容仅适合我的特殊网络情况,仅供参考。

公司使用的是标准802.1x有线互联网认证,认证策略是PEAP/EAP-MSCHAPv2(不验证认证服务器证书)。这种认证策略在桌面操作系统支持的比较好,windows、mac、ubuntu都没有问题,但是在品牌路由器上能很好支持的基本没有。以linux为基础的vyos可以使用linux软件间接实现,openwrt同理,routeros声称可以支持,但是认证策略是PEAP时需要CA证书验证服务器身份切不能关闭,所以routeros也不行。

想使用网络共享是为了给手机wifi,笔记本本来是有移动热点功能的,结果intel的ax200无线网卡与iphone等设备有兼容性问题(表现为wifi连接成功, 不能获取IP地址),且只能使用2.4g频段(可以通过连接5gwifi后再共享的方式破解限制)。

中间使用过usb网卡共享网络给路由器,结果usb网卡在windows下稳定性太差,经常使用一段时间后就消失,只能重启恢复。

最终方案是,笔记本电脑网卡开启vlan功能,一根网线两个vlan,一个vlan走802.1x认证,另一个vlan共享网络。

设备:机械革命CODE01笔记本(realtek有线网卡),路由器mikrotik hap ac2(routeros v7.1beta6)

下载并安装Realtek Ethernet Diagnostic Utility,启用网卡vlan功能,创建vlan10和vlan20分别用于802.1x认证和网络共享。启用vlan后会虚拟出两个网卡,分别对应vlan10 和vlan20,在Utility中修改vlan10虚拟网卡的mac地址为物理网卡mac地址(802.1x绑定了mac地址、用户名和密码)。

routeros使用交换芯片的硬vlan,软vlan经过测试有问题(也可能配置有问题)

/interface/ethernet/switch/vlan
/interface/ethernet/switch/port
/interface/bridge/vlan
/interface/vlan
/ip/address/

routeros配置待完善。

miui的安卓google play服务异常耗电的解决办法

最近入了红米k40,使用发现开启谷歌基础服务后异常耗电,检查发现在使用蜂窝网络的时候google play服务耗电量接近50%,并且有些时候play商店和youtube提示没有网络。

手机使用的是联通手机卡,通过蜂窝网络联网时开启全局wireguard连接回家的透明网络。

首先考虑是dns问题,但是使用浏览器打开google.com和youTube.com都没有问题,可以排除dns投毒。

然后经过各种排除最终锁定到了ipv6的问题上,可以通过以下办法禁用蜂窝网络的ipv6。
1.设置
2.双开与移动网络
3.sim卡信息
4.接入点名称
5.按默认apn新建apn,apn协议选择ipv4(miui限制修改默认apn)
6.勾选新建的apn

可以通过HE的network tools中的interface information查看蜂窝网络的ip地址。

关闭蜂窝网络的ipv6后就可以畅快的使用google相关服务了。

其实这个问题可能是wireguard没有接管ipv6流量导致的。

使用overture替换dnsmasq做域名分流解析

20210617更新:RouterOS使用DNS转发功能实现域名分流解析
之前分享过使用dnsmasq基于大陆域名白名单分流解析域名,这种办法受限于白名单列表的更新,列表总是滞后于网站实际使用的域名,造成一些境内网站cdn解析到了境外,影响境内网站打开速度。
由于gfw的dns污染只会使用境外地址和私有地址,可以利用这个特性做dns分流解析:所有域名用境内dns服务器解析,如果域名解析得到境内ip则直接采用,如果得到境外ip则使用境外dns服务器解析。
开源软件overture就可以实现这个功能。overture有AB两组dns服务器,AB组各有一个IP列表和域名列表,假设A组为境内dns服务器,A的ip列表是大陆IP列表,A的域名列表是境内域名白名单,B的域名列表是被墙的域名gfwlist。

下面是overture的安装及配置步骤
安装脚本overture_install.sh

#! /bin/bash
apt update && apt install curl wget unzip
wget -q https://github.com/shawn1m/overture/releases/download/v1.7/overture-linux-amd64.zip
unzip overture-linux-amd64.zip  "overture-linux-amd64"
mv overture-linux-amd64 /sbin/overture
cat << EOF > /lib/systemd/system/overture.service
[Unit]
Description=overture-dns-server
After=syslog.target network-online.target
[Service]
ExecStart=/sbin/overture -c /etc/overture/config.yml
StandardOutput=syslog
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
EOF
mkdir /etc/overture
cat << EOF > /etc/overture/config.yml
bindAddress: :53
debugHTTPAddress:
dohEnabled: false
primaryDNS:
  - name: dns1
    address: 114.114.114.114:53
    protocol: udp
    socks5Address:
    timeout: 2
    ednsClientSubnet:
      policy: disable
      externalIP:
      noCookie: true
  - name: dns2
    address: 223.5.5.5:53
    protocol: udp
    socks5Address:
    timeout: 2
    ednsClientSubnet:
      policy: disable
      externalIP:
      noCookie: true
alternativeDNS:
  - name: google8888
    address: 8.8.8.8:53
    protocol: udp
    socks5Address:
    timeout: 3
    ednsClientSubnet:
      policy: disable
      externalIP:
      noCookie: true
  - name: google8844
    address: 8.8.4.4:53
    protocol: udp
    socks5Address:
    timeout: 3
    ednsClientSubnet:
      policy: disable
      externalIP:
      noCookie: true
onlyPrimaryDNS: false
ipv6UseAlternativeDNS: false
alternativeDNSConcurrent: true
whenPrimaryDNSAnswerNoneUse: alternativeDNS
ipNetworkFile:
  primary: /etc/overture/china_ip_list.txt
  alternative: /etc/overture/china_ip_list.txt
domainFile:
  primary: /etc/overture/china_list.txt
  alternative: /etc/overture/gfw_list.txt
  matcher: suffix-tree
hostsFile:
  hostsFile:
  finder: full-map
minimumTTL: 0
domainTTLFile:
cacheSize: 0
cacheRedisUrl:
cacheRedisConnectionPoolSize:
rejectQType:
  - 255
EOF
systemctl enable overture

列表更新脚本 overture_update_fliters.sh,首次运行overture前需要执行此脚本。

#! /bin/bash
cd /etc/overture
rm china_list.txt gfw_list.txt china_ip_list.txt
curl -s https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt > china_ip_list.txt
curl -s https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf  | sed 's/server=\///g;s/\/114.114.114.114//g' > china_list1.txt
curl -s https://raw.githubusercontent.com/hq450/fancyss/master/rules/WhiteList_new.txt  | sed 's/Server=\///g;s/\///g' > china_list2.txt
cat china_list1.txt china_list2.txt | sort -u > china_list.txt
rm china_list1.txt china_list2.txt
curl -s https://raw.githubusercontent.com/Loukky/gfwlist-by-loukky/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/d' | sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > gfwlist.txt
curl -s https://raw.githubusercontent.com/hq450/fancyss/master/rules/gfwlist.conf | sed 's/ipset=\/\.//g; s/\/gfwlist//g; /^server/d' > koolshare.txt
cat gfwlist.txt koolshare.txt | sort -u > gfw_list.txt
rm gfwlist.txt  koolshare.txt
systemctl restart overture

配置定时任务定期更新overture的域名和IP列表

0 3 * * 1 /root/overture_update_fliters.sh

参考:
docker 搭建 overture 无污染 DNS