Re: exim help needed
> Add a transport in the Transport section:
>
> tunneled_smtp:
> driver = smtp
> port = 6025
>
> Start the Router section with:
>
> smart_tunnel:
> driver = domainlist
> transport = tunneled_smtp
> self = send
> route_list = "* localhost byname"
>
> And of you go! That is, if the port is forwarded in time.
> It works here, but I give no garantees:)
Thanks for the response, I will try it out.
> Just curious, what tricks do you use to create this port forwarding?
> And is it created on the fly?
I create the pipes in /etc/network/interfaces:
up sleep 3 && /etc/init.d/tcp-pipes start && /usr/local/sbin/sync-date
down /etc/init.d/tcp-pipes stop
(don't remember what the 'sleep 3' is for..)
/etc/init.d/tcp-pipes is the script below. The command "msleep" is
just a C wrapper around usleep(3c). You can use "sleep" instead (but
maybe make the numbers smaller..)
-chris
#! /bin/sh
#
# Port forwarding to servers which would otherwise refuse connections from us
#
set -x
echo $*
NAME=`basename $0`
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SSH=/usr/bin/ssh2
SSHBASENAME=`basename ${SSH}`
SSHFLAGS="-f -x"
HOST=cascade.cs.ubc.ca
USER=majewski
start()
{
LOCALPORT=$1
DEST=$2
REMOTEPORT=$3
PIPE=$4
SSHARGS="${SSHFLAGS} -l ${USER} -L ${LOCALPORT}:${DEST}:${REMOTEPORT} ${HOST} ${PIPE}l"
PIDFILE=/var/run/${PIPE}-pipe.pid
if [ -e ${PIDFILE} ]; then
rm ${PIDFILE}
fi
if start-stop-daemon --start --verbose --background --make-pidfile --pidfile ${PIDFILE} --exec ${SSH} -- ${SSHARGS} 2>&1 | logger; then
fixpid ${PIPE} ${PIDFILE}
fi
}
# Wait for the PIDFILE to get the initial PID of the ssh process
# Wait for the ssh process to exec() to a different PID
# Put the new PID in the PIDFILE
fixpid()
{
PIPE=$1
PIDFILE=$2
PID=
NEWPID=
COUNT=1
MAXCOUNT=60
GOTCHA=false
while [ "${PID}" = "" ]; do
if [ ${COUNT} -gt ${MAXCOUNT} ]; then
logger "${NAME}: initial PID not found for ${PIPE}"
logger "${NAME}: continuing anyway..."
break
fi
if [ -e ${PIDFILE} ]; then
PID=`cat ${PIDFILE}`
fi
COUNT=`expr ${COUNT} + 1`
msleep 1
done
# sleep until the process with the old PID goes away
# can't use 'wait' because the ssh process is not our child
logger "Waiting for ${PIPE} pipe to fork"
COUNT=1
while ps h -o pid -p ${PID} >> /dev/null; do
if [ ${COUNT} -gt ${MAXCOUNT} ]; then
logger "${NAME}: new PID not found for ${PIPE}"
logger "${NAME}: continuing anyway..."
break
fi
COUNT=`expr ${COUNT} + 1`
GOTCHA=true
msleep 1
done
NEWPID=`ps h -C ${SSHBASENAME} | grep ${PIPE} | awk '{print $1}'`
if [ "${NEWPID}" = "" ]; then
logger "${NAME}: Empty PID, you may have to stop ${PIPE} manually later on"
else
echo ${NEWPID} > ${PIDFILE}
fi
}
stop()
{
PIPE=$1
PID=
logger "Stopping ${PIPE}"
PIDFILE=/var/run/${PIPE}-pipe.pid
start-stop-daemon --stop --verbose --pidfile ${PIDFILE}
if [ $? -ne 0 ]; then
PID=`ps h -C ${SSHBASENAME} | grep ${PIPE} | awk '{print $1}'`
if [ "${PID}" != "" ]; then
echo "Killing ${PIPE} pipe by brute force"
logger "${NAME}: Killing ${PIPE} pipe by brute force"
# ask process to die honorably
kill -TERM ${PID}
# coup de grace if necessary
PID=`ps h -C ${SSHBASENAME} | grep ${PIPE} | awk '{print $1}'`
if [ "${PID}" != "" ]; then
kill -KILL ${PID}
fi
else
logger "${NAME}: Couldn't find PID for ${PIPE}, not killing"
fi
fi
rm -f ${PIDFILE}
}
startImap()
{
logger "Starting IMAP pipe"
start 6143 imap.cs.ubc.ca 143 imap
}
startNntp()
{
logger "Starting NNTP pipe"
start 6119 news.cs.ubc.ca 119 nntp
}
startSmtp()
{
logger "Starting SMTP pipe"
start 6025 mailhost.cs.ubc.ca 25 smtp
}
startAll()
{
echo "Starting ${NAME}: "
startImap
startNntp
startSmtp
echo "${NAME}."
}
stopAll()
{
echo "Stopping ${NAME}: "
stop imap
stop nntp
stop smtp
echo "${NAME}."
}
case "$1" in
imap)
startImap
;;
nntp)
startNntp
;;
smtp)
startSmtp
;;
start)
startAll
;;
stop)
stopAll
;;
restart)
stopAll
startAll
;;
*)
N=/etc/init.d/${NAME}
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
# echo "Usage: $N {start|stop|restart|force-reload}" >&2
echo "Usage: $N {start|stop}" >&2
exit 1
;;
esac
exit 0
Reply to: