前言

学校最近通知要开学了,便把家里的N1盒子(类似于树莓派的设备),通过路由器上的DMZ主机设置放到公网上以便在学校访问。通过简单的脚本测试了一下本地 ISP (某地联通)对个人用户屏蔽了哪些 TCP 端口。

测试方法

该方法来自https://www.v2ex.com/t/509732

设置本地路由器的防火墙默认的入站规则为 Reject,即用 ICMP 消息拒绝对未开放端口的连接。

找一台远程的机器(跨 ISP,防止出现两台机器在同一个防火墙区域的情况),使用 nc 依次连接 1-9999 端口,超时时间 1 秒左右。如果显示 Connection Refused 则表示这个端口是由本地路由器拒绝的,如果显示Connection timed out,则表示被 ISP 屏蔽了。

这里有一个假设的前提是,ISP 屏蔽端口的方式是丢包

可能会有误测,为了结果可靠就多测试几遍吧。

脚本代码

#!/bin/bash
CHECK_IP="0.0.0.0"
for port in {1..9999}; do
    echo -n "TCP $port: "
    result=$(nc "$CHECK_IP" "$port" -w 1 2>&1 < /dev/null)
    if [ "$?" -eq 0 ]; then
        echo "Open"
        continue
    fi
    if [[ "$result" == *refused* ]]; then
        echo "Closed"
    fi
    if [[ "$result" == *time* ]]; then
        echo "$port" >> block_list.txt
        echo "BLOCKED"
    fi
done

在服务端新建文件scan_isp_blocklist.sh ,将以上代码复制到新建文件中,并修改0.0.0.0为要测试的IP
请确保脚本文件有足够的权限,默认输出丢包的端口到block_list.txt文件。

Linux执行脚本可能遇见的问题

执行 ./scan_isp_blocklist.sh报错

[root@anyfan ~]# ./scan_isp_blocklist.sh 
-bash: ./scan_isp_blocklist.sh: /bin/bash^M: bad interpreter: No such file or directory

执行 sh scan_isp_blocklist.sh报错

[root@anyfan ~]# sh scan_isp_blocklist.sh 
scan_isp_blocklist.sh: line 3: syntax error near unexpected token `$'do\r''
'can_isp_blocklist.sh: line 3: `for port in {1..9999}; do

解决方法:

sed -i -e 's/\r$//' scan_isp_blocklist.sh
./scan_isp_blocklist.sh

测试结果

25
80
135
136
137
138
139
443
445
593
901
1068
2745
3127
3128
3333
4444
5376
5495
5554
5800
5900
6129
6176
6667
8080
8998
9996

25
80
135
136
137
138
139
443
445
593
901
1068
2745
3127
3128
3333
4444
5554
5800
5900
6129
6176
6667
8080
8998
9996

25
80
135
136
137
138
139
443
445
593
901
1068
2745
3127
3128
3333
4444
5554
5800
5900
6129
6176
6667
8080
8998
9996

其他测试方法

一条命令解决

本人没有进行测试,不知其可行性。

最常用的 100 个。

sudo nmap -sA -Pn -F 195.172.xx.xx

想要 1 到 10000 这样用

sudo nmap -sA -Pn 195.172.xx.xx -p1-10000
最后修改:2020 年 08 月 12 日 12 : 43 PM
赏口饭吃,行行好吧,客官!