mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 17:59:20 -04:00
- Update to 4.1.2
PR: 113293 Submitted by: Alex Samorukov <samm@os2.kiev.ua> (maintainer)
This commit is contained in:
parent
127dcb46a8
commit
4e3dcb24af
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=192934
17 changed files with 372 additions and 587 deletions
|
@ -1,75 +1,90 @@
|
|||
# New ports collection makefile for: spamd
|
||||
# Date created: 23 June 2003
|
||||
# New ports collection makefile for: spamd
|
||||
# Date created: 04 April 2007
|
||||
# Whom: Max Laier <max@love2party.net>
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
PORTNAME= spamd
|
||||
PORTVERSION= 3.7
|
||||
PORTREVISION= 3
|
||||
PORTVERSION= 4.1.2
|
||||
CATEGORIES= mail
|
||||
MASTER_SITES= ${MASTER_SITE_LOCAL}
|
||||
MASTER_SITE_SUBDIR= delphij
|
||||
DISTNAME= ${PORTNAME}_${PORTVERSION}
|
||||
MASTER_SITES= BERLIOS
|
||||
MASTER_SITE_SUBDIR=freebsdspamd
|
||||
DISTNAME= ${PORTNAME}-${PORTVERSION}
|
||||
|
||||
MAINTAINER= samm@os2.kiev.ua
|
||||
COMMENT= Traps spammers with a very slow smtp-login and return 4xx error
|
||||
|
||||
USE_BZIP2= yes
|
||||
|
||||
.include <bsd.port.pre.mk>
|
||||
|
||||
.if defined(WITH_IPFW)
|
||||
CFLAGS+= -DIPFW
|
||||
.if ${OSVERSION} < 490000
|
||||
BROKEN= IPFW with Tables is required for this port to function properly
|
||||
.endif
|
||||
.else
|
||||
.if ${OSVERSION} < 502117
|
||||
BROKEN= OpenBSD 3.5 pf/pfctl is necessary for this port to function properly.
|
||||
.else
|
||||
LOCAL_PFCTL= /sbin/pfctl
|
||||
.endif
|
||||
.endif
|
||||
|
||||
USE_RC_SUBR= pfspamd.sh
|
||||
USE_RC_SUBR?= obspamd obspamlogd
|
||||
|
||||
.if !defined(BATCH) && !defined(PACKAGE_BUILDING)
|
||||
IS_INTERACTIVE= yes
|
||||
.endif
|
||||
SPAMDUSER?= _spamd
|
||||
SPAMDGROUP?= _spamd
|
||||
SPAMDDIR?= /var/empty
|
||||
|
||||
SPAMDUID= 132
|
||||
SPAMDGID= ${SPAMDUID}
|
||||
|
||||
MAN5= spamd.conf.5
|
||||
MAN8= spamd.8 spamd-setup.8 spamdb.8 spamlogd.8
|
||||
PORTDOCS= ipfw-spamd.txt
|
||||
|
||||
SAMPLE_SPAMD_CONF= ${PREFIX}/etc/spamd.conf.sample
|
||||
PLIST_DIRS= etc/spamd
|
||||
PLIST_FILES= libexec/spamd libexec/spamlogd \
|
||||
sbin/spamd-setup sbin/spamdb \
|
||||
etc/spamd/spamd.conf.sample
|
||||
|
||||
post-patch:
|
||||
@${REINPLACE_CMD} -e 's|%%LOCAL_PFCTL%%|${LOCAL_PFCTL}|; \
|
||||
s|%%LOCAL_SPAMD_CONF%%|${PREFIX}/etc/spamd.conf|' \
|
||||
${WRKSRC}/spamd-setup/spamd-setup.c
|
||||
@${REINPLACE_CMD} -e 's|/etc/spamd.conf|${PREFIX}/etc/spamd.conf|' \
|
||||
${WRKSRC}/spamd/spamd.8 ${WRKSRC}/spamd-setup/spamd-setup.8
|
||||
CONFIG_DIR= ${PREFIX}/etc/spamd
|
||||
SAMPLE_SPAMD_CONF= ${CONFIG_DIR}/spamd.conf.sample
|
||||
|
||||
pre-su-install:
|
||||
.if !defined(BATCH) && !defined(PACKAGE_BUILDING)
|
||||
@${SETENV} PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL
|
||||
.endif
|
||||
PLIST_SUB= SPAMDDIR=${SPAMDDIR} \
|
||||
SPAMDUSER=${SPAMDUSER} \
|
||||
SPAMDGROUP=${SPAMDGROUP} \
|
||||
SPAMDUID=${SPAMDUID} \
|
||||
SPAMDGID=${SPAMDGID}
|
||||
|
||||
SUB_FILES= pkg-install \
|
||||
pkg-deinstall \
|
||||
pkg-message
|
||||
|
||||
SUB_LIST= PREFIX=${PREFIX} \
|
||||
${PLIST_SUB}
|
||||
|
||||
pre-install:
|
||||
@${SH} ${PKGINSTALL} ${DISTNAME} PRE-INSTALL
|
||||
|
||||
post-install:
|
||||
@${CAT} ${PKGMESSAGE}
|
||||
|
||||
do-install:
|
||||
${INSTALL_PROGRAM} ${WRKSRC}/spamd/spamd ${PREFIX}/libexec
|
||||
${INSTALL_PROGRAM} ${WRKSRC}/spamlogd/spamlogd ${PREFIX}/libexec
|
||||
${INSTALL_PROGRAM} ${WRKSRC}/spamd-setup/spamd-setup ${PREFIX}/sbin
|
||||
${INSTALL_PROGRAM} ${WRKSRC}/spamdb/spamdb ${PREFIX}/sbin
|
||||
${INSTALL_MAN} ${WRKSRC}/doc/spamd.conf.5 ${PREFIX}/man/man5
|
||||
${INSTALL_MAN} ${WRKSRC}/etc/spamd.conf.5 ${PREFIX}/man/man5
|
||||
${INSTALL_MAN} ${WRKSRC}/spamd/spamd.8 ${PREFIX}/man/man8
|
||||
${INSTALL_MAN} ${WRKSRC}/spamd-setup/spamd-setup.8 ${PREFIX}/man/man8
|
||||
${INSTALL_MAN} ${WRKSRC}/spamdb/spamdb.8 ${PREFIX}/man/man8
|
||||
${INSTALL_MAN} ${WRKSRC}/spamlogd/spamlogd.8 ${PREFIX}/man/man8
|
||||
@if [ ! -f ${SAMPLE_SPAMD_CONF} ]; then \
|
||||
${ECHO_MSG} "Installing ${SAMPLE_SPAMD_CONF} file."; \
|
||||
${INSTALL_DATA} ${WRKSRC}/doc/spamd.conf \
|
||||
${SAMPLE_SPAMD_CONF}; \
|
||||
@if [ ! -d ${CONFIG_DIR} ]; then \
|
||||
${MKDIR} ${CONFIG_DIR}; \
|
||||
fi
|
||||
@if [ ! -f ${SAMPLE_SPAMD_CONF} ]; then \
|
||||
${ECHO_MSG} "Installing ${SAMPLE_SPAMD_CONF} file."; \
|
||||
${ECHO_MSG} "${INSTALL_DATA} -v -p ${WRKSRC}/etc/spamd.conf ${SAMPLE_SPAMD_CONF}"; \
|
||||
${INSTALL_DATA} -v -p ${WRKSRC}/etc/spamd.conf \
|
||||
${SAMPLE_SPAMD_CONF}; \
|
||||
fi
|
||||
.if !defined(NOPORTDOCS)
|
||||
@${MKDIR} ${DOCSDIR}
|
||||
@${INSTALL_DATA} ${WRKSRC}/doc/ipfw-spamd.txt ${DOCSDIR}/
|
||||
.endif
|
||||
|
||||
.include <bsd.port.post.mk>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
MD5 (spamd_3.7.tar.bz2) = e1d96b9d7b1d4189dca510ff0000383f
|
||||
SHA256 (spamd_3.7.tar.bz2) = a06ad07ead38240f13ea01c5d0315179e7089ed8fb8fe6544b1860bd8cfdc355
|
||||
SIZE (spamd_3.7.tar.bz2) = 28066
|
||||
MD5 (spamd-4.1.2.tar.gz) = 0a207e997840359bde85ec4039e0d6a8
|
||||
SHA256 (spamd-4.1.2.tar.gz) = 49defbee42fe30c5f218351cc664e11328799b9893abe4528a17594d3ec97231
|
||||
SIZE (spamd-4.1.2.tar.gz) = 50199
|
||||
|
|
64
mail/spamd/files/obspamd.in
Normal file
64
mail/spamd/files/obspamd.in
Normal file
|
@ -0,0 +1,64 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
# PROVIDE: obspamd
|
||||
# REQUIRE: NETWORKING SERVERS
|
||||
# BEFORE: DAEMON
|
||||
# KEYWORD: shutdown
|
||||
|
||||
#
|
||||
# Define these spamd_* variables in one of these files:
|
||||
# /etc/rc.conf
|
||||
# /etc/rc.conf.local
|
||||
#
|
||||
# obspamd_enable="YES" # Run the spamd(8) daemon (YES/NO).
|
||||
# obspamd_flags="" # Extra flags for spamd(8) (if enabled).
|
||||
#
|
||||
# DO NOT CHANGE THESE DEFAULT VALUES HERE
|
||||
#
|
||||
obspamd_enable=${obspamd_enable:-"NO"}
|
||||
obspamd_flags=${obspamd_flags:-""}
|
||||
|
||||
. %%RC_SUBR%%
|
||||
|
||||
name="obspamd"
|
||||
rcvar=`set_rcvar`
|
||||
|
||||
command="%%PREFIX%%/libexec/spamd"
|
||||
start_precmd="obspamd_precmd"
|
||||
start_postcmd="obspamd_postcmd"
|
||||
restart_postcmd="obspamd_postcmd"
|
||||
pidfile="/var/run/spamd.pid"
|
||||
|
||||
obspamd_precmd()
|
||||
{
|
||||
_rc=0
|
||||
echo "${obspamd_flags}" | grep "\-b" 2>&1 > /dev/null
|
||||
if [ $? -eq 1 ]; then
|
||||
/sbin/mount -p | grep 'fdescfs.*/dev/fd.*fdescfs.*rw' 2>&1 > /dev/null
|
||||
_rc=${?}
|
||||
if [ ${_rc} -ne 0 ]; then
|
||||
echo "Unable to start spamd in greylisting mode"
|
||||
echo ""
|
||||
echo "Please mount fdescfs with the following line in /etc/fstab"
|
||||
echo ""
|
||||
echo " fdescfs /dev/fd fdescfs rw 0 0"
|
||||
echo ""
|
||||
fi
|
||||
return ${_rc}
|
||||
fi
|
||||
}
|
||||
|
||||
obspamd_postcmd()
|
||||
{
|
||||
if [ -x %%PREFIX%%/sbin/spamd-setup ]; then
|
||||
if [ -r %%PREFIX%%/etc/spamd/spamd.conf ]; then
|
||||
%%PREFIX%%/sbin/spamd-setup &
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
49
mail/spamd/files/obspamlogd.in
Normal file
49
mail/spamd/files/obspamlogd.in
Normal file
|
@ -0,0 +1,49 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
# PROVIDE: obspamlogd
|
||||
# REQUIRE: NETWORKING SERVERS obspamd
|
||||
# BEFORE: DAEMON
|
||||
# KEYWORD: shutdown
|
||||
|
||||
#
|
||||
# Define these obspamlogd_* variables in one of these files:
|
||||
# /etc/rc.conf
|
||||
# /etc/rc.conf.local
|
||||
#
|
||||
# obspamlogd_enable="YES" # Run the spamlogd(8) daemon (YES/NO).
|
||||
# obspamlogd_flags="" # Extra flags for spamlogd(8) (if enabled).
|
||||
#
|
||||
# DO NOT CHANGE THESE DEFAULT VALUES HERE
|
||||
#
|
||||
obspamlogd_enable=${obspamlogd_enable:-"NO"}
|
||||
obspamlogd_flags=${obspamlogd_flags:-""}
|
||||
|
||||
. %%RC_SUBR%%
|
||||
|
||||
name="obspamlogd"
|
||||
rcvar=`set_rcvar`
|
||||
|
||||
command="%%PREFIX%%/libexec/spamlogd"
|
||||
start_precmd="${name}_precmd"
|
||||
|
||||
obspamlogd_precmd()
|
||||
{
|
||||
_rc=0
|
||||
/sbin/mount -p | grep 'fdescfs.*/dev/fd.*fdescfs.*rw' 2>&1 > /dev/null
|
||||
_rc=${?}
|
||||
if [ ${_rc} -ne 0 ]; then
|
||||
echo "Unable to start ${name}"
|
||||
echo ""
|
||||
echo "Please mount fdescfs with the following line in /etc/fstab"
|
||||
echo ""
|
||||
echo " fdescfs /dev/fd fdescfs rw 0 0"
|
||||
echo ""
|
||||
fi
|
||||
return ${_rc}
|
||||
}
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
|
@ -1,131 +0,0 @@
|
|||
--- spamd/grey.c Wed Apr 13 03:22:17 2005
|
||||
+++ spamd/grey.c Mon Mar 20 15:26:18 2006
|
||||
@@ -39,6 +39,10 @@
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
|
||||
+#ifdef IPFW
|
||||
+#include <netinet/ip_fw.h>
|
||||
+#endif
|
||||
+
|
||||
#include "grey.h"
|
||||
|
||||
extern time_t passtime, greyexp, whiteexp, trapexp;
|
||||
@@ -65,13 +69,17 @@
|
||||
char *traplist_msg = "\"Your address %A has mailed to spamtraps here\\n\"";
|
||||
|
||||
pid_t db_pid = -1;
|
||||
-int pfdev;
|
||||
int spamdconf;
|
||||
|
||||
+#ifdef IPFW
|
||||
+extern int tabno;
|
||||
+#else
|
||||
+int pfdev;
|
||||
static char *pargv[11]= {
|
||||
"pfctl", "-p", "/dev/pf", "-q", "-t",
|
||||
"spamd-white", "-T", "replace", "-f" "-", NULL
|
||||
};
|
||||
+#endif
|
||||
|
||||
/* If the parent gets a signal, kill off the children and exit */
|
||||
/* ARGSUSED */
|
||||
@@ -104,6 +112,7 @@
|
||||
return(0);
|
||||
}
|
||||
|
||||
+#ifndef IPFW
|
||||
int
|
||||
configure_pf(char **addrs, int count)
|
||||
{
|
||||
@@ -166,11 +175,54 @@
|
||||
for (i = 0; i < count; i++)
|
||||
if (addrs[i] != NULL)
|
||||
fprintf(pf, "%s/32\n", addrs[i]);
|
||||
+
|
||||
fclose(pf);
|
||||
waitpid(pid, NULL, 0);
|
||||
sigaction(SIGCHLD, &sa, NULL);
|
||||
return(0);
|
||||
}
|
||||
+#else
|
||||
+int
|
||||
+configure_pf(char **addrs, int count)
|
||||
+{
|
||||
+ static int s = -1;
|
||||
+ ipfw_table_entry ent;
|
||||
+ int i;
|
||||
+
|
||||
+ if (s == -1)
|
||||
+ s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
|
||||
+ if (s < 0)
|
||||
+ {
|
||||
+ syslog_r(LOG_INFO, &sdata, "IPFW socket unavailable (%m)");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+
|
||||
+ /* flush the table */
|
||||
+ ent.tbl = tabno;
|
||||
+ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_FLUSH, &ent.tbl, sizeof(ent.tbl)) < 0)
|
||||
+ {
|
||||
+ syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_FLUSH) (%m)");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < count; i++)
|
||||
+ if (addrs[i] != NULL)
|
||||
+ {
|
||||
+ /* add addrs[i] to tabno */
|
||||
+ ent.tbl = tabno;
|
||||
+ ent.masklen = 32;
|
||||
+ ent.value = 0;
|
||||
+ inet_aton(addrs[i], (struct in_addr *)&ent.addr);
|
||||
+ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_ADD, &ent, sizeof(ent)) < 0)
|
||||
+ {
|
||||
+ syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_ADD) (%m)");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return(0);
|
||||
+}
|
||||
+#endif
|
||||
|
||||
void
|
||||
freeaddrlists(void)
|
||||
@@ -590,11 +642,13 @@
|
||||
int i;
|
||||
struct sigaction sa;
|
||||
|
||||
+#ifndef IPFW
|
||||
pfdev = open("/dev/pf", O_RDWR);
|
||||
if (pfdev == -1) {
|
||||
syslog_r(LOG_ERR, &sdata, "open of /dev/pf failed (%m)");
|
||||
exit(1);
|
||||
}
|
||||
+#endif
|
||||
|
||||
/* check to see if /var/db/spamd exists, if not, create it */
|
||||
if ((i = open(PATH_SPAMD_DB, O_RDWR, 0)) == -1 && errno == ENOENT) {
|
||||
@@ -636,7 +690,9 @@
|
||||
* child, talks to jailed spamd over greypipe,
|
||||
* updates db. has no access to pf.
|
||||
*/
|
||||
+#ifndef IPFW
|
||||
close(pfdev);
|
||||
+#endif
|
||||
setproctitle("(%s update)", PATH_SPAMD_DB);
|
||||
greyreader();
|
||||
/* NOTREACHED */
|
||||
@@ -655,7 +711,11 @@
|
||||
sigaction(SIGCHLD, &sa, NULL);
|
||||
sigaction(SIGINT, &sa, NULL);
|
||||
|
||||
+#ifndef IPFW
|
||||
setproctitle("(pf <spamd-white> update)");
|
||||
+#else
|
||||
+ setproctitle("(ipfw white table update)");
|
||||
+#endif
|
||||
greyscanner();
|
||||
/* NOTREACHED */
|
||||
exit(1);
|
|
@ -1,10 +0,0 @@
|
|||
--- spamd/grey.h Thu Mar 16 19:55:33 2006
|
||||
+++ spamd/grey.h Thu Mar 16 19:55:56 2006
|
||||
@@ -22,6 +22,7 @@
|
||||
#define WHITEEXP (60 * 60 * 24 * 36) /* remove white entries after 36 days */
|
||||
#define TRAPEXP (60 * 60 * 24) /* hitting a spamtrap blacklists for a day */
|
||||
#define PATH_PFCTL "/sbin/pfctl"
|
||||
+#define PATH_IPFW "/sbin/ipfw"
|
||||
#define DB_SCAN_INTERVAL 60
|
||||
#define PATH_SPAMD_DB "/var/db/spamd"
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
--- spamd/spamd.c Thu Mar 16 20:56:45 2006
|
||||
+++ spamd/spamd.c Thu Mar 16 21:07:11 2006
|
||||
@@ -123,6 +123,10 @@
|
||||
pid_t jail_pid = -1;
|
||||
u_short cfg_port;
|
||||
|
||||
+#ifdef IPFW
|
||||
+int tabno=1;
|
||||
+#endif
|
||||
+
|
||||
extern struct sdlist *blacklists;
|
||||
|
||||
int conffd = -1;
|
||||
@@ -153,6 +157,10 @@
|
||||
" [-G mins:hours:hours] [-n name] [-p port]\n");
|
||||
fprintf(stderr,
|
||||
" [-r reply] [-s secs] [-w window]\n");
|
||||
+#ifdef IPFW
|
||||
+ fprintf(stderr,
|
||||
+ " [-t table_no]\n");
|
||||
+#endif
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -958,7 +966,11 @@
|
||||
if (gethostname(hostname, sizeof hostname) == -1)
|
||||
err(1, "gethostname");
|
||||
|
||||
+#ifdef IPFW
|
||||
+ while ((ch = getopt(argc, argv, "45b:c:B:p:dgG:r:s:n:vw:t:")) != -1) {
|
||||
+#else
|
||||
while ((ch = getopt(argc, argv, "45b:c:B:p:dgG:r:s:n:vw:")) != -1) {
|
||||
+#endif
|
||||
switch (ch) {
|
||||
case '4':
|
||||
nreply = "450";
|
||||
@@ -1015,6 +1027,11 @@
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
+#ifdef IPFW
|
||||
+ case 't':
|
||||
+ tabno = atoi(optarg);
|
||||
+ break;
|
||||
+#endif
|
||||
case 'w':
|
||||
window = atoi(optarg);
|
||||
if (window <= 0)
|
|
@ -1,110 +0,0 @@
|
|||
--- spamd-setup/spamd-setup.c.orig Wed Apr 13 01:18:59 2005
|
||||
+++ spamd-setup/spamd-setup.c Wed May 10 01:55:13 2006
|
||||
@@ -41,6 +41,11 @@
|
||||
#include <netdb.h>
|
||||
#include <zlib.h>
|
||||
|
||||
+#ifdef IPFW
|
||||
+#include <net/if.h>
|
||||
+#include <netinet/ip_fw.h>
|
||||
+#endif
|
||||
+
|
||||
#define PATH_FTP "/usr/bin/ftp"
|
||||
#define PATH_PFCTL "%%LOCAL_PFCTL%%"
|
||||
#define PATH_SPAMD_CONF "%%LOCAL_SPAMD_CONF%%"
|
||||
@@ -93,6 +98,11 @@
|
||||
int debug;
|
||||
int dryrun;
|
||||
|
||||
+#ifdef IPFW
|
||||
+int tabno=2;
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
u_int32_t
|
||||
imask(u_int8_t b)
|
||||
{
|
||||
@@ -630,6 +640,7 @@
|
||||
}
|
||||
|
||||
|
||||
+#ifndef IPFW
|
||||
int
|
||||
configure_pf(struct cidr **blacklists)
|
||||
{
|
||||
@@ -676,6 +687,51 @@
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
+#else
|
||||
+int
|
||||
+configure_pf(struct cidr **blacklists)
|
||||
+{
|
||||
+ static int s = -1;
|
||||
+ ipfw_table_entry ent;
|
||||
+
|
||||
+ if (s == -1)
|
||||
+ s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
|
||||
+ if (s < 0)
|
||||
+ {
|
||||
+ err(1, "IPFW socket unavailable");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+
|
||||
+ /* flush the table */
|
||||
+ ent.tbl = tabno;
|
||||
+ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_FLUSH, &ent.tbl, sizeof(ent.tbl)) < 0)
|
||||
+ {
|
||||
+ err(1, "IPFW setsockopt(IP_FW_TABLE_FLUSH)");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+
|
||||
+ while (*blacklists != NULL) {
|
||||
+ struct cidr *b = *blacklists;
|
||||
+
|
||||
+ while (b->addr != 0) {
|
||||
+ /* add b to tabno */
|
||||
+ ent.tbl = tabno;
|
||||
+ ent.masklen = b->bits;
|
||||
+ ent.value = 0;
|
||||
+ inet_aton(atop(b->addr), (struct in_addr *)&ent.addr);
|
||||
+ if (setsockopt(s, IPPROTO_IP, IP_FW_TABLE_ADD, &ent, sizeof(ent)) < 0)
|
||||
+ {
|
||||
+ err(1, "IPFW setsockopt(IP_FW_TABLE_ADD)");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+ b++;
|
||||
+ }
|
||||
+ blacklists++;
|
||||
+ }
|
||||
+
|
||||
+ return(0);
|
||||
+}
|
||||
+#endif
|
||||
|
||||
int
|
||||
getlist(char ** db_array, char *name, struct blacklist *blist,
|
||||
@@ -773,7 +829,11 @@
|
||||
struct servent *ent;
|
||||
int i, ch;
|
||||
|
||||
+#ifndef IPFW
|
||||
while ((ch = getopt(argc, argv, "nd")) != -1) {
|
||||
+#else
|
||||
+ while ((ch = getopt(argc, argv, "ndt:")) != -1) {
|
||||
+#endif
|
||||
switch (ch) {
|
||||
case 'n':
|
||||
dryrun = 1;
|
||||
@@ -781,6 +841,11 @@
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
+#ifdef IPFW
|
||||
+ case 't':
|
||||
+ tabno = atoi(optarg);
|
||||
+ break;
|
||||
+#endif
|
||||
default:
|
||||
break;
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
--- spamd/spamd.8 Wed Apr 13 03:21:48 2005
|
||||
+++ spamd/spamd.8 Mon Mar 20 15:12:10 2006
|
||||
@@ -49,6 +49,8 @@
|
||||
daemon which rejects false mail.
|
||||
If the
|
||||
.Xr pf 4
|
||||
+or
|
||||
+.Xr ipfw 4
|
||||
packet filter is configured to redirect port 25 (SMTP) to this daemon,
|
||||
it will attempt to waste the time and resources of the spam sender.
|
||||
.Pp
|
||||
@@ -151,11 +153,15 @@
|
||||
which processes a list of spammers' addresses, and applies appropriate
|
||||
.Xr pfctl 8
|
||||
.Em rdr
|
||||
+or
|
||||
+.Xr ipfw 8
|
||||
+.Em fwd
|
||||
rules.
|
||||
.Xr spamd-setup 8
|
||||
is run from
|
||||
.Xr cron 8 .
|
||||
.Sh REDIRECTING SMTP CONNECTIONS
|
||||
+.Ss "When using PF"
|
||||
With
|
||||
.Xr pf 4 ,
|
||||
connections to port 25 (SMTP) can be redirected to another host or port,
|
||||
@@ -189,6 +195,8 @@
|
||||
can also be used to load addresses into the
|
||||
.Em <spamd>
|
||||
table.
|
||||
+
|
||||
+
|
||||
.Xr spamd-setup 8
|
||||
also has the added benefit of being able to remove addresses from
|
||||
blacklists, and will connect to
|
||||
@@ -203,6 +211,52 @@
|
||||
This is important as it allows legitimate mail
|
||||
senders to pressure spam sources into behaving properly so that they
|
||||
may be removed from the relevant blacklists.
|
||||
+
|
||||
+.Ss "If compiled with IPFW"
|
||||
+With
|
||||
+.Xr ipfw 4 ,
|
||||
+the syntax for redirection of TCP sessions is quite different
|
||||
+from that of
|
||||
+.Xr pf 4 .
|
||||
+The
|
||||
+.Em fwd
|
||||
+rule used for this purpose are described in
|
||||
+.Xr ipfw 8 .
|
||||
+The rules should be added to the ruleset called by /etc/rc.firewall
|
||||
+to be present at boot time.
|
||||
+.Bd -literal -offset 4n
|
||||
+fwd 127.0.0.1,8025 tcp from table(2) to me 25 in
|
||||
+allow tcp from table(1) to me 25 in
|
||||
+fwd 127.0.0.1,8025 tcp from any to me 25 in
|
||||
+.Ed
|
||||
+.Pp
|
||||
+Any addresses in the blacklist table
|
||||
+.Em 2
|
||||
+and not in the whitelist table
|
||||
+.Em 1
|
||||
+are then redirected to
|
||||
+.Nm
|
||||
+running on port 8025.
|
||||
+Addresses can be loaded into the blacklist
|
||||
+.Em table ,
|
||||
+like:
|
||||
+.Bd -literal -offset 4n
|
||||
+# ipfw table 1 add a.b.c.d/x
|
||||
+.Ed
|
||||
+.Pp
|
||||
+.Xr spamd-setup 8
|
||||
+can also be used to load addresses into the blacklist table
|
||||
+.Em 2 .
|
||||
+.Pp
|
||||
+The
|
||||
+.Op Fl t Ar table_no
|
||||
+option to
|
||||
+.Em spamd
|
||||
+and
|
||||
+.Em spamd-setup
|
||||
+can be used to change the default table
|
||||
+numbers.
|
||||
+
|
||||
.Sh CONFIGURATION CONNECTIONS
|
||||
.Nm
|
||||
listens for configuration connections on the port identified by the
|
|
@ -1,49 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
# PROVIDE: pfspamd
|
||||
# REQUIRE: NETWORKING
|
||||
# BEFORE: mail
|
||||
# KEYWORD: shutdown
|
||||
|
||||
#
|
||||
# Add the following lines to /etc/rc.conf to enable spamd:
|
||||
# pfspamd_enable (bool): Set to "NO" by default.
|
||||
# Set it to "YES" to enable spamd
|
||||
# pfspamd_flags (str): Set to "" by default.
|
||||
# Extra flags passed to start command.
|
||||
# pfspamd_setup_flags (str): Set to "" by default.
|
||||
# Extra flags passed to spamd-setup command.
|
||||
|
||||
. %%RC_SUBR%%
|
||||
|
||||
name="pfspamd"
|
||||
rcvar=`set_rcvar`
|
||||
|
||||
command="%%PREFIX%%/libexec/spamd"
|
||||
start_postcmd="pfspamd_postcmd"
|
||||
restart_postcmd="pfspamd_postcmd"
|
||||
|
||||
[ -z "$pfspamd_enable" ] && pfspamd_enable="NO"
|
||||
[ -z "$pfspamd_flags" ] && pfspamd_flags=""
|
||||
[ -z "$pfspamd_setup_flags" ] && pfspamd_setup_flags=""
|
||||
|
||||
load_rc_config $name
|
||||
|
||||
# we override check_process to avoid conflict with the spamd from sa-spamd
|
||||
check_process()
|
||||
{
|
||||
ps ax -o pid,command | grep "libexec/spamd" | grep -v grep | awk '{print $1}'
|
||||
}
|
||||
|
||||
|
||||
pfspamd_postcmd()
|
||||
{
|
||||
if [ -x %%PREFIX%%/sbin/spamd-setup ]; then
|
||||
%%PREFIX%%/sbin/spamd-setup $pfspamd_setup_flags
|
||||
fi
|
||||
}
|
||||
|
||||
run_rc_command "$1"
|
21
mail/spamd/files/pkg-deinstall.in
Normal file
21
mail/spamd/files/pkg-deinstall.in
Normal file
|
@ -0,0 +1,21 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
#
|
||||
|
||||
SPAMDDIR=%%SPAMDDIR%%
|
||||
SPAMDUSER=%%SPAMDUSER%%
|
||||
SPAMDGROUP=%%SPAMDGROUP%%
|
||||
|
||||
if [ "$2" = "POST-DEINSTALL" ]; then
|
||||
if /usr/sbin/pw group show "${SPAMDGROUP}" 2>&1 >/dev/null; then
|
||||
echo "You should manually remove the \"${SPAMDGROUP}\" group."
|
||||
fi
|
||||
|
||||
if /usr/sbin/pw user show "${SPAMDUSER}" 2>&1 >/dev/null; then
|
||||
echo "You should manually remove the \"${SPAMDUSER}\" user."
|
||||
fi
|
||||
|
||||
if [ -e "${SPAMDDIR}" ]; then
|
||||
echo "You should manually remove the \"${SPAMDDIR}\" directory."
|
||||
fi
|
||||
fi
|
125
mail/spamd/files/pkg-install.in
Normal file
125
mail/spamd/files/pkg-install.in
Normal file
|
@ -0,0 +1,125 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
#
|
||||
|
||||
SPAMDDIR=%%SPAMDDIR%%
|
||||
SPAMDUSER=%%SPAMDUSER%%
|
||||
SPAMDGROUP=%%SPAMDGROUP%%
|
||||
SPAMDUID=%%SPAMDUID%%
|
||||
SPAMDGID=%%SPAMDGID%%
|
||||
|
||||
ask() {
|
||||
local question default answer
|
||||
|
||||
question=$1
|
||||
default=$2
|
||||
if [ -z "${PACKAGE_BUILDING}" ]; then
|
||||
read -p "${question} [${default}]? " answer
|
||||
fi
|
||||
if [ "x${answer}" = "x" ]; then
|
||||
answer=${default}
|
||||
fi
|
||||
echo ${answer}
|
||||
}
|
||||
|
||||
yesno() {
|
||||
local default question answer
|
||||
|
||||
question=$1
|
||||
default=$2
|
||||
while :; do
|
||||
answer=$(ask "${question}" "${default}")
|
||||
case "${answer}" in
|
||||
[Yy][Ee][Ss]|[Yy])
|
||||
return 0
|
||||
;;
|
||||
[Nn][Oo]|[Nn])
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
echo "Please answer yes or no."
|
||||
done
|
||||
}
|
||||
|
||||
check_service() {
|
||||
local name number type comment
|
||||
|
||||
name=$1
|
||||
number=$2
|
||||
type=$3
|
||||
comment=$4
|
||||
|
||||
FILE="/etc/services"
|
||||
# check
|
||||
OK=no
|
||||
HAS_SERVICE=no
|
||||
COUNT=1
|
||||
for i in `grep $name $FILE `; do
|
||||
if [ $COUNT = 1 ] && [ X"$i" = X"$name" ]; then
|
||||
HAS_SERVICE=yes
|
||||
elif [ $COUNT = 2 ] && [ $HAS_SERVICE = yes ] && \
|
||||
[ X"$i" = X"$number/$type" ]; then
|
||||
OK=yes
|
||||
break
|
||||
fi
|
||||
COUNT=`expr ${COUNT} + 1`
|
||||
done
|
||||
# add an entry for SERVICE to /etc/services
|
||||
if [ $OK = no ]; then
|
||||
echo "This system has no entry for $name in ${FILE}"
|
||||
if yesno "Would you like to add it automatically?" y; then
|
||||
mv ${FILE} ${FILE}.bak
|
||||
(grep -v $name ${FILE}.bak ; \
|
||||
echo "$name $number/$type # $comment") \
|
||||
>> ${FILE}
|
||||
rm ${FILE}.bak
|
||||
else
|
||||
echo "Please add '$name $number/$type' into ${FILE}, and try again."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
if [ "$2" = "PRE-INSTALL" ]; then
|
||||
if /usr/sbin/pw group show "${SPAMDGROUP}" 2>&1 >/dev/null; then
|
||||
echo "You already have a \"${SPAMDGROUP}\" group, so I will use it."
|
||||
else
|
||||
echo "You need a \"${SPAMDGROUP}\" group."
|
||||
if yesno "Would you like me to create it" "YES"; then
|
||||
/usr/sbin/pw groupadd "${SPAMDGROUP}" -g "${SPAMDGID}" -h - || \
|
||||
/usr/sbin/pw groupadd "${SPAMDGROUP}" -h - || exit
|
||||
echo "Done."
|
||||
else
|
||||
echo "Please create the \"${SPAMDGROUP}\" group manually and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if /usr/sbin/pw user show "${SPAMDUSER}" 2>&1 >/dev/null; then
|
||||
echo "You already have a \"${SPAMDUSER}\" user, so I will use it."
|
||||
else
|
||||
echo "You need a \"${SPAMDUSER}\" user."
|
||||
if yesno "Would you like me to create it" "YES"; then
|
||||
/usr/sbin/pw useradd "${SPAMDUSER}" -u "${SPAMDUID}" -g "${SPAMDGROUP}" -h - -d "${SPAMDDIR}" \
|
||||
-s /sbin/nologin -c "spamd pseudo-user" || \
|
||||
/usr/sbin/pw useradd "${SPAMDUSER}" -g "${SPAMDGROUP}" -h - -d "${SPAMDDIR}" \
|
||||
-s /sbin/nologin -c "spamd pseudo-user" || exit
|
||||
else
|
||||
echo "Please create the \"${SPAMDUSER}\" user manually and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! check_service spamd 8025 tcp "spamd(8)"; then
|
||||
exit 1
|
||||
fi
|
||||
if ! check_service spamd-cfg 8026 tcp "spamd(8) configuration"; then
|
||||
exit 1
|
||||
fi
|
||||
if ! check_service spamd-sync 8025 udp "spamd(8) synchronisation"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fi
|
42
mail/spamd/files/pkg-message.in
Normal file
42
mail/spamd/files/pkg-message.in
Normal file
|
@ -0,0 +1,42 @@
|
|||
**********************************************************************
|
||||
To enable spamd you need:
|
||||
|
||||
1) Enable spamd in /etc/rc.conf with the following line:
|
||||
obspamd_enable="YES"
|
||||
obspamlogd_enable="YES"
|
||||
|
||||
2) Configuration template is available in %%PREFIX%%/etc/spamd as
|
||||
spamd.conf.sample file. Copy then to spamd.conf file and
|
||||
edit to suit your needs.
|
||||
|
||||
3) mount fdescfs to /dev/fd with the following line in /etc/fstab
|
||||
fdescfs /dev/fd fdescfs rw 0 0
|
||||
|
||||
4) Add following lines to the pf.conf(5)
|
||||
|
||||
table <spamd-white> persist
|
||||
no rdr inet proto tcp from <spamd-white> to any \
|
||||
port smtp
|
||||
rdr pass inet proto tcp from any to any \
|
||||
port smtp -> 127.0.0.1 port spamd
|
||||
|
||||
!!!!!!!!!!!! -- I M P O T A N T - N O T E S -- !!!!!!!!!!!!!!!!!
|
||||
!
|
||||
! changes in Ver. 4.1.x:
|
||||
! - UID/GID is reserved to: _spamd:_spamd
|
||||
! check the owner of /var/db/spamd
|
||||
! - greylisting is now the default
|
||||
! - paramer: -b is now blacklist (Ver. < 4.1.x it is bind address)
|
||||
! - paramer: -l is now listen address
|
||||
! - spamdb: format is now HASH, helo/ehlo is also stored in db
|
||||
! convert will be done at the first start of spamd
|
||||
! if you have scripts that use spamdb review this scripts
|
||||
! - config files: new location is %%PREFIX%%/etc/spamd
|
||||
! - spamtrapp addresses: remove the surrounding '< >' signs
|
||||
! - pfspamd.sh was renamed to the obspamd
|
||||
! - IPFW support (beta) added to the sources.
|
||||
! See %%PREFIX%%/%%DOCSDIR%%/spamd-ipfw.txt for usage manual.
|
||||
!
|
||||
!!!!!!!!!!!! -- I M P O T A N T - N O T E S -- !!!!!!!!!!!!!!!!!
|
||||
|
||||
**********************************************************************
|
|
@ -1,17 +1,21 @@
|
|||
Tarpits like spamd are fake SMTP servers, which accept connections but don't
|
||||
deliver mail. Instead, they keep the connections open and reply very slowly.
|
||||
If the peer is patient enough to actually complete the SMTP dialogue (which
|
||||
will take ten minutes or more), the tarpit returns a 'temporary error' code
|
||||
(4xx), which indicates that the mail could not be delivered successfully and
|
||||
that the sender should keep the mail in his queue and retry again later. If
|
||||
he does, the same procedure repeats. Until, after several attempts, wasting
|
||||
both his queue space and socket handles for several days, he gives up. The
|
||||
resources I have to waste to do this are minimal.
|
||||
Spamd is a fake sendmail(8)-like daemon which rejects false mail. It is
|
||||
designed to be very efficient so that it does not slow down the receiving
|
||||
machine.
|
||||
|
||||
If the sender is badly configured, an uncooperative recipient might actually
|
||||
delay his entire queue handling for several minutes each time he connects to
|
||||
the tarpit. And many spammers use badly configured open relays
|
||||
spamd considers sending hosts to be of three types:
|
||||
|
||||
WWW: http://www.OpenBSD.org/spamd/
|
||||
blacklisted hosts are redirected to spamd and tarpitted i.e. they are
|
||||
communicated with very slowly to consume the sender's resources. Mail is
|
||||
rejected with either a 450 or 550 error message. A blacklisted host will not
|
||||
be allowed to talk to a real mail server.
|
||||
|
||||
whitelisted hosts do not talk to spamd. Their connections are instead sent to
|
||||
a real mail server, such as sendmail(8).
|
||||
|
||||
greylisted hosts are redirected to spamd, but spamd has not yet decided if
|
||||
they are likely spammers. They are given a temporary failure message by spamd
|
||||
when they try to deliver mail.
|
||||
|
||||
WWW: http://freebsdspamd.berlios.de/
|
||||
|
||||
-Max <max@love2party.net>
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
#!/bin/sh
|
||||
# an installation script for spamd copied from pf_freebsd
|
||||
|
||||
ask() {
|
||||
local question default answer
|
||||
|
||||
question=$1
|
||||
default=$2
|
||||
if [ -z "${PACKAGE_BUILDING}" ]; then
|
||||
read -p "${question} (y/n) [${default}]? " answer
|
||||
fi
|
||||
if [ x${answer} = x ]; then
|
||||
answer=${default}
|
||||
fi
|
||||
echo ${answer}
|
||||
}
|
||||
|
||||
yesno() {
|
||||
local dflt question answer
|
||||
|
||||
question=$1
|
||||
dflt=$2
|
||||
while :; do
|
||||
answer=$(ask "${question}" "${dflt}")
|
||||
case "${answer}" in
|
||||
[Yy]*) return 0;;
|
||||
[Nn]*) return 1;;
|
||||
esac
|
||||
echo "Please answer yes or no."
|
||||
done
|
||||
}
|
||||
|
||||
check_service() {
|
||||
local name number type comment
|
||||
|
||||
name=$1
|
||||
number=$2
|
||||
type=$3
|
||||
comment=$4
|
||||
|
||||
FILE="/etc/services"
|
||||
# check
|
||||
OK=no
|
||||
HAS_SERVICE=no
|
||||
COUNT=1
|
||||
for i in `grep $name $FILE `; do
|
||||
if [ $COUNT = 1 ] && [ X"$i" = X"$name" ]; then
|
||||
HAS_SERVICE=yes
|
||||
elif [ $COUNT = 2 ] && [ $HAS_SERVICE = yes ] && \
|
||||
[ X"$i" = X"$number/$type" ]; then
|
||||
OK=yes
|
||||
break
|
||||
fi
|
||||
COUNT=`expr ${COUNT} + 1`
|
||||
done
|
||||
# add an entry for SERVICE to /etc/services
|
||||
if [ $OK = no ]; then
|
||||
echo "This system has no entry for $name in ${FILE}"
|
||||
if yesno "Would you like to add it automatically?" y; then
|
||||
mv ${FILE} ${FILE}.bak
|
||||
(grep -v $name ${FILE}.bak ; \
|
||||
echo "$name $number/$type # $comment") \
|
||||
>> ${FILE}
|
||||
rm ${FILE}.bak
|
||||
else
|
||||
echo "Please add '$name $number/$type' into ${FILE}, and try again."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
case $2 in
|
||||
PRE-INSTALL)
|
||||
|
||||
if ! check_service spamd 8025 tcp "# spamd(8)"; then
|
||||
exit 1
|
||||
fi
|
||||
if ! check_service spamd-cfg 8026 tcp "# spamd(8) configuration"; then
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
esac
|
|
@ -1,9 +0,0 @@
|
|||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
In order to use spamd greylisting feature you have to have a mounted fdescfs(5)
|
||||
at /dev/fd. This is done by adding:
|
||||
|
||||
fdescfs /dev/fd fdescfs rw 0 0
|
||||
|
||||
to /etc/fstab. You may need either a customised kernel, or kldload the fdescfs
|
||||
kernel module.
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
@ -1,5 +0,0 @@
|
|||
libexec/spamd
|
||||
libexec/spamlogd
|
||||
sbin/spamd-setup
|
||||
sbin/spamdb
|
||||
etc/spamd.conf.sample
|
Loading…
Add table
Reference in a new issue