NAT not being kind... Any ideas?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Good Day ALL!!

Having a bit of a problem and figured someone on the list may have done this 
and can see the issue.

Setup:
FC4 and iptables 1.3.0
Plenty of memory and bandwidth...

ETH0 points to the Internet
ETH1 points Inside
BR0/TAP0 bridge the interfaces allowing OpenVPN to work

What does work...
We have a Bridge set up for OpenVPN on the same machine and that works fine.
Browsing and accessing the Internet works fine, both with and without the 
Transparent Squid Proxy on the same machine, from inside and from the Gateway.
Accessing the gateway machine from outside and inside works fine (SSH/DNS/etc)

Problem:
The problem is we cannot get NAT to work for any machines - we have 2 servers 
inside that need outside IPs for various reasons.
We assigned them Internet Accessible IPs and used 'ip add . . etc etc' to 
create the virtuals on the gateway machine - those IPs PING (but I suspect 
that it is the gateway responding).
The PREROUTING and POSTROUTING commands are below in the firewall script.

We have rebooted, reset and just about anything else you can think of. That 
included PORT FORWARDING individual ports - nothing seems to work. One server 
inside runs DNS services and we have been using that as a test, but we get "no 
servers responded' or 'no servers could be reached' when querying it from 
outside.

Could it be the bridging stopping/hindering this? What changes need to be made 
to allow this to work using the current configuration? There are no errors 
running the firewall script and through research - this setup SHOULD work.

Thanks in Advance!

Jerome

########################################################################
# FIREALL SCRIPT - IPTABLES

#!/bin/bash 

######################################################################### 
#                                                                       # 
#  I N I T I A L   S E T U P                                            # 
#                                                                       # 
######################################################################### 

PATH=/sbin:/bin        # Only path I need. 

# Interfaces and IPs
#--------------------- 

EXTIF="eth0" 
INTIF="! $EXTIF"        # Any non eth0 interface is trusted 
INTLAN="192.168.68.0/255.255.255.0" 
UNIV="0.0.0.0/0" 
EXTIP="XXX.194.217.190" 

EXTSRVR1="XXX.194.217.191"
EXTSRVR2="XXX.192.217.192"

INTSRVR1="192.168.68.200"
INTSRVR2="192.168.68.201"

# Check our connection 
#--------------------- 
#   echo "Firewall: Check our connection..." 
# 
#CHECK=`ifconfig | grep $EXTIF | awk '{ print $1 }'` 
#if [ -z $CHECK ]; then 
#   echo "Internet connection is down... exiting." 
#   exit 
#fi 

############################### 
# 
# K E R N E L   S E T T I N G S 
# 
############################### 

echo "Firewall: Enable Kernel Settings..." 

# Enable IP Forwarding, if it isn't already 
sysctl -w net.ipv4.ip_forward=1 >/dev/null 

# Enable TCP SYN Cookie protection: 
sysctl -w net.ipv4.tcp_syncookies=1 >/dev/null 

# Enabling dynamic TCP/IP address hacking. 
sysctl -w net.ipv4.ip_dynaddr=1 >/dev/null 

# Required for IPsec VPN 
#sysctl -w net.ipv4.conf.all.rp_filter=0 >/dev/null 
sysctl -w net.ipv4.conf.all.rp_filter=1 >/dev/null 

# Log spoofed, source-routed, and redirect packets 
sysctl -w net.ipv4.conf.all.log_martians=1 >/dev/null 

# Disable ICMP Re-directs 
sysctl -w net.ipv4.conf.all.accept_redirects=0 >/dev/null 
sysctl -w net.ipv4.conf.all.send_redirects=0 >/dev/null 

# Ensure that source-routed packets are dropped 
sysctl -w net.ipv4.conf.all.accept_source_route=0 >/dev/null 

# Disable ICMP broadcast echo protection 
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 >/dev/null 

# Enable bad error message protection 
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1 >/dev/null 

###################################################### 
# 
#  B A S I C   P O L I C I E S   A N D   M O D U L E S 
# 
###################################################### 

echo "Firewall: Init relevant modules..." 

# Initiate the relevant modules 
#------------------------------ 
modprobe ipt_LOG            # Add LOG target. 
modprobe ipt_REJECT         # Add REJECT target. 
modprobe ipt_MASQUERADE     # Add MASQUERADE target. 
modprobe ipt_owner          # Allows you to match for the owner. 
modprobe ip_conntrack       # Support connection tracking 
modprobe ip_conntrack_ftp   # Support connection tracking of FTP. 
modprobe iptable_filter 
modprobe iptable_mangle 
modprobe ipt_limit 
modprobe ipt_state 
modprobe ip_nat_ftp         # Active FTP 
modprobe ip_nat_irc         # IRC stuff 
modprobe iptable_nat        # Give us NATing 

# First clear everything 
#------------------------ 
echo "Firewall: First clear everything..." 

iptables --flush 
iptables -t nat --flush 
iptables -t mangle --flush 

for TABLE in filter nat mangle; do 
    iptables -t $TABLE -F     # Flush all previous rules. 
    iptables -t $TABLE -X     # Delete user-defined chains. 
done 

## Delete the chains now 
iptables --delete-chain 
iptables -t nat --delete-chain 
iptables -t mangle --delete-chain 

iptables -X 
iptables -t nat -X 
iptables -t mangle -X 

# Default policies 
#----------------- 
echo "Firewall: Set default policies..." 
 
iptables -P INPUT   DROP 
iptables -P OUTPUT  DROP 
iptables -P FORWARD DROP 

######################################## 
# 
#  U S E R  D E F I N E D   C H A I N S 
# 
######################################## 

# 
# Create the chains for valid src and valid dst 
# And verify them 
#------------------------------------------------- 
iptables -N valid-src 
iptables -N valid-dst 

echo "Firewall: Create chain 1 ..." 
iptables -A INPUT -i $EXTIF -j valid-src 
echo "Firewall: Create chain 2 ..." 
iptables -A FORWARD -i $EXTIF -j valid-src 
echo "Firewall: Create chain 3 ..." 
iptables -A OUTPUT -o $EXTIF -j valid-dst 
echo "Firewall: Create chain 4 ..." 
iptables -A FORWARD -o $EXTIF -j valid-dst 

#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
# 
# Source and Destination Address Sanity Checks 
# 
# Drop packets from networks covered in RFC 1918 (private nets) 
# Drop packets from external interface IP 
# 
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# 
echo "Firewall: valid-src rules ..." 
iptables -A valid-src -s $10.0.0.0/8     -j DROP 
iptables -A valid-src -s $172.16.0.0/12  -j DROP 
##iptables -A valid-src -s $192.168.0.0/16 -j DROP 
iptables -A valid-src -s $224.0.0.0/4    -j DROP 
iptables -A valid-src -s $240.0.0.0/5    -j DROP 
iptables -A valid-src -s $127.0.0.0/8    -j DROP 
iptables -A valid-src -s 0.0.0.0/8       -j DROP 
iptables -A valid-src -d 255.255.255.255 -j DROP 
iptables -A valid-src -s 169.254.0.0/16  -j DROP 
iptables -A valid-src -s $EXTIP          -j DROP 
echo "Firewall: valid-dst rules ..." 
iptables -A valid-dst -d $224.0.0.0/4    -j DROP 

######################################################################### 
#                                                                       # 
# I N P U T   R U L E S                                                 # 
#                                                                       # 
######################################################################### 

#-----------------------------------------------------------------------# 
# Incoming traffic on internal LAN                                      # 
#-----------------------------------------------------------------------# 

# Allow everything on our LAN 
#---------------------------- 
echo "Firewall Input Rules: Allow everything on our LAN..." 

iptables -A INPUT -j ACCEPT -i $INTIF 
iptables -A INPUT -j ACCEPT -i lo  # Somewhat redundant, but leave it. 

#-----------------------------------------------------------------------# 
# Incoming traffic on Internet interface                                # 
#-----------------------------------------------------------------------# 

# Add any real IPs behind the gateway here 
#----------------------------------------- 

# - If this box is sitting on an internal network, don't block these IPs 
# - Don't log these as drop-reserved... funny ISPs (@Home) to blame 
echo "Firewall: Check special IPs on internal network to NOT block..." 

#if [ "$CHKINT1" != "192.168" ]; then 
#     iptables -A INPUT -j DROP -i $EXTIF -s 192.168.0.0/16 
#fi 

# Allow some ICMP (ping) 
#----------------------- 
# ICMP can be used for attacks.. we allow as little as possible. 
# The following are necessary ports we can't do without: 
# 0  Needed to ping hosts outside the network. 
# 3  Needed by all networks. 
# 11 Needed by the traceroute program.      
echo "Firewall Input Rules: Allow some ICMP (ping)..." 

iptables -A INPUT -i $EXTIF -d $EXTIP -j ACCEPT -p icmp --icmp-type 0 
iptables -A INPUT -i $EXTIF -d $EXTIP -j ACCEPT -p icmp --icmp-type 3 
iptables -A INPUT -i $EXTIF -d $EXTIP -j ACCEPT -p icmp --icmp-type 11 

# This allows other hosts to ping you.  Remove it if you wish. 
iptables -A INPUT -i $EXTIF -d $EXTIP -j ACCEPT -p icmp --icmp-type 8 

# Allow DHCP client to respond 
#----------------------------- 
echo "Firewall Input Rules: Allow DHCP client to respond..." 

#iptables -A INPUT -j ACCEPT -i $EXTIF -p udp -d $EXTIP --dport 68 --sport 67 
#iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 68 --sport 67 

iptables -A INPUT -j ACCEPT -i $EXTIF -p udp -d $EXTIP --dport 123 --sport 123 
iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 123 --sport 123 

# Allow Sonicwall VPN client to respond 
#----------------------------- 
echo "Firewall Input Rules: Allow VPN client to respond..." 

#iptables -A INPUT -j ACCEPT -i $EXTIF -p udp -d $EXTIP \
#--dport 500 --sport 500 
#iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP \
#--dport 50 --sport 50 

# 
# Allow DNS 
#---------------------------------------------------------------------- 
echo "Firewall Input Rules: Allow DNS to respond..." 

iptables -A INPUT -p udp -i $EXTIF --sport 53 --dport 1024:65535 \ 
        -j ACCEPT 

#iptables -A INPUT -p udp -i br0 --sport 53 --dport 1024:65535 \ 
#         -j ACCEPT 

iptables -A INPUT -p udp -i $INTIF --sport 53 --dport 1024:65535 \ 
        -j ACCEPT 

# 
# Allow SSH in from certain IPs 
#----------------------------------------------------------------------- 
echo "Firewall Input Rules: Allow SSH to respond..." 

iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP \ 
        --dport 22 --sport 1024:65535 

iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP \ 
        --dport ftp --sport 1024:65535 

iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP \ 
        --dport ftp-data --sport 1024:65535 

# Allow ports for web server 
#--------------------------------------------------------- 
# 
# For advanced firewall configuration, feel free to add rules to your 
# liking... but be careful about security! 
# 
# This section of the firewall allows incoming connections on the 
# Internet interface.  You may also have to allow connections _out_... that 
# section is further below. 
# 
# - You may need to make changes to /etc/hosts.allow and /etc/xinetd.d. 
# - If you follow the same format and add your rules between the 
#   start/end tags, your changes will be reflected in the interface. 
# 
# start_input_rules (Do not delete this line - used by the interface) 
echo "Firewall Input Rules: Allow ports for web server..." 

## We do not run Web inside 
#iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 80 
#iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 81 
#iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 8080 

iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport https 

# SSH 
iptables -A INPUT -j ACCEPT -i $EXTIF -p tcp -d $EXTIP --dport 22 

# end_input_rules (Do not delete this line - used by the interface) 

# Block & log common drop-trojans and flooders - this list should be updated 

## REJECT IDENT and send back a nice message  :>) 
iptables -A INPUT -p tcp -m tcp --dport 113 -m limit --limit 1/min \
-j REJECT --reject-with icmp-proto-unreachable 

# Allow high ports 
#----------------- 
# Now that the services above have been blocked, we can enable the 
# high unprivileged ports to reply to TCP/UDP traffic. 
echo "Firewall Input Rules: Allow high ports..." 

iptables -A INPUT -j ACCEPT -p udp --dport 1024:65535 -d $EXTIP 
iptables -A INPUT -j ACCEPT -p tcp --dport 1024:65535 -d $EXTIP \ 
    -m state --state ESTABLISHED,RELATED 

# TAP BR Rules 
#----------------------- 
iptables -A INPUT -i tap0 -j ACCEPT 
iptables -A INPUT -i br0 -j ACCEPT 

# Block everything else 
#---------------------- 
echo "Firewall Input Rules: Block everything else..." 

iptables -A INPUT -j DROP -i $EXTIF -s $UNIV -d $UNIV 

######################################################################### 
#                                                                       # 
# O U T P U T   R U L E S                                               # 
#                                                                       # 
######################################################################### 

iptables -A OUTPUT -o $EXTIF -m state --state ESTABLISHED,RELATED \ 
    -j ACCEPT 

# Block drop-stuffed routing and masquerading packets 

#-----------------------------------------------------------------------# 
# Outgoing traffic on internal LAN                                      # 
#-----------------------------------------------------------------------# 

# Allow everything on the loopback, and LAN interface 
#---------------------------------------------------- 
echo "Firewall Output Rules: Allow everything on the loopback and LAN 
interface..." 

iptables -A OUTPUT -j ACCEPT -o lo 
iptables -A OUTPUT -j ACCEPT -o $INTIF 

#-----------------------------------------------------------------------# 
# Outgoing traffic on Internet interface                                # 
#-----------------------------------------------------------------------# 

# Allow all ICMP out 
#------------------- 
echo "Firewall Output Rules: Allow all ICMP out..." 

iptables -A OUTPUT -j ACCEPT -o $EXTIF -p icmp -s $EXTIP 

# Allow DHCP client to respond 
#----------------------------- 
echo "Firewall Output Rules: Allow DHCP client to respond..." 

#iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport 68 --dport 67 
#iptables -A OUTPUT -j ACCEPT -o $EXTIF -p udp -s $EXTIP --sport 68 --dport 67 

# Time protocol 
iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP \
--sport 123 --dport 123 
iptables -A OUTPUT -j ACCEPT -o $EXTIF -p udp -s $EXTIP \
--sport 123 --dport 123 

# Allow Sonicwall VPN client to respond 
#----------------------------- 
  echo "Firewall Input Rules: Allow VPN client to respond..." 

#iptables -A OUTPUT -j ACCEPT -o $EXTIF -p udp -s $EXTIP --dport 500 --sport 
500 
#iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --dport 50 --sport 50 

# Allow ports configured in the interface 
#--------------------------------------------------------- 
# 
# This section of the firewall allows outgoing connections on the 
# Internet interface.  You also have to allow connections _in_... that 
# section is above. 
# 
# See comments above. 
# 
# start_output_rules (Do not delete this line - used by the interface) 
echo "Firewall Output Rules: Allow outgoing connections on the internet 
interface..." 

#iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp --dport 113 

iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport http 
iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport https 
iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport tproxy 
iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport 8080 

iptables -A OUTPUT -j ACCEPT -o $EXTIF -p tcp -s $EXTIP --sport 22 

# 
# Allow DNS 
#------------------------------------------------------------------ 
echo "Firewall Output Rules: Allow DNS to respond..." 

iptables -A OUTPUT -p udp -o $EXTIF --dport 53 --sport 1024:65535 \ 
        -j ACCEPT 
      
iptables -A OUTPUT -p udp -o $INTIF --dport 53 --sport 1024:65535 \ 
        -j ACCEPT 

iptables -A OUTPUT -p udp -o $EXTIF --dport 1024:65535 --sport 53 \ 
        -j ACCEPT 

iptables -A OUTPUT -p udp -o $INTIF --dport 1024:65535 --sport 53 \ 
        -j ACCEPT 

# 
# Allow SSH in from certain IPs 
#----------------------------------------------------------------------- 

#iptables -A OUTPUT -p tcp -o $EXTIF --dport 22 --sport 1024:65535 \ 
#         -j ACCEPT 

# 
# Allow FTP Out 
#--------------------------------------------------------------------- 
iptables -A OUTPUT -p tcp -o $EXTIF --dport ftp --sport 1024:65535 \ 
        -j ACCEPT 

iptables -A OUTPUT -p tcp -o $EXTIF --dport ftp-data --sport 1024:65535 \ 
        -j ACCEPT 

# end_output_rules (Do not delete this line - used by the interface) 

# Allow high ports 
#----------------- 
# Allow unprivileged ports to reply to TCP/UDP traffic. 
echo "Firewall Output Rules: Allow high ports..." 

iptables -A OUTPUT -o $EXTIF -p tcp -j ACCEPT -s $EXTIP --sport 1024:65535 
iptables -A OUTPUT -o $EXTIF -p udp -j ACCEPT -s $EXTIP --sport 1024:65535 

# TAP Rules 
#------------------- 
iptables -A FORWARD -i br0 -j ACCEPT 

# Block everything else 
#---------------------- 
echo "Firewall Output Rules: Block everything else..." 

iptables -A OUTPUT -j DROP -o $EXTIF -s $UNIV -d $UNIV 

############################################################################ 
#                                                                          # 
#                            F O R W A R D I N G                           # 
#                                                                          # 
############################################################################ 

# Block services from leaving the LAN (low port numbers) 
# Snort will log suspicious traffic in high port ranges 

# Enable masquerading 
#-------------------- 
echo "Firewall Forwarding: Enable masquerading..." 

iptables -A POSTROUTING -t nat -j MASQUERADE -o $EXTIF 
iptables -A FORWARD -i $INTIF -j ACCEPT 
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -m limit --limit 5/minute --limit-burst 5 \ 
    -j LOG --log-level 4 --log-prefix "IPT FORWARD packet died: " 

#----------------------------------------------------------------------------- 
# NAT Forwarding 
# 
#----------------------------------------------------------------------------- 
echo "Firewall NAT Rules: PREROUTING NAT rules..." 

# PREROUTING statements for 1:1 NAT 

# (Connections originating from the Internet) 
iptables -t nat -A PREROUTING -p TCP -i $EXTIF -d $EXTSRVR1 \ 
-j DNAT --to-destination $INTSRVR1 

#iptables -t nat -A PREROUTING -p UDP -i $EXTIF -d $EXTSRVR1 \ 
#-j DNAT --to-destination $INTSRVR1 

iptables -t nat -A PREROUTING -p TCP -i $EXTIF -d $EXTSRVR2 \ 
-j DNAT --to-destination $INTSRVR2 

iptables -t nat -A PREROUTING -p UDP -i $EXTIF -d $EXTSRVR2 \ 
-j DNAT --to-destination $INTSRVR2 
      
# POSTROUTING statements for 1:1 NAT 
# (Connections originating from the home network servers) 
echo "Firewall NAT Rules: POSTROUTING NAT rules..." 

iptables -t nat -A POSTROUTING -s $INTSRVR1 -o $EXTIF \ 
     -j SNAT --to-source $EXTSRVR1 

iptables -t nat -A POSTROUTING -s $INTSRVR2 -o $EXTIF \ 
     -j SNAT --to-source $EXTSRVR2 
          
# POSTROUTING statements for Many:1 NAT 
# (Connections originating from the entire home network) 

#iptables -t nat -A POSTROUTING -s $INTLAN \ 
#       -j SNAT -o $INTIF --to-source $EXTIP 

iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $EXTIP 

# Allow forwarding to each of the servers configured for 1:1 NAT 
# (For connections originating from the Internet. Notice how you 
# use the real IP addresses here) 
echo "Firewall NAT Rules: FORWARD NAT rules..." 

iptables -A FORWARD -p tcp -i $EXTIF -o $INTIF -d $INTSRVR1 \ 
      -m multiport --dport 53,1433,1434,3389,3390,1720,1503,80,21,22 \ 
      -m state --state NEW -j ACCEPT 

#iptables -A FORWARD -p tcp -i $EXTIF -o $INTIF -d $INTSRVR2 \ 
#       -m multiport --dport 1433,1434,1720,1503,22 \ 
#       -m state --state NEW -j ACCEPT 
                              
# Allow forwarding for all New and Established SNAT connections 
# originating on the home network AND already established 
# DNAT connections 

iptables -A FORWARD -t filter -o $EXTIF -m state \ 
      --state NEW,ESTABLISHED,RELATED -j ACCEPT 

# Allow forwarding for all 1:1 NAT connections originating on 
# the Internet that have already passed through the NEW forwarding 
# statements above 

iptables -A FORWARD -t filter -i $EXTIF -m state \ 
       --state ESTABLISHED,RELATED -j ACCEPT 

#-----------------------------------------------------------------------------
- 
# Port Forwarding 
# 
# For basic firewall configuration, use the interface! 
#-----------------------------------------------------------------------------
- 

# start_portfw_rules (Do not delete this line - used by the interface) 
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE 

# end_portfw_rules (Do not delete this line - used by the interface) 

## SQUID proxy 
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128 

# Allow all other forwarding 
#--------------------------- 
# - You need this rule if you port forward packets to machines behind the 
#   gateway. 
echo "Firewall Forwarding: Allow all other forwarding..." 

iptables -A FORWARD -j ACCEPT 

#-----------------------------------------------------------------------------
- 
# 
# Allow the admin to block certain services (ICQ, etc) 
# 
#-----------------------------------------------------------------------------
- 

# start_blockport_rules (Do not delete this line - used by the interface) 
# end_blockport_rules (Do not delete this line - used by the interface) 

# start_blockurl_rules (Do not delete this line - used by the interface) 
# end_blockurl_rules (Do not delete this line - used by the interface) 


--
FRWS WebMail (http://www.frws.com)
Cause you deserve Spam and Virus free email...



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux