pppoe we freebsd.pdf

(592 KB) Pobierz
232410604 UNPDF
Konfiguracja serwera pppoe we FreeBSD
© 2006-01-26 Bartek Siębab
Wstęp
W systemie FreeBSD instalacja serwera pppoe (ppp over ethernet) jest dość prosta i niezbyt
skomplikowana o ile zawczasu przygotujemy sobie koncepcję działania naszego środowiska.
Artykuł powstał na skutek inspiracji działającym rozwiązaniem projektu WARTA . Sama koncepcja
działania projektu jest słuszna jednakże wiele rzeczy należało zmienić i dostosować do wymagań
klienta. Opierając się na przemyśleniach jakie zostały opisane w projekcie WARTA postanowiłem
zbudować własne środowisko odpowiednio poprawione i rozbudowane. Z powodu problemów z
netgraph'em które pojawiły się przy próbie konfiguracji środowiska we FreeBSD 6.0 całość
instalacji przeprowadzono na wersji FreeBSD 4.11. Poniższy opis należy traktować jako "work in
progress" bowiem konfiguracja będzie wkrótce zmodyfikowana i przetestowana.
Wymagania
W pierwszym etapie wdrożenia założono iż nie będzie wykorzystywany serwer RADIUS jednakże
dalsza rozbudowa środowiska nie wyklucza jego użycia w przyszłości. Każdy klient podłączający
się do serwera powinien mieć zlimitowaną przepustowość (full duplex lub half duplex) zgodnie z
wykupionym pasmem. Klienci muszą być odseparowani od siebie. Połączenie musi być
autoryzowane protokołem MSChapV2 a sam transfer danych musi być szyfrowany.
Instalacja
Kernel
Przygotowanie kernela do kompilacji jest proste. Wystarczy skopiować kernel GENERIC na własną
nazwę i uzupełnić o wymagane składniki, jednocześnie pozbywając się niepotrzebnych:
$>cd /sys/i386/conf
$>cp GENERIC MYKERNEL
Usunięcie zbędnych rzeczy z kernela pozostawiam Twojemu rozsądkowi. To co dodatkowo
powinno się znaleźć w kernelu przedstawia poniższy listing:
# IPDIVERT enables the divert IP sockets, used by ``ipfw divert''
options IPDIVERT #divert sockets
# DUMMYNET enables the "dummynet" bandwidth limiter. You need
# IPFIREWALL as well. See the dummynet(4) and ipfw(8) manpages for
more info.
# When you run DUMMYNET it is advisable to also have "options
HZ=1000"
options DUMMYNET
options HZ=1000
options IPFIREWALL #firewall
options IPFIREWALL_VERBOSE #enable logging to
syslogd(8)
options IPFIREWALL_FORWARD #enable transparent proxy
support
options IPFIREWALL_VERBOSE_LIMIT=1000 #limit verbosity
#options IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by
default
options IPFW2 #see ipfw(8) howto make
ipfw2
Osobiście wolę kompilować kernel "starym" sposobem a zatem:
$>config -r MYKERNEL
$>cd ../../compile/MYKERNEL
$>make depend && make && make install
$>shutdown -r now
Trzeba pamiętać że od tego momentu po restarcie maszyny zadziała firewall (w zależności od
wpisów w /etc/rc.conf) co może skutkować odcięciem się od maszyny o ile robimy instalację
zdalnie. Jeśli jest potrzeba filtracji pakietów w drugiej warstwie OSI to możemy skompilować
kernel tak aby ipfw zawierał tą funkcjonalność (ipfw2) lecz nie będę opisywać tego co opisuje
manual w temacie skompilowania ipfw2.
Skrypty startowe
/etc/rc.conf
Konfiguracja kernela zawiera już niezbędne elementy jak divert, ipfw, dummynet zatem możemy
przystąpić do konfiguracji naszego firewalla. Przygotujemy własny skrypt ładujący regułki
firewalla zatem należy w /etc/rc.conf wskazać go jako nasz firewall. Ponadto uruchomimy od razu
NAT (natd). Poniżej interesujące nas fragmenty /etc/rc.conf:
ipv6_defaultrouter="NO" # Set to IPv6 default gateway (or
NO).
gateway_enable="YES" # Set to YES if this host will be a
gateway.
### Basic network and firewall/security options: ###
firewall_enable="YES" # Set to YES to enable firewall
functionality
firewall_script="/etc/regulki" # Which script to run to set up the
firewall
firewall_type="simple" # Firewall type (see
/etc/rc.firewall)
firewall_quiet="NO" # Set to YES to suppress rule
display
firewall_logging="YES" # Set to YES to enable events
logging
firewall_flags="" # Flags passed to ipfw when type is
a file
# natd
natd_program="/sbin/natd" # path to natd, if you want a
different one.
natd_enable="YES" # Enable natd (if firewall_enable
== YES).
natd_interface="fxp2" # Public interface or IPaddress to
use.
natd_flags="-f /etc/natd.conf" # Additional flags for natd.
# named. It may be possible to run named in a sandbox, man
security for
named_enable="YES" # Run named, the DNS server (or
NO).
named_program="/usr/sbin/named" # path to named, if you want a
different one.
named_flags="-u bind -g bind" # Flags for named
named_pidfile="/var/run/named/pid" # Must set this in named.conf
as well
# pppoed server
pppoed_enable="STANDALONE" # STANDALONE = run from
/usr/local/etc/rc.d/pppoed.sh .
pppoed_provider="*" # Provider and ppp(8) config
file entry.
pppoed_flags="-a isp -l default -P /var/run/pppoed.pid" #
Flags to pppoed (if enabled).
#pppoed_flags="-d -a isp -l default -P /var/run/pppoed.pid" #
Flags with pppoed debug
pppoed_interface="fxp1" #
The interface that pppoed runs on.
/usr/local/etc/rc.d/pppoed.sh
Wyjaśnienia wymaga ustawienie zmiennej pppoed_enable="STANDALONE". Skrypt startujący
pppoed we FreeBSd 4.x jest bardzo prymitywny dlatego napisałem własny który obsługuje start,
stop oraz restart daemona, zatem aby oryginalny skrypt "odczepił się" i nie startował nam pppoed
ustawiłem tą zmienną jako STANDALONE a w rzeczywistości pppoed jest uruchamiany z
/usr/local/etc/rc.d/pppoed.sh. Daemon pppoed samoczynnie przy pierwszym uruchomieniu załaduje
odpowiednie moduły netgraph do kernela. Poniżej kod źródłowy tego skryptu. Należy pamiętać o
ustawieniu prawa wykonywania na tym skrypcie tak aby przy starcie maszyny został nim
uruchomiony pppoed:
#!/bin/sh
# Suck in the configuration variables.
if [ -z "${source_rc_confs_defined}" ]; then
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
source_rc_confs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
fi
case ${pppoed_enable} in
[Ss][Tt][Aa][Nn][Dd][Aa][Ll][Oo][Nn][Ee])
case $1 in
[Ss][Tt][Aa][Rr][Tt])
if [ -n "${pppoed_provider}" ]; then
pppoed_flags="${pppoed_flags} -p ${pppoed_provider}"
fi
echo -n ' pppoed';
_opts=$-; set -f
/usr/libexec/pppoed ${pppoed_flags} ${pppoed_interface}
set +f; set -${_opts}
;;
[Rr][Ee][Ss][Tt][Aa][Rr][Tt])
killall -9 pppoed
rm -f /var/run/pppoed.pid
/usr/local/etc/rc.d/pppoed.sh start
;;
[Ss][Tt][Oo][Pp])
killall -9 pppoed
rm -f /var/run/pppoed.pid
;;
esac
;;
esac
/etc/natd.conf
Poniżej bardzo prosty plik konfigiguracji /etc/natd.conf:
use_sockets
same_ports
unregistered_only
/etc/regulki
Poniżej skrypt startujący firewall przygotowany w taki sposób aby połączenie klienta poprzez ppp
wstawiało nam w odpowiednich pozycjach dodatkowe regułki zezwalające na ruch do/z klienta oraz
limitujące jego transfer:
#
# Setup system for firewall service.
#
############
# Set quiet mode if requested
# fwcmd="/sbin/ipfw -q"
#
fwcmd="/sbin/ipfw"
# Suck in the configuration variables.
if [ -z "${source_rc_confs_defined}" ]; then
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
source_rc_confs
elif [ -r /etc/rc.conf ]; then
. /etc/rc.conf
fi
fi
setup_loopback () {
############
# Only in rare cases do you want to change these rules
#
${fwcmd} add 100 pass all from any to any via lo0
${fwcmd} add 200 deny log all from any to 127.0.0.0/8
${fwcmd} add 300 deny log ip from 127.0.0.0/8 to any
}
#######################################
# Flush out the list before we begin. #
# flushing rules
${fwcmd} -f flush
# flushing pipes
${fwcmd} -f pipe flush
# flushing queues
${fwcmd} -f queue flush
#######################################
# firewall interfaces
# wan przez dsl
oif="fxp2"
onet="83.x.y.z"
omask="255.255.255.248"
oip="83.x.y.v"
# lan
iif="fxp1"
inet="10.0.0.0"
imask="255.255.255.0"
iip="10.0.0.1"
##################################################################
####
# init loopback rules
setup_loopback
# Stop spoofing
${fwcmd} add deny log all from ${inet}:${imask} to any in via $
{oif}
${fwcmd} add deny log all from ${onet}:${omask} to any in via $
{iif}
# Stop RFC1918 nets on the outside interface
#${fwcmd} add deny log all from any to 10.0.0.0/8 via ${oif}
${fwcmd} add deny log all from any to 172.16.0.0/12 via ${oif}
${fwcmd} add deny log all from any to 192.168.0.0/16 via ${oif}
Zgłoś jeśli naruszono regulamin