Page 1 of 6 123 ... LastLast
Results 1 to 10 of 53

Thread: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

  1. #1
    Join Date
    Nov 2005
    Beans
    22

    Post

    HOWTO-Ubuntu internet router, Firewall,DHCP,DNS,NAT
    By: Ellias, special thanks to Mips
    Original Thread: http://ubuntuforums.org/showthread.php?t=89320

    This tutorial will go over all the steps one must take in order to set-up routing on a Linux box. There are some minimum requirements you must have in order to follow this tutorial to its completion. First you need a PC with Linux on it, the examples I will be giving are based off the Ubuntu distribution, but my examples should work on most other Debian based distributions and only slight modifications are needed to get it to work with Red Hat, etc... Second, you need two NICs. In my examples I will be showing how to do this with three NICs, 1 external and 2 internal. You probably need two cross-over cables to connect from PC to PC and one straight-through to connect from PC to modem, router, or switch (that will be on your external NIC). I say probably because some more advanced NICs support automatic conversion between the two. Thirdly, you need a somewhat working knowledge of Linux and networking in general, I will be covering a wide range of networking topics that are necessary to gain router functionality. Now before we get our feet wet, disclaimer time...

    I am not responsible for any damage done to your computers and/or network. By following the instructions in this document you agree to these terms and recognize that you are solely responsible for what you do while following the instructions. Furthermore, the scripts provided here should NOT be used for a production and/or business environment. They are not secure and further modification would be needed in order to make them so. These instructions are for home use, educational purposes only.

    There, now here is the setup I will be referring to in this document.

    Internet
    |
    L Router (192.168.0.1) ----- PC's connected to router
    |
    |
    Switch (typical 4 port) ----- PC's connect to switch
    |
    |
    Our Linux Box with Ubuntu Linux (connected to switch as well)
    (3 NICs)
    L eth2 (192.168.0.103) via DHCP from Router above.
    L eth1 (192.168.1.1 ) Statically assigned --------- Connecting PC
    L eth2 (192.168.2.1) Statically assigned --------- Connecting PC

    Do a quick ifconfig to verify you have the setup correct (subnet mask is 255.255.255.0).

    Also, here are a few troubleshooting programs I recommend getting ahold of...
    sudo apt-get install traceroute
    sudo apt-get install build-essential (C compiler for ethereal)
    sudo apt-get install ethereal

    Ok, so you've got things setup and ready to go. Now you need a way for the PCs connecting to the Linux box to get an IP address. For this we can use the DHCP server that comes with Linux. If you don't already have this a simple 'sudo apt-get install dhcp3-server' should get it for you just fine.

    Once this is done you're going to have to configure it. The base of this configuration file was taken from Sean O'Donnell http://code.seanodonnell.com, but modified to fit our configuration here.

    So type.... 'vim /etc/dhcp3/dhcpd.conf'
    and put the following in there (numbers may need to be tweaked for your setup)

    dhcpd.conf
    Code:
    # Configuration file for ISC dhcpd (see 'man dhcpd.conf')
    #
    # For more information regarding the ISC DHCP Daemon,
    # please visit: http://www.isc.org/sw/dhcp/
    #
    ##########################################################
    #
    # Configuration Notes:
    #
    # This configuration file assumes that you
    # have a total of 4 NIC cards installed on your system,
    # with eth2 connecting (as a client) to a remote dhcp server. 
    #
    # This will assign a dhcp subnet to each additional NIC card
    # (eth1, eth0), which can be used to create a
    # multi-subnet DHCP Server.
    #
    # Example by: Sean O'Donnell http://code.seanodonnell.com
    #
    ##########################################################
    #
    # DHCP CLIENT CONFIGURATION SETTINGS
    #
    
    # use ad-hoc style name server updating procedures
    ddns-update-style ad-hoc; 
    
    # this may be required for some network configurations,
    # but seems to work fine without it on my LAN.
    option domain-name "my-dhcp-server.com";
    
    #assign the remote dhcp server hostname/ip addresses 
    option domain-name-servers 192.168.1.1, 192.168.2.1;
    
    ##########################################################
    #
    # DHCP SERVER CONFIGURATION SETTINGS 
    #
    
    # assign the defaul lease time (seconds)
    default-lease-time 600000000;
    
    # assign the max lease time (seconds)
    max-lease-time 720000000;
    
    # eth0 subnet configuration
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.2 192.168.1.99;
      option routers 192.168.1.1;
      option broadcast-address 192.168.1.255;
    }
    
    # eth1 subnet configuration
    subnet 192.168.2.0 netmask 255.255.255.0 {
      range 192.168.2.2 192.168.2.99;
      option routers 192.168.2.1;
      option broadcast-address 192.168.2.255;
    }
    
    ##########################################################
    # end config
    Now to modify the /etc/default/dhcp3-server file to include eth1 at the bottom...

    dhcp3-server
    Code:
    # Defaults for dhcp initscript
    # sourced by /etc/init.d/dhcp
    # installed at /etc/default/dhcp3-server by the maintainer scripts
    
    #
    # This is a POSIX shell fragment
    #
    
    # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? 
    #       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
    INTERFACES="eth0 eth1"
    Now restart the DHCP server by typing ' sudo /etc/init.d/dhcp3-server restart '

    After that try resolving an IP with the connecting PC's (remember to use crossover cables when connecting). If you got IP's on both of the subnetted PC's great, thats a big step. If not, go back and check that your configs match your current set-up. Use the 'ifconfig' command to check if you are using the right IP addresses.

    Once you've got it working your ready to now setup DNS. DNS is a snap, all you should need to do is type, 'sudo apt-get install bind9'. Boom you have a small DNS server on you box! This is so computers connecting to your router will be able to resolve web addresses based on their URL instead of their IP. For example...

    instead of typing traceroute 216.239.37.147 you can type traceroute www.google.com and still gain the same functionality! (You won't be able to do that quite yet since the connecting PC's don't have internet access, yet).

    Now there is just one more thing needed, and thats a script enabling IP Masquerade. I was able to figure this out by consulting.... (by the way I highly recommended reading over their site, it's very comprehensive and was a key part in me figuring out how to get this to work).

    http://www.tldp.org/HOWTO/IP-Masquerade-HOWTO/

    by slightly modifying their example script I came up with this...

    masqueradescript.sh
    Code:
    #!/bin/sh
    #
    #firewall-iptables
    FWVER= 0.76
    #
    #               Initial SIMPLE IP Masquerade test for 2.6 / 2.4 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.76 - Added comments on why the default policy is ACCEPT
    #       0.75 - Added more kernel modules to the comments section 
    #       0.74 - the ruleset now uses modprobe vs. insmod
    #       0.73 - REJECT is not a legal policy yet; back to DROP
    #       0.72 - Changed the default block behavior to REJECT not DROP
    #       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-iptables 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
    MODPROBE=/sbin/modprobe
    
    
    #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="eth2"
    INTIF="eth1"
    INTIF2="eth0"
    echo "   External Interface:  $EXTIF"
    echo "   Internal Interface:  $INTIF"
    echo "   Internal Interface:  $INTIF2" 
    
    EXTIP="your external IP address"
    echo "   External IP:  $EXTIP"
    
    #======================================================================
    #== 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, "
    $MODPROBE 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, " 
    $MODPROBE 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, " 
    $MODPROBE ip_conntrack_ftp
    
    
    #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, " 
    $MODPROBE 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, "
    $MODPROBE 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, "
    $MODPROBE ip_nat_ftp
    
    
    #Loads the IRC NAT functionality into the core IPTABLES code
    # Required to support NAT of IRC DCC requests
    #
    # Disabled by default -- remove the "#" on the next line to activate 
    #
    #echo -e "ip_nat_irc"
    #$MODPROBE ip_nat_irc
    
    echo "----------------------------------------------------------------------"
    
    # Just to be complete, here is a partial list of some of the other 
    # IPTABLES kernel modules and their function.  Please note that most
    # of these modules (the ipt ones) are automatically loaded by the
    # master kernel module for proper operation and don't need to be
    # manually loaded. 
    # --------------------------------------------------------------------
    #
    #    ip_nat_snmp_basic - this module allows for proper NATing of some
    #                        SNMP traffic
    #
    #    iptable_mangle    - this target allows for packets to be
    #                        manipulated for things like the TCPMSS
    #                        option, etc.
    #
    # --
    #
    #    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.
    #
    
    echo -e "   Done loading modules.\n"
    
    
    
    #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 (REJECT is not a valid policy)
    #
    #   Isn't ACCEPT insecure?  To some degree, YES, but this is our testing 
    #   phase.  Once we know that IPMASQ is working well, I recommend you run
    #   the rc.firewall-*-stronger rulesets which set the defaults to DROP but
    #   also include the critical additional rulesets to still let you connect to 
    #   the IPMASQ server, etc.
    #
    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
    $IPTABLES -A FORWARD -i $EXTIF -o $INTIF2 -m state --state ESTABLISHED,RELATED \-j ACCEPT
    $IPTABLES -A FORWARD -i $INTIF -o $INTIF2 -m state --state ESTABLISHED,RELATED \-j ACCEPT 
    $IPTABLES -A FORWARD -i $INTIF2 -o $INTIF -m state --state ESTABLISHED,RELATED \-j ACCEPT
    $IPTABLES -A FORWARD -i $INTIF2 -o $EXTIF -j ACCEPT
    $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
    
    
    echo "   Enabling SNAT (MASQUERADE) functionality on $EXTIF"
    $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
    
    echo -e "\nrc.firewall-iptables v$FWVER done.\n"
    Notice the top, you will have to set the external IP address to whatever it is for this to work. In this example it's eth2's IP. I realize that this is quite a long script but I left the comments in there because they explain what's going on in the script (remember the point of this is to learn).
    Now run the shell script, 'sh scriptname' and your connecting PCs should have Internet access! If not, check out the script and see if everything is configured appropriately (particularly the path to Iptables). Consult

    http://www.tldp.org/HOWTO/IP-Masquerade-HOWTO/

    for further troubleshooting techniques.

    Now assuming that everything is in order and working properly, we want to make our new script bootable so we don't have to run the script every time we restart.

    Type: cp 'scriptname' /etc/init.d/'scriptname'

    This copies the script to the init.d directory where other scripts are run at bootup. Now that that is out of the way, we need to make a symbolic link in the rc2.d directory pointing to the script we stored in the init.d directory.

    Type: ln -s /etc/init.d/'scriptname' /etc/rc2.d/S95masquradescript

    Presto, restart your computer and test to see if you still have the same functionality. If so then congratulations! If not then make sure you followed the above correctly so the script is bootable.

    Additional thanks to the webmasters of the URLs mentioned in this tutorial. Each site was a great aid. I hope this tutorial was an aid in you understanding linux and networking.

    Take Care!

  2. #2
    Join Date
    Apr 2006
    Beans
    1
    Distro
    Dapper Drake Testing/

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    Excelent stuff! Got me up and running in >10 minuntes.

    one little adition;

    taken from http://www.aboutdebian.com/proxy.htm

    you could set

    EXTIP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"

    where eth0 is the external NIC to get the most up to date ip assigned by the ISP (this is in the case that like mine, your ISP has a knack for regularly changing your asigned dynamic IP), it also makes the box kinda hot plugable.

  3. #3
    Join Date
    Feb 2005
    Location
    New Jersey
    Beans
    84
    Distro
    Edubuntu 12.04 Precise Pangolin

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    It worked for me too. Thank you so much for all the work.

  4. #4
    Join Date
    Mar 2005
    Location
    Texas
    Beans
    3
    Distro
    Ubuntu 6.06

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    To fit your own example, shouldn't that first eth2 be eth0?

    Our Linux Box with Ubuntu Linux (connected to switch as well)
    (3 NICs)
    L eth2 (192.168.0.103) via DHCP from Router above.
    L eth1 (192.168.1.1 ) Statically assigned --------- Connecting PC
    L eth2 (192.168.2.1) Statically assigned --------- Connecting PC
    And then again in the masquerade script...where eth2 and eth0 are switched

    EXTIF="eth2"
    INTIF="eth1"
    INTIF2="eth0"
    echo " External Interface: $EXTIF"
    echo " Internal Interface: $INTIF"
    echo " Internal Interface: $INTIF2"

    EXTIP="your external IP address"
    Thanks! This was just what I was looking for.

  5. #5
    Join Date
    Jul 2006
    Beans
    17

    Cool Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    ok well u seem like u know what is going on ... i dont im a noob... ok i have an eth0 and an ath0 and im trying to run the wireless connection from my ath0 to my eth0 to connect it to my ps2 i have the special "switch cable" or whatever but im afraid it doesnt work all the way...all the time...i use firestarter and it all seems to work great ...sometimes see the connection works all the way my ps2 can connect the the internet but DNS fails..it gets to where i can get in the lobby but when i try to view the list of games or join a game it says an error occured ...so it seems that its unstable or something...it gets so close like i can chat and all that but im almost sure its somehting with the DNS cause thats the step it messes up on most of the time. Sometimes sonys DNAS fails but i dont think thats related... when i try to get into a game it gives me an error of something with the DNS . my brother told me i needed to ask about masq and get something...i dont know what to get i tried searching in synaptic but i dont really know what to install or really how to use it...i would really appriciate some help. i am not sure what DHCP or DNS or even Masq really is...thanks
    Last edited by willneedshelp...; September 1st, 2006 at 07:30 AM.

  6. #6
    Join Date
    Sep 2006
    Beans
    1

    Question Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    What would it take to make this a more secure solution for a business environment?

  7. #7
    Join Date
    Jun 2005
    Location
    Umeå, Sweden
    Beans
    475
    Distro
    Ubuntu 12.10 Quantal Quetzal

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    How about a HowTo for setting up Ubuntu as a router for IPv6?

    I want to use regular IP (v4?) on the internet side and use IPv6 in my home LAN. But it is really difficult to find info on how to set that up.
    Just trying to help...

  8. #8
    Join Date
    Aug 2005
    Beans
    6,024

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    The last time Ellias posted here was in Jan. Dunno if he still visits here.

  9. #9
    Join Date
    Aug 2005
    Beans
    6,024

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    Quote Originally Posted by todw1fd View Post
    To fit your own example, shouldn't that first eth2 be eth0?



    And then again in the masquerade script...where eth2 and eth0 are switched



    Thanks! This was just what I was looking for.
    Does not really matter, it's just a number.

  10. #10
    Join Date
    Aug 2005
    Beans
    6,024

    Re: HOWTO: Ubuntu internet router: IPTables,DHCP,DNS,& IP Masq

    Quote Originally Posted by basketcase39 View Post
    What would it take to make this a more secure solution for a business environment?
    I would look at a minimal OpenBSD install and look at hardening the box. The firewall in openbsd is also slightly different. If I was you I would do some googling.

Page 1 of 6 123 ... LastLast

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •