TP-LINK WAR-2600L 路由器 DMZ 功能分析

TP-LINK 企业路由器奇怪的端口转发规则

问题

硬件型号TL-WAR2600L v2.0 企业路由器
固件版本1.0.1 Build 20180313 Rel.37492

本地150自提了这个路由器,准备用它的多 wan 口搞搞事情,但是没想到掉坑里了:

  1. 80, 443 端口使用宽带拨号的外网 ip 可以访问(不安全)
    1在局域网内输入外网宽带 ip,可以访问路由器管理界面;
    2但是在真正的外网上,比如手机不连局域网,访问宽带 ip,实际上又不能访问(我的 ip 是公网 ip)。 
    
  2. 虚拟服务器转发的端口,从外网无法基本全部不可用

分析过程

获取 ssh 端口号和密码,登录到路由器后台

  1. 系统工具-设备管理-备份与导入设置,导出一个 bin 文件。使用 7z 打开,查看如下路径 \backup-TP-LINK-2024-06-20\tmp\userconfig\etc\config\dropbear
    1config dropbear
    2    option PasswordAuth 'on'
    3    option RootPasswordAuth 'on'
    4    option Port '33400' # 这个就是端口
    5    option ssh_port_switch 'on'
    
  2. 在路由器管理页面 基本设置 - LAN设置 中获取 mac 地址,然后找一个 linux 命令行工具执行
    1## xx-xx-xx-xx-xx-xx 是你找到的 mac 地址。注意 -n
    2echo -n "xx-xx-xx-xx-xx-xx"|sed "s/-//g"|md5sum|cut -c 1-8
    3xxxxxxxx # 8位密码
    
    登录后我其实还没发现(因为我不折腾 openwrt,有群晖和一台2U机架服务器了,路由器我只追求稳定), 这个路由器用的是 openwrt barrier breaker(龙妈:我是 chain breaker) 14.07。 后来是在与它斗智斗勇的过程中,才发现它的真身。

问题逐一分析

问题一 80, 443 端口使用宽带拨号的外网 ip 可以访问(不安全)

由于看到了以下这两条规则,走 br-lan 网卡(lan口,局域网)的流量可以访问管理界面,走 pe-wan1-poe(外网)已经做了拒绝处理,因此可以认为是安全的。

1root@TP-LINK:~# iptables-save|grep remote_mngt_chain
2:remote_mngt_chain - [0:0]
3-A INPUT -j remote_mngt_chain
4-A remote_mngt_chain -i br-lan -p tcp -m multiport --dports 80,443,23,33400 -j ACCEPT
5-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
     1yu@kde:~$ nmap x.x.x.x -p-
     2Starting Nmap 7.80 ( https://nmap.org ) at xxxx-xx-xx xx:xx CST
     3Nmap scan report for x.x.x.x
     4Host is up (0.027s latency).
     5Not shown: 65527 closed ports
     6PORT      STATE    SERVICE
     71723/tcp  filtered pptp                # vpn 服务器
     81900/tcp  open     upnp                # upnp
     920002/tcp open     commtact-http       # tplink 的远程技术支持,其实不是 commtact-http
    1033400/tcp open     unknown             # ssh 端口
    11....                                   # 一些自己开的端口,略过
    12Nmap done: 1 IP address (1 host up) scanned in 4.66 seconds
    
  3. 万一不小心执行一些命令,如 iptables -X,把这条 iptables 规则给删了,在部分没有禁用 80 端口的地区,还是可以访问的
  4. 担心攻击不是杞人忧天,我的任何一台服务器,包括云服务器和家里面的服务器,每天都有成千上万条各种形式的攻击记录,现在的攻击手段完全自动和无差别攻击的,在你服务器部署后的数秒钟之内就会有各种攻击纷至沓来

编辑配置文件 vi /etc/config/uhttpd

1config uhttpd 'main'
2        list listen_http '192.168.0.1:80' # 原来是 0.0.0.0,注意有些人的 ip 是 192.168.1.1 等,而且会变,改成自己对应的ip,而且自己要记住,否则后面自己忘了,ssh也关了,路由器就很难登录了
3        list listen_http '[::1]:80'       # 原来是[::]:80
4        list listen_https '192.168.0.1:443'
5        list listen_https '[::1]:443'

使用 /etc/init.d/uhttpd restart 重启 uhttpd,再次使用 nmap 扫描 80 端口就没了。

问题二 DMZ 转发的端口,从外网无法基本全部不可用

  1. 排除法定位问题出在哪里
    1.1 首先证明,我的服务是正常的

    局域网内的主机,无法访问 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 端口转发没有固件层面的问题。
    
  2. 怀疑方向1(方向错误)
    目前有充足的理由怀疑路由器的的 iptables 规则设置有问题。
    当添加一条虚拟服务器规则,iptables 就会出现以下四条规则。

    1root@TP-LINK:~# iptables-save|grep 5000
    2-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
    3-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
    4-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
    5-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
    6root@TP-LINK:/etc# cat /proc/sys/net/ipv4/ip_forward
    

    这个问题应该是网管圈或折腾 openwrt 的人非常熟悉的问题,也就是 nat 不能回流了。

    原理如下:

     1主机A 192.168.0.3 访问主机B 121.237.44.219(内网192.168.0.2),需要经过路由C 192.168.0.1
     2原因:
     3第一步 192.168.0.3 访问     121.237.44.219              [src:192.168.0.3, dst:121.237.44.219]
     4第二步 192.168.0.1 替换目标                              [src:192.168.0.3, dst:192.168.0.2]
     5第三步 192.168.0.2 接收数据                              [src:192.168.0.3, dst:192.168.0.2]
     6第四步 192.168.0.2 返回     192.168.0.3                 [src:192.168.0.2, dst:192.168.0.3]
     7第五步 192.168.0.3 收到返回,但是不是来自 121.237.44.219    [src:192.168.0.2, dst:192.168.0.3],所以丢弃掉包
     8第六步 192.168.0.2 一直等不到 192.168.0.2 响应
     9形成了三角访问,而不是A->C-B然后B->C->A
    10   C   
    11   ^
    12 /   \
    13A  <-  B
    14
    15去 A -> C -> B
    16回 B -> A
    17
    18解决的关键:
    19在于让主机B发送数据给C,C再发送给A。
    20
    21第一步 192.168.0.3 访问     121.237.44.219              [src:192.168.0.3, dst:121.237.44.219]
    22第二步 192.168.0.1 替换源和目标                           [src:192.168.0.1, dst:192.168.0.2]
    23第三步 192.168.0.2 接收数据                              [src:192.168.0.1, dst:192.168.0.2]
    24第四步 192.168.0.2 返回     192.168.0.1                 [src:192.168.0.2, dst:192.168.0.1]
    25第五步 192.168.0.1 返回     192.168.0.3                 [src:121.237.44.219, dst:192.168.0.3]
    26第六步 192.168.0.3 收到数据包,机器ip正确,成功
    

    根据上面得出的结论,将 postrouting 相关规则的 –to-source 修改为网关地址,但是问题没有解决。仔细查看 iptables 规则,TP-LINK 添加了一条

    1-A postrouting_rule_multi_nat -s 192.168.0.0/24 -o pe-wan1_poe -m comment --comment NAT_LAN_WAN1 -j MASQUERADE
    

    该条规则应该已经考虑到了这种三角访问的情况,所以上面的结论是错误的。

  3. 怀疑方向2(方向错误) 那么是不是在 filter 表做了限制? 我在 filter 表中找到相关的配置,发现并没有任何的限制。

    1-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    2-A FORWARD -j forward
    3-A input -i br-lan -j zone_lan_input
    4-A input -i pe-wan1_poe -j zone_wan1_poe_input
    5-A forward -i br-lan -j zone_lan_forward # zone_lan_forward 是空
    6-A forward -i pe-wan1_poe -j zone_wan1_poe_forward
    

    那么是不是 napt 配置有问题?

  4. 怀疑方向3(方向错误) napt 的折腾过程 我看到网上有人通过配置一个出接口为 LAN 口的 napt 规则,解决了这个问题。可是我的路由器在配置 napt 的时候没有 LAN 的选项,只有 WAN。 尝试手动在以下配置文件中加入一条规则,无效。

     1root@TP-LINK:/etc/config# cat nat
     2
     3config default 'default'
     4	option zones 'LAN WAN1'
     5	option prerouting 'vs one_dmz dmz'
     6	option postrouting 'one_nat multi_nat vs'
     7	list network 'LAN-LAN'
     8	list network 'WAN1-WAN1'
     9
    10config nat_global 'global'
    11	option enable 'on'
    12
    13config nat_alg
    14	option pptp 'on'
    15	option l2tp 'off'
    16	option tftp 'off'
    17	option ftp 'on'
    18	option h323 'on'
    19	option ipsec 'on'
    20	option sip 'off'
    21
    22config rule_napt
    23	option name 'NAT_LAN_WAN1'
    24	option enable 'on'
    25	option mask '24'
    26	option interface 'WAN1'
    27	option sysrule '1'
    28	option ipaddr '192.168.0.0'
    29
    30config rule_vs
    31	option name 'home_synology'
    32	option protocol 'ALL'
    33	option enable 'on'
    34	option external_port '35000'
    35	option ipaddr '192.168.0.100'
    36	option interface 'WAN1'
    37	option internal_port '35000'
    38# 这里新增了一个 nat
    39config rule_napt
    40	option name 'NAT_LAN_LAN1'
    41	option enable 'on'
    42	option mask '24'
    43	option ipaddr '192.168.0.0'
    44	option interface 'LAN'
    45	option sysrule '1'
    

    是不是还有没有添加的地方? 死马当活马医,尝试修改下管理页面的逻辑,放开这个路由器在配置 napt 时出接口的限制。虽然我知道这么做大概率没用,改了页面,后台没脚本支持,也是没用。 但是没其它思路,试试看吧。在路由器里面修改不方便,不好找要修改哪些位置,所以给它用 U 盘拷下来。插拔 U 盘,确认硬盘。cat /proc/partitions

     1root@TP-LINK:/www/webpages/pages/userrpm# cat /proc/partitions 
     2major minor  #blocks  name
     3
     4  31        0         64 mtdblock0
     5  31        1        128 mtdblock1
     6root@TP-LINK:/www/webpages/pages/userrpm# 
     7major minor  #blocks  name
     8
     9  31        0         64 mtdblock0
    10  31        1        128 mtdblock1
    11   8        0   60538880 sda  # 插 U 盘新增的分区,所以 U 盘是 /dev/sda
    12   8        1   60537824 sda1
    

    尝试挂载 U 盘,发现 U 盘已经自动挂载到了 /home/ftp/volume1(害,做的都是无用功)。

    执行命令打包管理页面。

    1tar zcvf /home/ftp/volume1/www.tgz /www/
    

    拿到PC上改代码,这就到了我们的强项了,快速找到几个限制出接口的地方,给他改掉(这里我有疑问,这些地方看起来是官方故意去掉不支持 lan 的,不知道是不是企业路由器都是这个逻辑)。

    功能代码文件行号
    NAT设置www\webpages\pages\userrpm\napt.html321
    NAT-DMZ设置www\webpages\pages\userrpm\nat_dmz.html185
    虚拟服务器设置www\webpages\pages\userrpm\virtual_server.html652

    基本都长这个样子,把 if 判断注释掉。

    1for (i=0; i<data.normal.length; i++){
    2    // if(data.normal[i].t_name != "LAN"){
    3        interfaceItem.push({name:data.normal[i].t_name,value:data.normal[i].t_name});
    4	   // }
    5}
    

    打开前台页面,此时能够在这几个地方选择出接口为 LAN 了,并且尝试添加 napt 和 虚拟服务器规则,发现后台都能生成相应的 napt 配置或 iptables 规则。

    20240621-tplink-1.png

    但是没有用,没有解决我的问题,而且看起来它生成的 LAN 口的规则还是错的,这下没法了,开启长考模式——睡觉。

  5. 怀疑方向4 rebind-protection(部分正确) 第二天醒来,想到(为什么才想到)既然是 openwrt,那么为什么不搜 openwrt 相关的问题。果然出来很多结果,其中就有人提到这个 openwrt 默认开启的安全相关的问题。 在我的场景下(局域网自己用),这个配置非常愚蠢,不再描述其含义,只说操作和结果。 首先,这个路由器没有 openwrt 系统中的配置,没有一个小框框,点一点就能关掉这个功能,但是因为它是 dnsmasq 的能力,因此可以通过如下方式关闭:

    1vi /etc/config/dhcp # 配置文件的位置
    2config dnsmasq
    3     option domainneeded '1'
    4     option port '0'
    5     option boguspriv '1'
    6     option filterwin2k '0'
    7     option localise_queries '1'
    8     option rebind_protection '0' # 搜索 rebind_protection,将其从 1 修改为 0
    9/etc/init.d/dnsmasq restart # 重启
    

    访问公网ip:端口,依旧无效。

    焦灼。只能考虑 tcpdump 抓包了,不折腾的原则又要破坏了。但是这个路由器年限有点老,用的 barrier breaker 14.07 的源地址已经换了,下载下来 ipx 包直接本地安装发现装不上。

    去看看官方有没有解决吧。找到了他们 2021 年发布的一个 2019 的升级包,好家伙,直接报错无法升级,开始对 TP-LINK 心生怨念。

  6. 猜猜怎么解决的,最后联系官方,他们给发了一个升级固件。 固件原理待分析。

备忘:iptables 四表五链

rawmanglenatfilter四表
preroutingpreroutingpreroutinginput五链
outputpostroutingpostroutingforward
inputoutputoutput
outputinput
forward