SASA DESIGN

Open Your mind, Open Your Source Code!

Създаване на LAN Gateway с DHCP, динамичен DNS и Iptables на Debian Etch

15 юли, 2008 – 12:18 pm

Линукс е добра платформа за да действа като маршрутизатор/gateway. В това ръководство ще се опитам да обясня, как да се създаде линукс машина за да функционира като мрежов маршрутизатор. Линукс маршрутизатора ще предостави следните услуги:

  • DHCP сървър за предоставяне на адреси на машини в локалната мрежа
  • DNS сървър за разрешаване / resolve имена на домейни
  • Gateway с Iptables за достъп до интернет
  • Защитна стена (Firewall) с Iptables

Тъй като машината ще работи като рутер / защитна стена това ръководство се основава на Debian Etch 4,0 R3, минимално инсталиране на мрежата.

Машината има два мрежови интерфейси:

  • eth0: 192.168.10.2 и който е свързан към интернет (макар и не директно, но това е полето, което е за маршрутизация на трафика към интернет за тази LAN)
  • eth1: 192.168.2.1, това е интерфейсът свързан към нашата локалната мрежа, която ще предаде на трафика от и към интернет.

Също така, ще се управлява домейн lan.sasa.local, така че всяка машина ще могат да комуникират един с друг с помощта на своите хост.

Така че, първо, нека започнем със създаването на bind9

1. DNS сървър

За DNS сървър ще се използва bind9, тя ще бъде конфигурирана за разрешаване/resolv на име на хост за нашата мрежа lan.sasa.local.

DNS сървърът също ще разрешава динамично DNS обновяване от нашия DHCP сървър.

В това ръководство ще използвам динамичен DNS възможността на bind.

1.1. Инсталиране на DNS сървър

# apt-get install bind9

1.2. Конфигуриране на DNS сървър

За да запазим дефаулт инсталираните файлове чисти ще редактираме само /etc/bind/named.conf.local . В този файл ще разрешим DNS update чрез използването на „rndc-key“ (което идва с инсталацията на bind9) от локал хост.

Също ще дефинираме две зони:

  • lan.sasa.local : нашият локален домейн
  • 2.168.192.in-addr.arpa : IP зона локалната мрежа

Нека сега да редактираме /etc/bind/named.conf.local и да добавим:

#allow dns updates from localhost with key "rndc-key"
include "/etc/bind/rndc.key";
controls {
  inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; };
};

#defines lan.sasa.local
zone "lan.sasa.local" {
  type master;
    file "db.lan.sasa.local";
    allow-update { key "rndc-key"; };
};

#defines our local subnet 192.168.2.0/24
zone "2.168.192.in-addr.arpa" {
  type master;
  notify no;
  file "db.2.168.192";
  allow-update { key "rndc-key"; };
};

Сега трябва да създадем тези два файла /var/cache/bind/db.lan.sasa.local и /var/cache/bind/db.2.168.192

Първият ще се използва за resolv на имената и второто ще се използва за reverse name lookup

/var/cache/bind/db.lan.sasa.local ще изглежда така:

;
; Zone file for lan.sasa.local
;
; The full zone file
;
$TTL 3D
@       IN      SOA     ns.lan.sasa.local. postmaster.lan.sasa.local. (
    200806281; serial, todays date + todays serial #
    8H              ; refresh, seconds
    2H              ; retry, seconds
    4W              ; expire, seconds
    1D )            ; minimum, seconds
;
    NS      ns              ; Inet Address of name server
    MX      10 mail         ; Primary Mail Exchanger
;
    A 192.168.2.1  ; IP address
;
router A   192.168.2.1
ns    CNAME router
dhcp  CNAME ns.lan.sasa.local.
*     A       192.168.2.1

А пък /var/cache/bind/db.2.168.192 ще изглежда така:

$TTL 3D
@       IN      SOA     lan.sasa.local. postmaster.lan.sasa.local. (
  200806281 ; serial, todays date + todays serial #
  8H              ; refresh, seconds
  2H              ; retry, seconds
  4W              ; expire, seconds
  1D )            ; minimum, seconds
;
@       IN      NS      ns.lan.sasa.local.
@ IN  PTR lan.sasa.local.

1 IN PTR  router.lan.sasa.local.

В lan.sasa.local дефинирахме стандартен bind header и накои статични хостове в нашата мрежа.Като: router, ns, dhcp
В зона 2.168.192.in-addr.arpa дефинирахме reverse lookup name за IP 192.168.2.1

Трабва да сте уверени че папката която съдържа дб файловете да е writable. Защото ще имаме нужда да създадем журнални файлове за да
заработи DDNS.

На последно място само трябва да рестартирате bind9. Ако нещо не е наред най добрият ви приятел е /var/log/syslog заедно с google :)

/etc/init.d/bind9 restart

2. DHCP сървър

С цел да предоставим IP адреси на другите машини в мрежата трябва да използваме DHCP сървър.

2.1. Инсталация на DHCP сървър

Ще инсталираме DHCP сървъра пакета което е под името dhcp3-server . За инсталация просто напишете следната команда в конзолата:

# apt-get install dhcp3-server

Уверете се че инсталирате dhcp3-server пакета а не само dhcp. Защото по нататък няма да има поддръжка за обновяване на динамичен DNS.

2.2. Конфигурация на DHCP сървър

Цялата конфигурация е под /etc/dhcp3/dhcpd.conf

В нашата конфигурация ние искаме range 192.168.2.0/24 и за домейн име да ни е lan.sasa.local

За DHCP ние ще слушаме само eth1 интерфейса. За тази цел трябва да редактираме /etc/default/dhcp3-server и да сме сигурни че INTERFACES променливата е зададена като следното:

...
...
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".

INTERFACES="eth1"

Също редактираме и /etc/dhcp3/dhcpd.conf трябва да изглежда като следното:

#naming the server
# and enabling ddns
server-identifier router;
authoritative;

ddns-update-style interim;

include "/etc/bind/rndc.key";

# Use what key in what zone
zone lan.sasa.local. {
  primary 127.0.0.1;
  key "rndc-key";
}

#Standard DHCP info
option domain-name "lan.sasa.local";
option domain-name-servers ns.lan.sasa.local;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.5 192.168.2.200;
  option routers  router.lan.sasa.local;
  zone    2.168.192.in-addr.arpa. {
    primary ns.lan.sasa.local;
    key             "rndc-key";
  }
  zone    lan.sasa.local. {
    primary ns.lan.sasa.local;
    key             "rndc-key";
  }

}

Което казва че ние осигуряваме IP от диапазона 192.168.2.5 до 192.168.2.200, както и трафика за тази мрежа ще бъде отправено чрез router.lan.sasa.local

Според тази конфигурация домейн името е lan.debuntu.local и за сървър се използва ns.lan.debuntu.local

Сега вече нашият DHCP сървър е готов. Време е да го рестартираме.

# /etc/init.d/dhcp3-server restart

Ако нещо се обърка и не бъде наред /var/log/messages, /var/log/syslog и /var/log/daemon.log са твоите най добри прятели.

На този етап нашата машина е в състояние да предостави IP адреси на всички хостове в мрежата. Да им предостави домейн име за обслужване и всички компютри в мрежата трябва да могат да комуникират един с дръг чрез хост имената си.

Но с изключение на gateway-a нито един от хостовете не може да се свърже към интернет. Това вече е ролята на Iptables което ще го опишем в следващия раздел.

3. Пренасочване на интернет трафика с IPtables

IPtables се използва комбинирано да действа като защитна стена и също за преминаващи пакети от една мрежа в друга.

3.1. Активиране на IP forwarding

IP forwarding е активиран като kernel level. Един от начините е да активирате /proc/sys/net/ipv4/ip_forward променливата да бъде 1

Това може да постигнете като напишете на конзолата следното:

# echo 1 > /proc/sys/net/ipv4/ip_forward

За да бъдат промените в сила трябва машината да рестартирате като дадете reboot и да се уверите че файлът /etc/sysctl.conf е като следното:

net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1

3.2. Задаване на iptables правила:

Следващата стъпка е да зададем правила за iptables. Тук трябва да кажем на кернел какво трябва да направи с пакети в зависимост от правилата.

Тази защитна стена ще разреши само SSH конекциите идващи от WAN. Каквото и да е от локалната мрежа и порт 2222 от WAN ще бъде пренасочен към машината 192.168.2.2 на порт 22.

Ето и скрипта:

#!/bin/sh
#
# this script requires iptables package to be
# installed on your machine

# Where to find iptables binary
IPT="/sbin/iptables"
# The network interface you will use
# WAN is the one connected to the internet
# LAN the one connected to your local network
WAN="eth0"
LAN="eth1"
# First we need to clear up any existing firewall rules
# and chain which might have been created
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X

# Default policies: Drop any incoming packets
# accept the rest.
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT

# To be able to forward traffic from your LAN
# to the Internet, we need to tell the kernel
# to allow ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Masquerading will make machines from the LAN
# look like if they were the router
$IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE

$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 2222 -j DNAT --to-destination 192.168.2.2:22
$IPT -A FORWARD -i $WAN -p tcp  --dport 22 -m state --state NEW -j ACCEPT

# Do not allow other new or invalid connections to reach your internal network
$IPT -A FORWARD -i $WAN -m state --state NEW,INVALID -j DROP

# Accept any connections from the local machine
$IPT -A INPUT -i lo -j ACCEPT
# plus from your local network
$IPT -A INPUT -i $LAN -j ACCEPT

# log those packets and inform the sender that the packet was rejected
$IPT -N Rejectwall
$IPT -A Rejectwall -m limit --limit 10/minute -j LOG --log-prefix "Rejectwall: "
$IPT -A Rejectwall -j REJECT
# use the following instead if you want to simulate that the host is not reachable
# for fun though
#$IPT -A Rejectwall -j REJECT  --reject-with icmp-host-unreachable

$IPT -A INPUT -p icmp -j ACCEPT

# Accept ssh connections from the Internet
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT

# or only accept from a certain ip
#$IPT -A INPUT -i $WAN -s 125.124.123.122 -p tcp --dport 22 -j ACCEPT

# Accept related and established connections
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Drop netbios from the outside, no log, just drop
$IPT -A INPUT -p udp --sport 137 --dport 137 -j DROP

# Finally, anything which was not allowed yet
# is going to go through our Rejectwall rule

$IPT -A INPUT -j Rejectwall

Сега стартираме скрипта:

# sh iptables.sh

Всички хостове в локалната мрежа вече ще имат достъп до интернет. Сега трабва да се уверим дали промените след рестарт ще са трайни.

3.3. Устойчивост на iptables правилата

Ето и скрипт за лесно стартиране и спиране на iptables чрез изполването на init.d

Ето и скрипта което може да го копирате на /etc/init.d/iptables :

#!/bin/sh

IPTABLES="/sbin/iptables"

# load options
if [ -f /etc/default/iptables ] ; then
  . /etc/default/iptables
else
  exit 1
fi

# Check for daemon presence
test -x ${IPTABLES} || exit 0

# Get lsb functions
. /lib/lsb/init-functions
. /etc/default/rcS

# Check for saved state
if [ x$1 != "xsave" ] && [ x$1 = "xstart" ] && ! test -r ${IPTABLES_SAVE}; then
  log_warning_msg "Skipping iptables configuration..."
  exit 0
fi

flush() {
  if [ -f /proc/net/ip_tables_names ] ; then
    for table in `cat /proc/net/ip_tables_names`; do
      ${IPTABLES} -F -t $table
      ${IPTABLES} -X -t $table
      if [ $table = nat ]; then
        ${IPTABLES} -t nat -P PREROUTING ACCEPT
        ${IPTABLES} -t nat -P POSTROUTING ACCEPT
        ${IPTABLES} -t nat -P OUTPUT ACCEPT
      elif [ $table = mangle ]; then
        ${IPTABLES} -t mangle -P PREROUTING ACCEPT
        ${IPTABLES} -t mangle -P INPUT ACCEPT
        ${IPTABLES} -t mangle -P FORWARD ACCEPT
        ${IPTABLES} -t mangle -P OUTPUT ACCEPT
        ${IPTABLES} -t mangle -P POSTROUTING ACCEPT
      elif [ $table = filter ]; then
        ${IPTABLES} -t filter -P INPUT ACCEPT
        ${IPTABLES} -t filter -P FORWARD ACCEPT
        ${IPTABLES} -t filter -P OUTPUT ACCEPT
      fi
    done
  fi
  return 0
}

case "$1" in
  start)
  log_begin_msg "Loading iptables settings..."
  ${IPTABLES}-restore ${SAVE_RESTORE_OPTIONS} ${IPTABLES_SAVE}
  log_end_msg $?
  ;;
  save)
  log_begin_msg "Saving iptables settings..."
  ${IPTABLES}-save ${SAVE_RESTORE_OPTIONS} > ${IPTABLES_SAVE}
  log_end_msg $?
  ;;
  stop)
  log_begin_msg "Clearing iptables settings..."
  flush
  log_end_msg $?
  ;;
  restart)
  $0 stop
  $0 start
  ;;
  status)
  ${IPTABLES} -L
  ;;
  *)
  log_success_msg "Usage: $0 {start|stop|restart|status|save}"
  exit 1

esac

и друг на /etc/default/iptables :

IPTABLES_SAVE="/etc/iptables-rules"

SAVE_RESTORE_OPTIONS="-c"

На последно място запишете правилата:

# /etc/init.d/iptables save

Също трябва да се уверим че, след рестартиране на системата услугата ще се включи автоматично. Чрез използването на следната команда:

# update-rc.d iptables defaults 20

Ето че имаме работеща машина чрез която имаме пълен достъп към интернет.

4. Проблеми?

Ще намерите лесно за използване да инсталирате пакетите dnsutils, telnet, tcpdump и nmap за да имате представа за ставащото в сървъра.

Вашите най добри приятели ще са /var/log, daemon.log и syslog.

Може да свалите файловете които са използват в статията;

Attachment Size
etc-default-iptables 62 bytes
init.d-iptables 1.76 KB
iptables.sh.txt 2.24 KB

Напиши коментар