> 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