老毛子padavan实现修改自定义ssh端口和ipv6外网访问


前言

本文目的:padavan下,自定义 SSH 端口 并实现 ipv6 外网访问

本文记录于 2022年4月10日,随着固件更新可能会存在变动。

最近在倒腾路由器固件,使用的是 hiboy 大的 padavan 固件。

在 WebUI 中,可以启用内网下 22 端口的服务,并通过端口转发实现 ipv4 下的外网访问,但是 ipv6 暂时不行。


一、WebUI 中现有的相关选项

像路由器这种设备的 SSH服务 通常是由 dropbear 提供的,默认端口是22。

1 高级设置 - 系统管理 - 服务 - 终端服务

这里可以启用 SSH 服务。
启用SSH服务设置
根据我的理解,WebUI 的设置是通过 /usr/bin/sshd.sh 实现其功能的,这里截取startstop 两部分:

#!/bin/sh
...

func_start()
{
	key_a=""
	key_s=""
	key_4=""

	[ ! -d "$dir_storage" ] && mkdir -p -m 755 $dir_storage

	old_pattern="/etc/storage/dropbear_"
	for i in rsa_host_key dss_host_key ecdsa_host_key ; do
		[ -f "${old_pattern}_${i}" ] && mv -n "${old_pattern}_${i}" "$dir_storage/${i}"
	done

	if [ ! -f "$rsa_key" ] || [ ! -f "$dss_key" ] ; then
		func_createkeys
	fi

	if [ ! -f "$ecdsa_key" ] ; then
		/usr/bin/dropbearkey -t ecdsa -f "$ecdsa_key"
		chmod 600 "$ecdsa_key"
	fi

	if [ "$1" == "1" ] ; then
		key_s="-s"
	fi
	if [ "$2" == "1" ] ; then
		key_a="-a"
	fi

	ip6_service=`nvram get ip6_service`
	if [ -z "$ip6_service" ] && [ -d /proc/sys/net/ipv6 ] ; then
		key_4="-4"
	fi

	/usr/sbin/dropbear $key_4 $key_s $key_a
}

func_stop()
{
	killall -q dropbear
}
...

可以看到脚本并没有提供自定义端口的功能,而且 usr 分区是只读的,我们不在这部分做文章。

2 高级设置 - 防火墙 - 通用设置 - 从外网访问路由器服务

这里提供端口转发服务,但仅限于 ipv4。

似乎是因为 padavan 不支持 ipv6 的 NAT6,查了一圈测试了以下命令

>> ip6tables -t nat -I PREROUTING -p tcp --dport 10022 -j REDIRECT --to-port 22
ip6tables v1.4.16.3: unknown option "--to-port"
>> ip6tables -t nat -I PREROUTING -p tcp --dport 10022 -j REDIRECT --to-destination [fe80::1]:22
ip6tables v1.4.16.3: unknown option "--to-destination"

蛋疼。有个 nat66 我也不知道怎么用。

接着整,打开选项,可以看到默认转发端口为 10022 (由defaults.c@rt-n56u定义)
防火墙设置

二、自定义ssh端口

1 关掉 一定要关掉

关闭 SSH 服务
关闭SSH服务
关闭防火墙 SSH 转发选项

关闭防火墙SSH转发

2 通过脚本实现功能

定位到 高级设置 - 自定义设置 - 脚本 - 在防火墙规则启动后执行
修改post firewall脚本

在logger前的空白行添加内容

killall -q dropbear
/usr/sbin/dropbear -p 10022

iptables -A INPUT -p tcp --dport 10022 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH_blacklist -j DROP
iptables -A INPUT -p tcp --dport 10022 -m state --state NEW -m recent --name SSH_blacklist --set -j ACCEPT

ip6tables -A INPUT -p tcp --dport 10022 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH_blacklist6 -j DROP
ip6tables -A INPUT -p tcp --dport 10022 -m state --state NEW -m recent --name SSH_blacklist6 --set -j ACCEPT


添加脚本后

脚本实现的功能:

  1. 按指定端口重启 dropbear
  2. 打开v4+v6外网端口访问
  3. 通过限制一定时间段内的连接次数,防止DOS攻击(不判断密码是否正确,不适用频繁重连的场景)

此处 recent 模块的使用,参考 Iptables 之 recent 模块小结 中的案例2。


总结

  1. 关掉 WebUI 的。
  2. 通过脚本实现功能增项。
在NSL-KDD数据集中,包含了许多字符串类型的特征,例如“protocol_type”,“service”,“flag”等等。这些字符串特征需要被转换成数字标签,方便后续的机器学习算法使用。下面是一个将NSL-KDD中的字符串特征转换成数字标签的示例代码: ```python import pandas as pd # 读取NSL-KDD数据集 data = pd.read_csv('kddcup.csv', header=None) # 将字符串特征转换成数字标签 service_mapping = {'aol': 1, 'auth': 2, 'bgp': 3, 'courier': 4, 'csnet_ns': 5, 'ctf': 6, 'daytime': 7, 'discard': 8, 'domain': 9, 'domain_u': 10, 'echo': 11, 'eco_i': 12, 'ecr_i': 13, 'efs': 14, 'exec': 15, 'finger': 16, 'ftp': 17, 'ftp_data': 18, 'gopher': 19, 'harvest': 20, 'hostnames': 21, 'http': 22, 'http_2784': 23, 'http_443': 24, 'http_8001': 25, 'imap4': 26, 'IRC': 27, 'iso_tsap': 28, 'klogin': 29, 'kshell': 30, 'ldap': 31, 'link': 32, 'login': 33, 'mtp': 34, 'name': 35, 'netbios_dgm': 36, 'netbios_ns': 37, 'netbios_ssn': 38, 'netstat': 39, 'nnsp': 40, 'nntp': 41, 'ntp_u': 42, 'other': 43, 'pm_dump': 44, 'pop_2': 45, 'pop_3': 46, 'printer': 47, 'private': 48, 'red_i': 49, 'remote_job': 50, 'rje': 51, 'shell': 52, 'smtp': 53, 'sql_net': 54, 'ssh': 55, 'sunrpc': 56, 'supdup': 57, 'systat': 58, 'telnet': 59, 'tftp_u': 60, 'tim_i': 61, 'time': 62, 'urh_i': 63, 'urp_i': 64, 'uucp': 65, 'uucp_path': 66, 'vmnet': 67, 'whois': 68, 'X11': 69, 'Z39_50': 70} data[1] = data[1].map(service_mapping) protocol_mapping = {'tcp': 1, 'udp': 2, 'icmp': 3} data[2] = data[2].map(protocol_mapping) flag_mapping = {'OTH': 1, 'REJ': 2, 'RSTO': 3, 'RSTOS0': 4, 'RSTR': 5, 'S0': 6, 'S1': 7, 'S2': 8, 'S3': 9, 'SF': 10, 'SH': 11} data[3] = data[3].map(flag_mapping) # 输出转换后的数据 print(data.head()) ``` 在上面的代码中,我们使用了字典(mapping)的方式将字符串特征转换成数字标签。例如,将“service”特征中的“ftp”转换成数字标签17。最终输出的数据是一个经过转换的数据集,其中字符串特征已经被转换成了数字标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值