测试公网IP是否独占 🔗
最近新换宽带,虽然问了一圈都说给不了公网IP。但是自己改桥接拨号后,发现居然拿到的是/32的公网IP。高兴了2天,又突然想起了假公网IP的传说。 所以记录一下测试的过程。
TCP协议测试 🔗
在内网起一台虚拟机(Live系统就行),安装Nginx。这里是不想污染内网的web服务器的日志。
apt install nginx -y
echo true > /var/www/html/true.txt
ip a
在拨号的Openwrt中设置端口转发。协议为TCP,外部端口设为1-65535,转发到新虚拟机的80端口。 再设置源地址为我的ECS的地址,源端口号限制到高位10001-65535。 ECS服务都设在低位端口,这样既不影响ECS,也不影响内网中需要访问ECS的服务。
登录ECS,开始测试。节约时间,一切从简,给小机来个进程创建的压力测试,进程创建开销再高几分钟也跑完了。其中addr设置为拨号拿到的公安IP。
mkdir pubIPTest
cd pubIPTest
mkdir false done
cat >single.sh <<EOF
#!/bin/bash
addr=1.2.3.4
port=$1
ret="$(curl --connect-timeout 2 -s http://${addr}:${port}/true.txt)"
if [ "$ret" != "true" ]; then
echo $port > ./false/$port
else
touch ./done/$port
fi
EOF
chmod a+x single.sh
seq 1 65535 | xargs -P 200 -n 1 ./single.sh
再起一个ssh连接,
ls done | wc -l ; ls false | wc -l ; ls false
不断查询进度(还是嫌慢了)。最终结果封掉了28个常用端口。夜晚测试可能没和其他人产生冲突,计划白天再测试下。
ls done | wc -l ; ls false | wc -l ; ls false
65507
28
1068 136 138 1434 3127 3333 443 445 5800 593 6176 80 8998 9995
135 137 139 2745 3128 37215 4444 5554 5900 6129 6667 8080 901 9996
#check again
mv false temp; mkdir false
ls temp | xargs -P 28 -n 1 ./single.sh
UDP测试 🔗
Openwrt中设置端口转发。协议为UDP,外部端口设为1-65535,转发到虚拟机的53端口。 再设置源地址为我的ECS的地址,源端口号限制到高位10001-65535。在ECS上创建sender.py
#!/usr/bin/python3
from scapy.all import *
import random
from multiprocessing import Pool
from tqdm import trange,tqdm
import sys
daddr = "4.3.2.1"
threadP = 20
def sender(index):
dport = index + 1
payload = "%s:%s\n" % (dport, dport*7%23)
pkt = pkt=IP(dst=daddr)/UDP(sport=random.randint(10001,65535),dport=dport)/payload
#Ether(src=macs, dst=macd) / IP(src=ips, dst=ipd) / UDP(sport=sport, dport=dport) / payload
send(pkt,verbose=0)
if len(sys.argv) > 1:
sender(int(sys.argv[1])-1)
exit(0)
with Pool(threadP) as P:
list(tqdm(P.imap(sender,range(65535)),total=65535))
在虚拟机运行receive.py,再去ECS运行sender.py
#!/usr/bin/python3
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('0.0.0.0',53))
lf = open('log.log',"bw")
while True:
data, client = server_socket.recvfrom(1024)
lf.write(data)
在虚拟机中检查结果:
for i in `seq 1 65535`; do if [ "$(grep -E ^$i\: log.log)" = "" ]; then echo $i | tee result.txt; fi; done
135
136
137
138
139
319
320
445
1433
1434
3333
4444
5554
9995
9996
#check Again in ECS
for i in 135 136 137 138 139 319 320 445 1433 1434 3333 4444 5554 9995 9996; do ./sender.py $i; done
从测试结果来看,UDP被联通屏蔽了15个端口。这里为了实现简单,并没有让receiver回应UDP消息。 毕竟receiver在家宽一侧,向外发包的能力还是能保障的。
结论 🔗
UDP和第二次TCP测试都运行在白天。所以可以得出结论,拨号拿到的是真实分配的动态公网IP。 即使有一层让我无感的所谓共享公网IP的池子,从这个NAT的行为上,从我的ECS的角度观察,拨号拿到的地址也等同于公网IP。