Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
allowing outbound smtp -IPTABLES question
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Networking & Security
View previous topic :: View next topic  
Author Message
grooveman
Veteran
Veteran


Joined: 24 Feb 2003
Posts: 1217

PostPosted: Mon Jun 13, 2005 8:01 pm    Post subject: allowing outbound smtp -IPTABLES question Reply with quote

Hello. I am having surprising difficulties allowing outbound smtp through my firewall. I do not want any smtp traffic coming into this network, only out going.

I am basing my firewall script off of what is recommended in the Gentoo Security HowTo, with a few modifications:

Code:

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=x
DNS2=x
#inside
IIP=10.0.0.1
IINTERFACE=eth2
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=x
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net
}

rules() {
  stop
  ebegin "Setting internal rules"
  echo "1" >/proc/sys/net/ipv4/ip_forward

  einfo "Setting default rule to drop"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #default rule
  einfo "Creating states chain"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #Route http/https to webserver
  $IPTABLES -t nat -A PREROUTING -p TCP -i $OINTERFACE --dport 80 -j DNAT --to-destination 10.0.0.2
  $IPTABLES -A FORWARD -p TCP -i $OINTERFACE --dport 80 -j ACCEPT
  $IPTABLES -A INPUT -p TCP -d $OIP -s 0/0 --dport 80 -j ACCEPT
  $IPTABLES -t nat -A PREROUTING -p TCP -i $OINTERFACE --dport 443 -j DNAT --to-destination 10.0.0.2
  $IPTABLES -A FORWARD -p TCP -i $OINTERFACE --dport 443 -j ACCEPT
  $IPTABLES -A INPUT -p TCP -d $OIP -s 0/0 --dport 443 -j ACCEPT

  #ICMP traffic
  einfo "Creating icmp chain"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -p icmp -s 63.103.232.252 -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -i $IINTERFACE -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state RELATED,ESTABLISHED -p icmp -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Incoming traffic
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood protection
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport 9622 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport 9622 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport 9622 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport 9622 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport 22 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport 22 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport 22 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport 22 -j ACCEPT

  #outgoing traffic
  einfo "Creating outgoing ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport 9622 -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport 22 -j ACCEPT

  #FTP traffic
  $IPTABLES -N allow-ftp-traffic
  $IPTABLES -F allow-ftp-traffic
  $IPTABLES -A allow-ftp-traffic -m state --state RELATED,ESTABLISHED -p tcp --dport ftp -j ACCEPT
  $IPTABLES -A allow-ftp-traffic -p tcp --dport ftp -j ACCEPT

  #ALLOW NTP
  $IPTABLES -N allow-ntp-traffic
  $IPTABLES -F allow-ntp-traffic
  $IPTABLES -A allow-ntp-traffic -p udp --dport 123 -j ACCEPT
  #$IPTABLES -A allow-ntp-traffic -p tcp --dport 123 -j ACCEPT

  #einfo "Creating outgoing dns traffic chain"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -m state --state RELATED,ESTABLISHED -p tcp --dport domain -j ACCEPT

  #einfo "Creating outgoing smtp traffic chain"
  $IPTABLES -N allow-smtp-out
  $IPTABLES -F allow-smtp-out
  $IPTABLES -A allow-smtp-out -p tcp -i $IINTERFACE --dport smtp -j ACCEPT
  $IPTABLES -A allow-smtp-out -m state --state RELATED,ESTABLISHED -p tcp --dport smtp -j ACCEPT


  einfo "Creating outgoing http/https traffic chain"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport 443 -j ACCEPT

  #Catch portscanners
  einfo "Creating portscan detection chain"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Apply and add invalid states to the chains
  einfo "Applying chains to INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allow-ftp-traffic
  $IPTABLES -A INPUT -j allow-ntp-traffic
  $IPTABLES -A INPUT -j allowed-connection
  $IPTABLES -A INPUT -j allow-smtp-out

  einfo "Applying chains to FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allow-dns-traffic-out
  $IPTABLES -A FORWARD -j allow-ftp-traffic
  $IPTABLES -A FORWARD -j allow-ntp-traffic
  $IPTABLES -A FORWARD -j allowed-connection
  $IPTABLES -A FORWARD -j allow-smtp-out

  einfo "Applying chains to OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allow-ftp-traffic
  $IPTABLES -A OUTPUT -j allow-ntp-traffic
  $IPTABLES -A OUTPUT -j allowed-connection
  $IPTABLES -A OUTPUT -j allow-smtp-out

  #Allow client to route through via NAT (Network Address Translation)
  $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE
  $IPTABLES -A FORWARD -p TCP -i $IINTERFACE -j ACCEPT
  eend $?
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Stopping firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setting panic rules"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Saving Firewall rules"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restoring Firewall rules"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      will restore setting if exists else force rules"
  echo "stop)       delete all rules and set all to accept"
  echo "rules)      force settings of new rules"
  echo "save)       will store settings in ${FIREWALL}"
  echo "restore)    will restore settings from ${FIREWALL}"
  echo "showstatus) Shows the status"
}


You can see what I am trying to do here:
Code:

#einfo "Creating outgoing smtp traffic chain"
  $IPTABLES -N allow-smtp-out
  $IPTABLES -F allow-smtp-out
  $IPTABLES -A allow-smtp-out -p tcp -i $IINTERFACE --dport smtp -j ACCEPT
  $IPTABLES -A allow-smtp-out -m state --state RELATED,ESTABLISHED -p tcp --dport smtp -j ACCEPT


But it is not working. If I try to send a test email 'mail -s "test" me@here.com', I get this error:
Code:
send-mail: Cannot open here.com


If I take down the firewall, it works just fine, so I am certain it is a firewall issue. I want to be able to send emails from the firewall machines, and the machines that are natted behind it.

Anyone?

Thanks!
_________________
To look without without looking within is like looking without without looking at all.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Networking & Security All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum