mirror of
https://salsa.debian.org/debian/knockd
synced 2026-09-13 11:34:52 +00:00
New upstream version 0.8
This commit is contained in:
+52
-26
@@ -13,10 +13,9 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -36,11 +35,15 @@
|
||||
#include <getopt.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
static char version[] = "0.7";
|
||||
static char version[] = "0.8";
|
||||
|
||||
#define PROTO_TCP 1
|
||||
#define PROTO_UDP 2
|
||||
|
||||
#define IP_DEFAULT AF_UNSPEC
|
||||
#define IP_V4 AF_INET
|
||||
#define IP_V6 AF_INET6
|
||||
|
||||
/* function prototypes */
|
||||
void vprint(char *fmt, ...);
|
||||
void ver();
|
||||
@@ -49,13 +52,17 @@ void usage();
|
||||
int o_verbose = 0;
|
||||
int o_udp = 0;
|
||||
int o_delay = 0;
|
||||
int o_ip = IP_DEFAULT;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int sd;
|
||||
struct hostent* host;
|
||||
struct sockaddr_in addr;
|
||||
int opt, optidx = 1;
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *infoptr;
|
||||
char ipname[256];
|
||||
int result;
|
||||
char *hostname;
|
||||
static struct option opts[] =
|
||||
{
|
||||
{"verbose", no_argument, 0, 'v'},
|
||||
@@ -63,10 +70,12 @@ int main(int argc, char** argv)
|
||||
{"delay", required_argument, 0, 'd'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"version", no_argument, 0, 'V'},
|
||||
{"ipv4", no_argument, 0, '4'},
|
||||
{"ipv6", no_argument, 0, '6'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
while((opt = getopt_long(argc, argv, "vud:hV", opts, &optidx))) {
|
||||
while((opt = getopt_long(argc, argv, "vud:hV46", opts, &optidx))) {
|
||||
if(opt < 0) {
|
||||
break;
|
||||
}
|
||||
@@ -76,6 +85,8 @@ int main(int argc, char** argv)
|
||||
case 'u': o_udp = 1; break;
|
||||
case 'd': o_delay = (int)atoi(optarg); break;
|
||||
case 'V': ver();
|
||||
case '4': o_ip = IP_V4; break;
|
||||
case '6': o_ip = IP_V6; break;
|
||||
case 'h': /* fallthrough */
|
||||
default: usage();
|
||||
}
|
||||
@@ -89,18 +100,19 @@ int main(int argc, char** argv)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
host = gethostbyname(argv[optind++]);
|
||||
if(host == NULL) {
|
||||
fprintf(stderr, "Cannot resolve hostname\n");
|
||||
exit(1);
|
||||
}
|
||||
/* prepare hints to select ipv4 or v6 if asked */
|
||||
memset(&hints, 0, sizeof hints);
|
||||
hints.ai_family = o_ip;
|
||||
hostname = argv[optind++];
|
||||
|
||||
for(; optind < argc; optind++) {
|
||||
unsigned short port, proto = PROTO_TCP;
|
||||
unsigned short proto = PROTO_TCP;
|
||||
const char *port;
|
||||
char *ptr, *arg = strdup(argv[optind]);
|
||||
|
||||
if((ptr = strchr(arg, ':'))) {
|
||||
*ptr = '\0';
|
||||
port = atoi(arg);
|
||||
port = arg;
|
||||
arg = ++ptr;
|
||||
if(!strcmp(arg, "udp")) {
|
||||
proto = PROTO_UDP;
|
||||
@@ -108,18 +120,27 @@ int main(int argc, char** argv)
|
||||
proto = PROTO_TCP;
|
||||
}
|
||||
} else {
|
||||
port = atoi(arg);
|
||||
port = arg;
|
||||
}
|
||||
|
||||
/* get host and port based on hints */
|
||||
result = getaddrinfo(hostname, port, &hints, &infoptr);
|
||||
if(result) {
|
||||
fprintf(stderr, "Failed to resolve hostname '%s' on port %s\n", hostname, port);
|
||||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(result));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* create socket */
|
||||
if(o_udp || proto == PROTO_UDP) {
|
||||
sd = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
sd = socket(infoptr->ai_family, SOCK_DGRAM, 0);
|
||||
if(sd == -1) {
|
||||
fprintf(stderr, "Cannot open socket\n");
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
int flags;
|
||||
sd = socket(PF_INET, SOCK_STREAM, 0);
|
||||
sd = socket(infoptr->ai_family, SOCK_STREAM, 0);
|
||||
if(sd == -1) {
|
||||
fprintf(stderr, "Cannot open socket\n");
|
||||
exit(1);
|
||||
@@ -127,19 +148,22 @@ int main(int argc, char** argv)
|
||||
flags = fcntl(sd, F_GETFL, 0);
|
||||
fcntl(sd, F_SETFL, flags | O_NONBLOCK);
|
||||
}
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_addr.s_addr = *((long*)host->h_addr_list[0]);
|
||||
addr.sin_port = htons(port);
|
||||
|
||||
/* extract ip as string (v4 or v6) */
|
||||
getnameinfo(infoptr->ai_addr, infoptr->ai_addrlen, ipname, sizeof(ipname), NULL, 0, NI_NUMERICHOST);
|
||||
|
||||
/* connect or send UDP packet */
|
||||
if(o_udp || proto == PROTO_UDP) {
|
||||
vprint("hitting udp %s:%u\n", inet_ntoa(addr.sin_addr), port);
|
||||
sendto(sd, "", 1, 0, (struct sockaddr*)&addr, sizeof(addr));
|
||||
vprint("hitting udp %s:%s\n", ipname, port);
|
||||
sendto(sd, "", 1, 0, infoptr->ai_addr, infoptr->ai_addrlen);
|
||||
} else {
|
||||
vprint("hitting tcp %s:%u\n", inet_ntoa(addr.sin_addr), port);
|
||||
connect(sd, (struct sockaddr*)&addr, sizeof(struct sockaddr));
|
||||
vprint("hitting tcp %s:%s\n", ipname, port);
|
||||
connect(sd, infoptr->ai_addr, infoptr->ai_addrlen);
|
||||
}
|
||||
|
||||
close(sd);
|
||||
usleep(1000*o_delay);
|
||||
freeaddrinfo(infoptr);
|
||||
}
|
||||
|
||||
return(0);
|
||||
@@ -161,6 +185,8 @@ void usage() {
|
||||
printf("options:\n");
|
||||
printf(" -u, --udp make all ports hits use UDP (default is TCP)\n");
|
||||
printf(" -d, --delay <t> wait <t> milliseconds between port hits\n");
|
||||
printf(" -4, --ipv4 Force usage of IPv4\n");
|
||||
printf(" -6, --ipv6 Force usage of IPv6\n");
|
||||
printf(" -v, --verbose be verbose\n");
|
||||
printf(" -V, --version display version\n");
|
||||
printf(" -h, --help this help\n");
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Original version to add non-duplicated rules by Greg Kuchyt (greg.kuchyt@gmail.com)
|
||||
# Updated to handle deletes and be generic by Paul Rogers (paul.rogers@flumps.org)
|
||||
|
||||
SCRIPT_NAME=$(basename $0)
|
||||
|
||||
AWK="/bin/awk"
|
||||
GREP="/bin/grep"
|
||||
IPTABLES="/sbin/iptables"
|
||||
SORT="/bin/sort"
|
||||
|
||||
COMMENT_APP="Append "
|
||||
COMMENT_DEL="Delete "
|
||||
COMMENT_INS="Insert "
|
||||
COMMENT_DEFAULT="by knockd"
|
||||
|
||||
IPT_CHAIN="INPUT"
|
||||
IPT_METHOD=""
|
||||
IPT_COMMENT=""
|
||||
IPT_SRC_IP=""
|
||||
IPT_DST_PORT=""
|
||||
IPT_PROTO="tcp"
|
||||
IPT_RULE_TARGET="ACCEPT"
|
||||
|
||||
DRY_RUN=0
|
||||
SEEN=0
|
||||
VERBOSE=0
|
||||
|
||||
usage() {
|
||||
echo "Usage: $SCRIPT_NAME -a|-i|-x -f SRC_IP_ADDR -d DST_PORT [-p|-c|-m|-t|-h|-v]"
|
||||
echo "Options:"
|
||||
echo "-a|--append Action: append a rule to NetFilter"
|
||||
echo "-i|--insert Action: insert a rule to NetFiler"
|
||||
echo "-x|--delete Action: delete a rule from NetFilter"
|
||||
echo "-f|--srcaddr The source IP address to be used"
|
||||
echo "-d|--dstport The destination port to be used in the rule"
|
||||
echo "-p|--proto The protocol that the rule applies to; default: $IPT_PROTO"
|
||||
echo "-c|--chain The NetFilter chain to apply the change to; default: $IPT_CHAIN"
|
||||
echo "-m|--comment Overide default comment text: '$COMMENT_DEFAULT'"
|
||||
echo "-t|--test Test run - don't actually perform an update to NetFilter"
|
||||
echo "-h|--help Print this informational screen and exit"
|
||||
echo "-v|--verbose Print verbose information about actions"
|
||||
}
|
||||
|
||||
ARGS=$(getopt -o aixf:d:p:c:m::thv -l "append,insert,delete,srcaddr:,dstport:,proto:,chain:,comment::,test,help,verbose" -n $SCRIPT_NAME -- "$@")
|
||||
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
echo "$SCRIPT_NAME - Error! Invalid arguments"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
eval set -- "$ARGS"
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
-a|--append)
|
||||
IPT_METHOD="-A"
|
||||
shift;
|
||||
;;
|
||||
-x|--delete)
|
||||
IPT_METHOD="-D"
|
||||
shift;
|
||||
;;
|
||||
-i|--insert)
|
||||
IPT_METHOD="-I"
|
||||
shift;
|
||||
;;
|
||||
-f|--srcaddr)
|
||||
IPT_SRC_IP=$2
|
||||
shift 2;
|
||||
;;
|
||||
-d|--dstport)
|
||||
IPT_DST_PORT=$2
|
||||
shift 2;
|
||||
;;
|
||||
-p|--proto)
|
||||
IPT_PROTO=$2
|
||||
shift 2;
|
||||
;;
|
||||
-c|--chain)
|
||||
IPT_CHAIN=$2
|
||||
shift 2;
|
||||
;;
|
||||
-m|--comment)
|
||||
case "$2" in
|
||||
"")
|
||||
IPT_COMMENT=$COMMENT_DEFAULT;
|
||||
shift 2;;
|
||||
*)
|
||||
IPT_COMMENT=$2;
|
||||
shift 2 ;;
|
||||
esac
|
||||
;;
|
||||
-t|--test)
|
||||
DRY_RUN=1
|
||||
shift;
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
shift;
|
||||
exit
|
||||
;;
|
||||
-v|--verbose)
|
||||
VERBOSE=1
|
||||
shift;
|
||||
;;
|
||||
--)
|
||||
shift;
|
||||
break;
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Begin sanity checks
|
||||
if [ -z "$IPT_SRC_IP" ]; then
|
||||
echo "$SCRIPT_NAME - Error! Source IP address required"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$IPT_DST_PORT" ]; then
|
||||
echo "$SCRIPT_NAME - Error! Destination port required"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$IPT_METHOD" ]; then
|
||||
echo "$SCRIPT_NAME - Error! Valid action option not specified"
|
||||
fi
|
||||
|
||||
case "$IPT_METHOD" in
|
||||
-A)
|
||||
IPT_COMMENT="$COMMENT_APP $IPT_COMMENT"
|
||||
;;
|
||||
-I)
|
||||
IPT_COMMENT="$COMMENT_INS $IPT_COMMENT"
|
||||
;;
|
||||
-D)
|
||||
IPT_COMMENT="$COMMENT_DEL $IPT_COMMENT"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "$VERBOSE" -eq 1 ]; then
|
||||
echo "$SCRIPT_NAME - Testing rule"
|
||||
echo "$SCRIPT_NAME - action: $IPT_METHOD _ src: $IPT_SRC_IP _ dstport: $IPT_DST_PORT _ proto: $IPT_PROTO _ chain: $IPT_CHAIN _ comment: $IPT_COMMENT"
|
||||
fi
|
||||
|
||||
COMMENT=""
|
||||
if [ -n "$IPT_COMMENT" ]; then
|
||||
COMMENT="-m comment --comment '$IPT_COMMENT'"
|
||||
fi
|
||||
|
||||
$IPTABLES -L $IPT_CHAIN &> /dev/null
|
||||
if [ 0 -ne "$?" ]; then
|
||||
echo "$SCRIPT_NAME - Error: $IPT_CHAIN is not a valid NetFilter chain"
|
||||
exit
|
||||
fi
|
||||
# End sanity checks
|
||||
|
||||
# Dupe checking
|
||||
for IP in `$IPTABLES -n -L $IPT_CHAIN | $GREP $IPT_RULE_TARGET | $AWK '{print $4}' | $SORT -u`;
|
||||
do
|
||||
if [ "$VERBOSE" -eq 1 ]; then
|
||||
echo "$SCRIPT_NAME - $IP"
|
||||
fi
|
||||
|
||||
if [ "$IPT_SRC_IP" == "$IP" ]; then
|
||||
SEEN=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$VERBOSE" -eq 1 ]; then
|
||||
echo "$SCRIPT_NAME - Seen: $SEEN"
|
||||
fi
|
||||
|
||||
|
||||
if [ "$SEEN" -eq 0 ]; then
|
||||
if [ "$VERBOSE" -eq 1 ]; then
|
||||
echo "$SCRIPT_NAME - $IPT_COMMENT"
|
||||
echo $IPTABLES $IPT_METHOD $IPT_CHAIN -s $IPT_SRC_IP -p $IPT_PROTO --dport $IPT_DST_PORT -j $IPT_RULE_TARGET $COMMENT
|
||||
fi
|
||||
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
eval $IPTABLES $IPT_METHOD $IPT_CHAIN -s $IPT_SRC_IP -p $IPT_PROTO --dport $IPT_DST_PORT -j $IPT_RULE_TARGET $COMMENT
|
||||
fi
|
||||
fi
|
||||
+611
-267
File diff suppressed because it is too large
Load Diff
+4
-5
@@ -13,10 +13,9 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -28,7 +27,7 @@ PMList* list_new()
|
||||
{
|
||||
PMList *list = NULL;
|
||||
|
||||
list = (PMList*)malloc(sizeof(PMList));
|
||||
list = (PMList*)calloc(1, sizeof(PMList));
|
||||
if(list == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
+3
-4
@@ -13,10 +13,9 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
#ifndef _PAC_LIST_H
|
||||
#define _PAC_LIST_H
|
||||
|
||||
Reference in New Issue
Block a user