An extra option (AllowedClientIPs:list) is available to allow
specific clients to use this service.

v2: do not create the firewall data if there is no valid interface.

Signed-off-by: Pierre Lebleu <pme.leb...@gmail.com>
---
 .../network/services/dropbear/files/dropbear.init  | 49 ++++++++++++++++++++--
 1 file changed, 46 insertions(+), 3 deletions(-)

diff --git a/package/network/services/dropbear/files/dropbear.init 
b/package/network/services/dropbear/files/dropbear.init
index 2225113..38cb674 100755
--- a/package/network/services/dropbear/files/dropbear.init
+++ b/package/network/services/dropbear/files/dropbear.init
@@ -43,15 +43,41 @@ validate_section_dropbear()
                'IdleTimeout:uinteger:0' \
                'MaxAuthTries:uinteger:3' \
                'RecvWindowSize:uinteger:0' \
+               'AllowedClientIPs:list(ipaddr)' \
                'mdns:bool:1'
 }
 
+add_fw_rules()
+{
+       local intf="$1"
+       local port="$2"
+       local client="$3"
+
+       [ -z "${intf}" ] && return
+       local zone=$(fw3 -q network "${intf}")
+       [ -z "${zone}" ] && return
+
+       json_add_array firewall
+
+       json_add_object ""
+       json_add_string type rule
+       json_add_string src "${zone}"
+       json_add_string proto tcp
+       json_add_string dest_port "${port}"
+       [ -n "${client}" ] && json_add_string src_ip "${client}"
+       json_add_string target ACCEPT
+       json_close_object
+
+       json_close_array
+}
+
 dropbear_instance()
 {
        local PasswordAuth enable Interface GatewayPorts \
                RootPasswordAuth RootLogin rsakeyfile \
                BannerFile Port SSHKeepAlive IdleTimeout \
-               MaxAuthTries RecvWindowSize mdns ipaddrs
+               MaxAuthTries RecvWindowSize AllowedClientIPs \
+               mdns ipaddrs
 
        validate_section_dropbear "${1}" || {
                echo "validation failed"
@@ -69,7 +95,8 @@ dropbear_instance()
        PIDCOUNT="$(( ${PIDCOUNT} + 1))"
        local pid_file="/var/run/${NAME}.${PIDCOUNT}.pid"
 
-       procd_open_instance
+       procd_open_instance "${1}"
+
        procd_set_param command "$PROG" -F -P "$pid_file"
        [ "${PasswordAuth}" -eq 0 ] && procd_append_param command -s
        [ "${GatewayPorts}" -eq 1 ] && procd_append_param command -a
@@ -83,8 +110,20 @@ dropbear_instance()
        [ "${MaxAuthTries}" -ne 0 ] && procd_append_param command -T 
"${MaxAuthTries}"
        [ "${RecvWindowSize}" -gt 0 -a "${RecvWindowSize}" -le 1048576 ] && \
                procd_append_param command -W "${RecvWindowSize}"
-       [ "${mdns}" -ne 0 ] && procd_add_mdns "ssh" "tcp" "$Port" 
"daemon=dropbear"
        procd_set_param respawn
+
+       procd_open_data
+
+       [ "${mdns}" -ne 0 ] && {
+               json_add_object "mdns"
+               procd_add_mdns_service "ssh" "tcp" "$Port" "daemon=dropbear"
+               json_close_object
+       }
+
+       add_fw_rules "${Interface}" "${Port}" "${AllowedClientIPs}"
+
+       procd_close_data
+
        procd_close_instance
 }
 
@@ -130,6 +169,10 @@ start_service()
        config_foreach dropbear_instance dropbear
 }
 
+service_started() {
+       procd_set_config_changed firewall
+}
+
 service_triggers()
 {
        local interfaces
-- 
1.9.1


_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to