Click to See Complete Forum and Search --> : iptables gateway


lotsofstuff
12-13-2002, 08:41 AM
Hi again. I am trying to set up an internet gateway using iptables. Below is what I have tried, but to no avail. I presume that because it does not work, something is wrong or missing.

The rest of my network is functional, all clients are correctly configured to use this gateway.

iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

There are no other rules to conflict this configuration. eth0 is connected to the internet and eth1 to the LAN.

(I am using Slackware 8.1)

Please help me :)

bwkaz
01-10-2003, 01:45 PM
If you wouldn't mind waiting until Sunday or Monday (though it seems you've already waited quite some time...), I can post my iptables masqing script then. I don't have 'net access from the box that it's on until then, though.

I think that it looks like this, but don't quote me on it:

$IPTABLES -a FORWARD --in-interface $INTIF --out-interface $EXTIF -j ACCEPT
$IPTABLES -t nat -a <something other than postrouting, I think> -j MASQERADEIn other words, I think the chain in the nat table may be not-quite-right.

There may also be something with one of the /proc/sys/net files that I'm echoing.

lotsofstuff
01-10-2003, 02:20 PM
>If you wouldn't mind waiting until Sunday or Monday

I look forward to it :]

rioguia
01-10-2003, 02:56 PM
here is about the simplist IP tables i have seen.
don't be fooled by the length. most of this stuff will work automatically. this assumes that you have a 192.168.0.x network.

1. open a terminal as root and type
whereis iptables (you need to know where your ip tables are in order to invoke them. there are basically two options: /sbin/iptables or /usr/local/sbin/iptables. remember which of these options applies to you).

2. copy and paste the file below into the /etc/rc.d directory as rc.firewall-2.4_test

3. scroll down to lines 48 / 49. you will find the two iptables options we dicussed above. the default is for /usr/local/sbin/iptables but you probably need to comment this out (add a # to the beginning of the line) and delete the # on line 49 so that the script looks for /sbin/iptables.

4. cd into the /etc/rc.d directory

5. chmod 700 rc.firewall-2.4_test

6. sh rc.firewall-2.4_test

post back any error messages here.

rioguia
01-10-2003, 02:57 PM
source:
http://www.e-infomax.com/ipmasq/howto/c-html/firewall-examples.html#RC.FIREWALL-2.4.X
#!/bin/sh
#
# rc.firewall-2.4
FWVER=0.71
#
# Initial SIMPLE IP Masquerade test for 2.4.x kernels
# using IPTABLES.
#
# Once IP Masquerading has been tested, with this simple
# ruleset, it is highly recommended to use a stronger
# IPTABLES ruleset either given later in this HOWTO or
# from another reputable resource.
#
#
#
# Log:
# 0.71 - Added clarification that PPPoE users need to use
# "ppp0" instead of "eth0" for their external interface
# 0.70 - Added commented option for IRC nat module
# - Added additional use of environment variables
# - Added additional formatting
# 0.63 - Added support for the IRC IPTABLES module
# 0.62 - Fixed a typo on the MASQ enable line that used eth0
# instead of $EXTIF
# 0.61 - Changed the firewall to use variables for the internal
# and external interfaces.
# 0.60 - 0.50 had a mistake where the ruleset had a rule to DROP
# all forwarded packets but it didn't have a rule to ACCEPT
# any packets to be forwarded either
# - Load the ip_nat_ftp and ip_conntrack_ftp modules by default
# 0.50 - Initial draft
#

echo -e "\n\nLoading simple rc.firewall version $FWVER..\n"


# The location of the iptables and kernel module programs
#
# If your Linux distribution came with a copy of iptables,
# most likely all the programs will be located in /sbin. If
# you manually compiled iptables, the default location will
# be in /usr/local/sbin
#
# ** Please use the "whereis iptables" command to figure out
# ** where your copy is and change the path below to reflect
# ** your setup
#
#IPTABLES=/sbin/iptables
IPTABLES=/usr/local/sbin/iptables
DEPMOD=/sbin/depmod
INSMOD=/sbin/insmod


#Setting the EXTERNAL and INTERNAL interfaces for the network
#
# Each IP Masquerade network needs to have at least one
# external and one internal network. The external network
# is where the natting will occur and the internal network
# should preferably be addressed with a RFC1918 private address
# scheme.
#
# For this example, "eth0" is external and "eth1" is internal"
#
#
# NOTE: If this doesnt EXACTLY fit your configuration, you must
# change the EXTIF or INTIF variables above. For example:
#
# If you are a PPPoE or analog modem user:
#
# EXTIF="ppp0"
#
#
EXTIF="eth0"
INTIF="eth1"
echo " External Interface: $EXTIF"
echo " Internal Interface: $INTIF"



#================================================= =====================
#== No editing beyond this line is required for initial MASQ testing ==


echo -en " loading modules: "

# Need to verify that all modules have all required dependencies
#
echo " - Verifying that all kernel modules are ok"
$DEPMOD -a

# With the new IPTABLES code, the core MASQ functionality is now either
# modular or compiled into the kernel. This HOWTO shows ALL IPTABLES
# options as MODULES. If your kernel is compiled correctly, there is
# NO need to load the kernel modules manually.
#
# NOTE: The following items are listed ONLY for informational reasons.
# There is no reason to manual load these modules unless your
# kernel is either mis-configured or you intentionally disabled
# the kernel module autoloader.
#

# Upon the commands of starting up IP Masq on the server, the
# following kernel modules will be automatically loaded:
#
# NOTE: Only load the IP MASQ modules you need. All current IP MASQ
# modules are shown below but are commented out from loading.
# ================================================== =============

echo "----------------------------------------------------------------------"

#Load the main body of the IPTABLES module - "iptable"
# - Loaded automatically when the "iptables" command is invoked
#
# - Loaded manually to clean up kernel auto-loading timing issues
#
echo -en "ip_tables, "
$INSMOD ip_tables


#Load the IPTABLES filtering module - "iptable_filter"
# - Loaded automatically when filter policies are activated


#Load the stateful connection tracking framework - "ip_conntrack"
#
# The conntrack module in itself does nothing without other specific
# conntrack modules being loaded afterwards such as the "ip_conntrack_ftp"
# module
#
# - This module is loaded automatically when MASQ functionality is
# enabled
#
# - Loaded manually to clean up kernel auto-loading timing issues
#
echo -en "ip_conntrack, "
$INSMOD ip_conntrack


#Load the FTP tracking mechanism for full FTP tracking
#
# Enabled by default -- insert a "#" on the next line to deactivate
#
echo -en "ip_conntrack_ftp, "
$INSMOD ip_conntrack_ftp

rioguia
01-10-2003, 02:58 PM
#Load the IRC tracking mechanism for full IRC tracking
#
# Enabled by default -- insert a "#" on the next line to deactivate
#
echo -en "ip_conntrack_irc, "
$INSMOD ip_conntrack_irc


#Load the general IPTABLES NAT code - "iptable_nat"
# - Loaded automatically when MASQ functionality is turned on
#
# - Loaded manually to clean up kernel auto-loading timing issues
#
echo -en "iptable_nat, "
$INSMOD iptable_nat


#Loads the FTP NAT functionality into the core IPTABLES code
# Required to support non-PASV FTP.
#
# Enabled by default -- insert a "#" on the next line to deactivate
#
echo -en "ip_nat_ftp, "
$INSMOD ip_nat_ftp


#Loads the IRC NAT functionality into the core IPTABLES code
# Require to support NAT of IRC DCC requests
#
# Disabled by default -- remove the "#" on the next line to activate
#
#echo -e "ip_nat_irc"
#$INSMOD ip_nat_irc

echo "----------------------------------------------------------------------"

# Just to be complete, here is a list of the remaining kernel modules
# and their function. Please note that several modules should be only
# loaded by the correct master kernel module for proper operation.
# --------------------------------------------------------------------
#
# ipt_mark - this target marks a given packet for future action.
# This automatically loads the ipt_MARK module
#
# ipt_tcpmss - this target allows to manipulate the TCP MSS
# option for braindead remote firewalls.
# This automatically loads the ipt_TCPMSS module
#
# ipt_limit - this target allows for packets to be limited to
# to many hits per sec/min/hr
#
# ipt_multiport - this match allows for targets within a range
# of port numbers vs. listing each port individually

#
# ipt_state - this match allows to catch packets with various
# IP and TCP flags set/unset
#
# ipt_unclean - this match allows to catch packets that have invalid
# IP/TCP flags set
#
# iptable_filter - this module allows for packets to be DROPped,
# REJECTed, or LOGged. This module automatically
# loads the following modules:
#
# ipt_LOG - this target allows for packets to be
# logged
#
# ipt_REJECT - this target DROPs the packet and returns
# a configurable ICMP packet back to the
# sender.
#
# iptable_mangle - this target allows for packets to be manipulated
# for things like the TCPMSS option, etc.

echo ". Done loading modules."



#CRITICAL: Enable IP forwarding since it is disabled by default since
#
# Redhat Users: you may try changing the options in
# /etc/sysconfig/network from:
#
# FORWARD_IPV4=false
# to
# FORWARD_IPV4=true
#
echo " enabling forwarding.."
echo "1" > /proc/sys/net/ipv4/ip_forward


# Dynamic IP users:
#
# If you get your IP address dynamically from SLIP, PPP, or DHCP,
# enable this following option. This enables dynamic-address hacking
# which makes the life with Diald and similar programs much easier.
#
echo " enabling DynamicAddr.."
echo "1" > /proc/sys/net/ipv4/ip_dynaddr


# Enable simple IP forwarding and Masquerading
#
# NOTE: In IPTABLES speak, IP Masquerading is a form of SourceNAT or SNAT.
#
# NOTE #2: The following is an example for an internal LAN address in the
# 192.168.0.x network with a 255.255.255.0 or a "24" bit subnet mask
# connecting to the Internet on external interface "eth0". This
# example will MASQ internal traffic out to the Internet but not
# allow non-initiated traffic into your internal network.
#
#
# ** Please change the above network numbers, subnet mask, and your
# *** Internet connection interface name to match your setup
#


#Clearing any previous configuration
#
# Unless specified, the defaults for INPUT and OUTPUT is ACCEPT
# The default for FORWARD is DROP
#
echo " clearing any existing rules and setting default policy.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -t nat -F

echo " FWD: Allow all connections OUT and only existing and related ones IN"
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
$IPTABLES -A FORWARD -j LOG

echo " Enabling SNAT (MASQUERADE) functionality on $EXTIF"
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

echo -e "\nrc.firewall-2.4 v$FWVER done.\n"

lotsofstuff
01-10-2003, 03:58 PM
Hi. Thank you for your reply.

Unfortunately for me it defeats the purpose. The rules I posted above are the result of reading numerous documentation and the examination of various scripts, like the one you posted.

What I need to know is why my rules don’t work, then I can learn from that. A prefabricated solution only is not what I’m looking for.

Thanks, though.

jumpedintothefire
01-10-2003, 08:07 PM
------quote-----
iptables --append FORWARD --in-interface eth1 -j ACCEPT
----------------
Your only allowing traffic one-way....
compare that to the "prefabricated" rules that are in the forward area

bwkaz
01-12-2003, 09:58 PM
Yeah, mine has two rules for forwarding:

$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQERADE The first line is what you have -- accept (and forward) anything that needs to be forwarded. The second line is for the reply -- accept (and forward) any connection that's either already established, or related to another already-established connection, coming back. This is so that the external net can't forge packets to initialize connections with private-IP computers.

The third line enables masq'ing.

rioguia
01-14-2003, 04:23 PM
i appreciate your wanting to understand everything. i guess everyone has different learning styles. when i'm cooking a dish for the first couple of times, i use a recipe until i geta feel for things (and then i improvise like crazy).

slapNUT
01-14-2003, 10:18 PM
Sometimes you gotta ask seemingly stupid questions. Not to insult your intelligence but:
1. Do you get any errors when your iptables rules are entered?
2. Do you actually have the iptables ipt_MASQUERADE module loading when you type lsmod?
3. Do you see a 1 when you type this? cat /proc/sys/net/ipv4/ip_forward
4. Have you read the IP-Masquerade-HOWTO? <- rioguia got that firewall script from here.