Създаване на 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 |