自动更新TP-Link虚拟服务器端口映射策略(IPv6)
通过相应脚本和定时任务配合,实现白天启用22、3389端口的 TCP 访问,晚上22点启用22、3389端口的 UDP 访问,变相实现白天开启 SSH、RDP 登录,晚上关闭SSH登录(解析:SSH 和 RDP 使用的是 TCP 协议,使用 UDP 协议无法访问)。
update_firewall_22_tcp.sh
#!/bin/bash
ROUTER_IP="192.168.1.1"
PASSWORD="qKL8r6vPPH9fbwK"
LOGIN_PAYLOAD="{\"method\":\"do\",\"login\":{\"password\":\"$PASSWORD\"}}"
# 获取 stok
RESPONSE=$(curl -s -X POST http://$ROUTER_IP/ \
-H "Accept: application/json, text/javascript, */*; q=0.01" \
-H "Accept-Encoding: gzip, deflate" \
-H "Accept-Language: zh-CN,zh;q=0.9" \
-H "Cache-Control: no-cache" \
-H "Connection: keep-alive" \
-H "Content-Type: application/json; charset=UTF-8" \
-H "Origin: http://$ROUTER_IP" \
-H "Pragma: no-cache" \
-H "Referer: http://$ROUTER_IP/" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
-H "X-Requested-With: XMLHttpRequest" \
--data "$LOGIN_PAYLOAD")
# 提取 stok
STOK=$(echo $RESPONSE | grep -oP '(?<="stok":")[^"]+')
# 检查是否成功获取 stok
if [ -z "$STOK" ]; then
echo "Failed to get stok."
exit 1
fi
#echo "Successfully obtained stok: $STOK"
# 获取 jump IPv6
IPv6_jump_ssh=$(/usr/sbin/ip -6 addr show | awk '/inet6 / {gsub(/\/.*$/, "", $2); print length($2), $2}' | sort -nrk1 | head -n1 | awk '{print $2}')
if [ ! -e /usr/local/bin/IPv6_jump_ssh.txt ];then
touch /usr/local/bin/IPv6_jump_ssh.txt
fi
IPv6_jump_ssh_old=$(cat /usr/local/bin/IPv6_jump_ssh.txt)
# 创建 JSON payload 文件
cat <<EOF > payload_firewall_get.json
{
"firewall": {
"table": "redirect"
},
"system": {
"name": "sys_mode"
},
"port_manage": {
"table": "mwan"
},
"method": "get"
}
EOF
# 使用获取到的 stok 进行后续请求
URL="http://$ROUTER_IP/stok=$STOK/ds"
RESPONSE1=$(curl -s -X POST $URL \
-H "Accept: application/json, text/javascript, */*; q=0.01" \
-H "Accept-Encoding: gzip, deflate" \
-H "Accept-Language: zh-CN,zh;q=0.9" \
-H "Cache-Control: no-cache" \
-H "Connection: keep-alive" \
-H "Content-Type: application/json; charset=UTF-8" \
-H "Origin: http://$ROUTER_IP" \
-H "Pragma: no-cache" \
-H "Referer: http://$ROUTER_IP/" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
-H "X-Requested-With: XMLHttpRequest" \
--data @payload_firewall_get.json)
echo $RESPONSE1 | jq '.firewall.redirect[0]' | grep -i 'udp' &> /dev/null
redirect1_ssh_flag=$?
if [ "$IPv6_jump_ssh" != "$IPv6_jump_ssh_old" ] || [ "$redirect1_ssh_flag" == 0 ]; then
# 创建 JSON payload 文件
cat <<EOF > payload_update_firewall_22_tcp.json
{
"firewall": {
"redirect_1": {
"proto": "tcp",
"src_dport_start": 52322,
"src_dport_end": 52322,
"dest_port": 22,
"wan_port": 0,
"dest_ip": "",
"dest_ip6": "$IPv6_jump_ssh"
}
},
"method": "set"
}
EOF
RESPONSE2=$(curl -s -X POST $URL \
-H "Accept: application/json, text/javascript, */*; q=0.01" \
-H "Accept-Encoding: gzip, deflate" \
-H "Accept-Language: zh-CN,zh;q=0.9" \
-H "Cache-Control: no-cache" \
-H "Connection: keep-alive" \
-H "Content-Type: application/json; charset=UTF-8" \
-H "Origin: http://$ROUTER_IP" \
-H "Pragma: no-cache" \
-H "Referer: http://$ROUTER_IP/" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
-H "X-Requested-With: XMLHttpRequest" \
--data @payload_update_firewall_22_tcp.json)
echo -n $IPv6_jump_ssh > /usr/local/bin/IPv6_jump_ssh.txt
date >> /var/log/update_firewall_22_tcp.log
echo "Firewall: TCP WAN-52322 -> LAN-22 ${IPv6_jump_ssh} updated!" &>> /var/log/update_firewall_22_tcp.log
echo >> /var/log/update_firewall_22_tcp.log
fiupdate_firewall_3389_tcp.sh
update_firewall_22_3389_udp.sh
权限设置
定时任务
Last updated