问题
| 硬件型号 | TL-WAR2600L v2.0 企业路由器 |
|---|---|
| 固件版本 | 1.0.1 Build 20180313 Rel.37492 |
本地150自提了这个路由器,准备用它的多 wan 口搞搞事情,但是没想到掉坑里了:
- 80, 443 端口使用宽带拨号的外网 ip 可以访问(不安全)
txt
在局域网内输入外网宽带 ip,可以访问路由器管理界面;
但是在真正的外网上,比如手机不连局域网,访问宽带 ip,实际上又不能访问(我的 ip 是公网 ip)。 - 虚拟服务器转发的端口,从外网无法基本全部不可用
分析过程
获取 ssh 端口号和密码,登录到路由器后台
系统工具-设备管理-备份与导入设置,导出一个 bin 文件。使用 7z 打开,查看如下路径\backup-TP-LINK-2024-06-20\tmp\userconfig\etc\config\dropbear
bash
config dropbear
option PasswordAuth 'on'
option RootPasswordAuth 'on'
option Port '33400' # 这个就是端口
option ssh_port_switch 'on'- 在路由器管理页面
基本设置 - LAN设置中获取 mac 地址,然后找一个 linux 命令行工具执行
bash
## xx-xx-xx-xx-xx-xx 是你找到的 mac 地址。注意 -n
echo -n "xx-xx-xx-xx-xx-xx"|sed "s/-//g"|md5sum|cut -c 1-8
xxxxxxxx # 8位密码
登录后我其实还没发现(因为我不折腾 openwrt,有群晖和一台2U机架服务器了,路由器我只追求稳定),
这个路由器用的是 openwrt barrier breaker(龙妈:我是 chain breaker) 14.07。
后来是在与它斗智斗勇的过程中,才发现它的真身。
问题逐一分析
问题一 80, 443 端口使用宽带拨号的外网 ip 可以访问(不安全)
由于看到了以下这两条规则,走 br-lan 网卡(lan口,局域网)的流量可以访问管理界面,走 pe-wan1-poe(外网)已经做了拒绝处理,因此可以认为是安全的。
root@TP-LINK:~# iptables-save|grep remote_mngt_chain
:remote_mngt_chain - [0:0]
-A INPUT -j remote_mngt_chain
-A remote_mngt_chain -i br-lan -p tcp -m multiport --dports 80,443,23,33400 -j ACCEPT
-A remote_mngt_chain -i pe-wan1_poe -p tcp -m multiport --dports 80,443,23,33400 -j REJECT --reject-with icmp-port-unreachable
但我仍然决定关闭外网访问,因为
1. 没有这个需求
2. 使用 nmap x.x.x.x -p- 是可以扫描到这个端口的,这无疑增加了攻击者的兴趣。x.x.x.x 是外网 ip
bash
yu@kde:~$ nmap x.x.x.x -p-
Starting Nmap 7.80 ( https://nmap.org ) at xxxx-xx-xx xx:xx CST
Nmap scan report for x.x.x.x
Host is up (0.027s latency).
Not shown: 65527 closed ports
PORT STATE SERVICE
1723/tcp filtered pptp # vpn 服务器
1900/tcp open upnp # upnp
20002/tcp open commtact-http # tplink 的远程技术支持,其实不是 commtact-http
33400/tcp open unknown # ssh 端口
.... # 一些自己开的端口,略过
Nmap done: 1 IP address (1 host up) scanned in 4.66 seconds
3. 万一不小心执行一些命令,如 iptables -X,把这条 iptables 规则给删了,在部分没有禁用 80 端口的地区,还是可以访问的
4. 担心攻击不是杞人忧天,我的任何一台服务器,包括云服务器和家里面的服务器,每天都有成千上万条各种形式的攻击记录,现在的攻击手段完全自动和无差别攻击的,在你服务器部署后的数秒钟之内就会有各种攻击纷至沓来
编辑配置文件 vi /etc/config/uhttpd
config uhttpd 'main'
list listen_http '192.168.0.1:80' # 原来是 0.0.0.0,注意有些人的 ip 是 192.168.1.1 等,而且会变,改成自己对应的ip,而且自己要记住,否则后面自己忘了,ssh也关了,路由器就很难登录了
list listen_http '[::1]:80' # 原来是[::]:80
list listen_https '192.168.0.1:443'
list listen_https '[::1]:443'
使用 /etc/init.d/uhttpd restart 重启 uhttpd,再次使用 nmap 扫描 80 端口就没了。
问题二 DMZ 转发的端口,从外网无法基本全部不可用
- 排除法定位问题出在哪里
1.1 首先证明,我的服务是正常的
absh
局域网内的主机,无法访问 www.zyming.cn:5000 端口
ping www.zyming.cn 指向 180.111.103.62
局域网内的主机,可以 ping 通 www.zyming.cn 和 180.111.103.62
局域网内的主机,无法访问 180.111.103.62:5000 端口
虚拟服务器配置转发规则 5000 端口到内网 192.168.0.100:5000
局域网内的主机,可以访问 192.168.0.100:5000 端口 ## 服务正常
1.2 其次域名服务是正常的
手机不连局域网,直接手机网络上网
手机浏览器可以访问 https://www.zyming.cn:5000,可以看到群晖报错您所访问的页面不存在,证明可以连上群晖,只是不知道哪里有问题。手机群晖照片应用也不可以用。
手机可以访问 https://180.111.103.62:5000,可以登录群晖,手机群晖照片应用可以用。
手机可以使用 RD client (远程桌面,3389端口)远程控制 www.zyming.cn
手机可以使用 RD client (远程桌面,3389端口)远程控制 180.111.103.62
证明域名服务商没有封锁我的端口,外网访问正常。
证明路由器没有功能问题,DMZ 端口转发没有固件层面的问题。 - 怀疑方向1(方向错误)
目前有充足的理由怀疑路由器的的 iptables 规则设置有问题。
当添加一条虚拟服务器规则,iptables 就会出现以下四条规则。
bash
root@TP-LINK:~# iptables-save|grep 5000
-A postrouting_rule_vs -s 192.168.0.0/24 -d 192.168.0.100/32 -p tcp -m tcp --dport 35000 -m comment --comment home_synology -j SNAT --to-source 180.111.103.62
-A postrouting_rule_vs -s 192.168.0.0/24 -d 192.168.0.100/32 -p udp -m udp --dport 35000 -m comment --comment home_synology -j SNAT --to-source 180.111.103.62
-A prerouting_rule_vs -d 180.111.103.62/32 -p tcp -m tcp --dport 35000 -m comment --comment home_synology -j XDNAT --to-destination
-A prerouting_rule_vs -d 180.111.103.62/32 -p udp -m udp --dport 35000 -m comment --comment home_synology -j XDNAT --to-destination
root@TP-LINK:/etc# cat /proc/sys/net/ipv4/ip_forward
这个问题应该是网管圈或折腾 openwrt 的人非常熟悉的问题,也就是 nat 不能回流了。
原理如下:
“`text
主机A 192.168.0.3 访问主机B 121.237.44.219(内网192.168.0.2),需要经过路由C 192.168.0.1
原因:
第一步 192.168.0.3 访问 121.237.44.219 [src:192.168.0.3, dst:121.237.44.219]
第二步 192.168.0.1 替换目标 [src:192.168.0.3, dst:192.168.0.2]
第三步 192.168.0.2 接收数据 [src:192.168.0.3, dst:192.168.0.2]
第四步 192.168.0.2 返回 192.168.0.3 [src:192.168.0.2, dst:192.168.0.3]
第五步 192.168.0.3 收到返回,但是不是来自 121.237.44.219 [src:192.168.0.2, dst:192.168.0.3],所以丢弃掉包
第六步 192.168.0.2 一直等不到 192.168.0.2 响应
形成了三角访问,而不是A->C-B然后B->C->A
C
^
/ \
A <- B
去 A -> C -> B
回 B -> A
解决的关键:
在于让主机B发送数据给C,C再发送给A。
第一步 192.168.0.3 访问 121.237.44.219 [src:192.168.0.3, dst:121.237.44.219]
第二步 192.168.0.1 替换源和目标 [src:192.168.0.1, dst:192.168.0.2]
第三步 192.168.0.2 接收数据 [src:192.168.0.1, dst:192.168.0.2]
第四步 192.168.0.2 返回 192.168.0.1 [src:192.168.0.2, dst:192.168.0.1]
第五步 192.168.0.1 返回 192.168.0.3 [src:121.237.44.219, dst:192.168.0.3]
第六步 192.168.0.3 收到数据包,机器ip正确,成功
根据上面得出的结论,将 postrouting 相关规则的 --to-source 修改为网关地址,但是问题没有解决。仔细查看 iptables 规则,TP-LINK 添加了一条text
-A postrouting_rule_multi_nat -s 192.168.0.0/24 -o pe-wan1_poe -m comment –comment NAT_LAN_WAN1 -j MASQUERADE
“`
该条规则应该已经考虑到了这种三角访问的情况,所以上面的结论是错误的。
-
怀疑方向2(方向错误)
那么是不是在 filter 表做了限制?
我在 filter 表中找到相关的配置,发现并没有任何的限制。
text
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j forward
-A input -i br-lan -j zone_lan_input
-A input -i pe-wan1_poe -j zone_wan1_poe_input
-A forward -i br-lan -j zone_lan_forward # zone_lan_forward 是空
-A forward -i pe-wan1_poe -j zone_wan1_poe_forward
那么是不是 napt 配置有问题? -
怀疑方向3(方向错误) napt 的折腾过程
我看到网上有人通过配置一个出接口为 LAN 口的 napt 规则,解决了这个问题。可是我的路由器在配置 napt 的时候没有 LAN 的选项,只有 WAN。
尝试手动在以下配置文件中加入一条规则,无效。
“`text
root@TP-LINK:/etc/config# cat nat
config default ‘default’
option zones ‘LAN WAN1’
option prerouting ‘vs one_dmz dmz’
option postrouting ‘one_nat multi_nat vs’
list network ‘LAN-LAN’
list network ‘WAN1-WAN1’
config nat_global ‘global’
option enable ‘on’
config nat_alg
option pptp ‘on’
option l2tp ‘off’
option tftp ‘off’
option ftp ‘on’
option h323 ‘on’
option ipsec ‘on’
option sip ‘off’
config rule_napt
option name ‘NAT_LAN_WAN1’
option enable ‘on’
option mask ’24’
option interface ‘WAN1’
option sysrule ‘1’
option ipaddr ‘192.168.0.0’
config rule_vs
option name ‘home_synology’
option protocol ‘ALL’
option enable ‘on’
option external_port ‘35000’
option ipaddr ‘192.168.0.100’
option interface ‘WAN1’
option internal_port ‘35000’
# 这里新增了一个 nat
config rule_napt
option name ‘NAT_LAN_LAN1’
option enable ‘on’
option mask ’24’
option ipaddr ‘192.168.0.0’
option interface ‘LAN’
option sysrule ‘1’
是不是还有没有添加的地方?text
死马当活马医,尝试修改下管理页面的逻辑,放开这个路由器在配置 napt 时出接口的限制。虽然我知道这么做大概率没用,改了页面,后台没脚本支持,也是没用。
但是没其它思路,试试看吧。在路由器里面修改不方便,不好找要修改哪些位置,所以给它用 U 盘拷下来。插拔 U 盘,确认硬盘。`cat /proc/partitions`
root@TP-LINK:/www/webpages/pages/userrpm# cat /proc/partitions
major minor #blocks name
31 0 64 mtdblock0
31 1 128 mtdblock1
root@TP-LINK:/www/webpages/pages/userrpm#
major minor #blocks name
31 0 64 mtdblock0
31 1 128 mtdblock1
8 0 60538880 sda # 插 U 盘新增的分区,所以 U 盘是 /dev/sda
8 1 60537824 sda1
“`
尝试挂载 U 盘,发现 U 盘已经自动挂载到了 /home/ftp/volume1(害,做的都是无用功)。
执行命令打包管理页面。
bash
tar zcvf /home/ftp/volume1/www.tgz /www/
拿到PC上改代码,这就到了我们的强项了,快速找到几个限制出接口的地方,给他改掉(这里我有疑问,这些地方看起来是官方故意去掉不支持 lan 的,不知道是不是企业路由器都是这个逻辑)。
| 功能 | 代码文件 | 行号 |
|---|---|---|
| NAT设置 | www\webpages\pages\userrpm\napt.html | 321 |
| NAT-DMZ设置 | www\webpages\pages\userrpm\nat_dmz.html | 185 |
| 虚拟服务器设置 | www\webpages\pages\userrpm\virtual_server.html | 652 |
基本都长这个样子,把 if 判断注释掉。
javascript
for (i=0; i<data.normal.length; i++){
// if(data.normal[i].t_name != "LAN"){
interfaceItem.push({name:data.normal[i].t_name,value:data.normal[i].t_name});
// }
}
打开前台页面,此时能够在这几个地方选择出接口为 LAN 了,并且尝试添加 napt 和 虚拟服务器规则,发现后台都能生成相应的 napt 配置或 iptables 规则。

但是没有用,没有解决我的问题,而且看起来它生成的 LAN 口的规则还是错的,这下没法了,开启长考模式——睡觉。
- 怀疑方向4 rebind-protection(部分正确)
第二天醒来,想到(为什么才想到)既然是 openwrt,那么为什么不搜 openwrt 相关的问题。果然出来很多结果,其中就有人提到这个 openwrt 默认开启的安全相关的问题。
在我的场景下(局域网自己用),这个配置非常愚蠢,不再描述其含义,只说操作和结果。
首先,这个路由器没有 openwrt 系统中的配置,没有一个小框框,点一点就能关掉这个功能,但是因为它是 dnsmasq 的能力,因此可以通过如下方式关闭:
bash
vi /etc/config/dhcp # 配置文件的位置
config dnsmasq
option domainneeded '1'
option port '0'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '0' # 搜索 rebind_protection,将其从 1 修改为 0
/etc/init.d/dnsmasq restart # 重启
访问公网ip:端口,依旧无效。
焦灼。只能考虑 tcpdump 抓包了,不折腾的原则又要破坏了。但是这个路由器年限有点老,用的 barrier breaker 14.07 的源地址已经换了,下载下来 ipx 包直接本地安装发现装不上。
去看看官方有没有解决吧。找到了他们 2021 年发布的一个 2019 的升级包,好家伙,直接报错无法升级,开始对 TP-LINK 心生怨念。
- 猜猜怎么解决的,最后联系官方,他们给发了一个升级固件。
固件原理待分析。
备忘:iptables 四表五链
| raw | mangle | nat | filter | 四表 |
|---|---|---|---|---|
| prerouting | prerouting | prerouting | input | 五链 |
| output | postrouting | postrouting | forward | |
| input | output | output | ||
| output | input | |||
| forward |