Настройка PPPoE-сервера и демона pppd.
Здесь начинается самое сложное А именно найти radius.so под Вашу
версию pppd. В принципе можно пересобрать pppd из сырцов c поддержкой
mschap,mppe и библиотеку тоже. Короче эту часть я оставляю на откуп
Вам.
Вот линк:
http://www.opennet.ru/base/net/pptp_mppe_mppc.txt.html. Хоть там и про pptpd, но установка pppd таким же образом.
Если у вас лежит в /usr/lib/pppd/версия pppd/ библиотека radius.so, то
можно не беспокоиться и спокойно продолжать настройку дальше.
Ставим rp-pppoe.
Конфиг /etc/ppp/pppoe-server-options:
# PPP options for the PPPoE server
# LIC: GPL
logfile /var/log/pppoe.log
debug
mtu 1472
mru 1472
auth
require-pap
#require-chap
default-asyncmap
ktune
lcp-echo-interval 20
lcp-echo-failure 2
ms-dns 192.168.1.1
ms-dns ЗДЕСЬ IP ВАШЕГО ПРОВА
plugin radius.so
plugin radattr.so
192.168.2.1:
nobsdcomp
noccp
noendpoint
noipdefault
noipx
novj
receive-all
К конфиге /etc/ppp/options: lock
Для запуска сервера pppoe создадим скриптик pppoed запуска в
/etc/init.d
Скриптик для Suse. Для других систем подгоняйте сами
pppoed
#!/bin/bash
# init file for rp-pppoe server
#
# description: PPPOE kernel mode server
#
# processname: pppoe-server
# chkconfig: - 45 45
# source function library
. /etc/rc.status
case "$1" in
start)
echo -n "Starting PPPOE server: "
/usr/sbin/pppoe-server -I eth1 -L 192.168.2.1 -R 192.168.2.10
#Здесь eth1 - ваш pppoe server интерфейс
#192.168.2.1 - IP PPPoE сервера
#192.168.2.10 - Первый IP адрес клиента
touch /var/lock/subsys/pppoed
rc_status -v
;;
stop)
echo -n "Shutting down PPPOE server: "
killproc pppoe-server
rm -f /var/lock/subsys/pppoed
rc_status -v
;;
restart)
$0 stop
$0 start
;;
status)
status pppoe-server
;;
*)
echo "Usage: pppoed {start|stop|restart|status}"
exit 1
esac
exit 0
При желании вместо pppoe-server можно использовать pptpd. Опции
практически те же
Конфиги даны только с поддержкой PAP. При желании и возможностях можно
прикрутить и CHAP(MSCHAP).
Для проверки работает ли pppoe-сервер можно в файле
/etc/ppp/pppoe-server-options закомментировать строку "plugin
radius.so" и в файле /etc/ppp/pap-secrets написать
test * test 192.168.2.10
Запускаем pppoe-server: /etc/init.d/pppoed start
На любом клиенте создаем PPPoE соединение и используя логин\пароль
test подключаемся. Смотрим дал ли нам сервер ip 192.168.2.10, и есть
ли DNS-сервера и есть ли default route на 192.168.2.1
Если что не так копаем логи. После экспиримента строчку из pap-secrets
удалить, в файле /etc/ppp/pppoe-server-options строку "plugin
radius.so" разкомментировать и перезапустить pppoed.
Настройка HTB.
Подробнее о htb можно узнать здесь:
http://www.opennet.ru/base/net/htb_saga.txt.html Скрипт запуска htb можно скачать здесь:
http://freshmeat.net/projects/htb.init Копируем этот скрипт в /etc/init.d
Создаем директорию /etc/sysconfig/htb
Создаем там файлы:
ppp0
ppp0-2.root
ppp0-2:10.ppp
тут и прописывается ограничение пропускной способности для клиентов.
ppp0
DEFAULT=30
R2Q=10
ppp0-2.root
RATE=96Kbit
BURST=9k
ppp0-2:10.ppp
RATE=96Kbit
BURST=9k
LEAF=sfq
RULE=*,192.168.2.0/24
Эти файлы рассчитаны на пропуск примерно 11-12 kb\sec. Я не буду
рассказывать про то, как настраивается htb. Про это отлично написано в
статье, указанной выше.
Также я написал небольшой скриптик для того, чтобы создавать такие
файлы для всех интерфейсов ppp с 0 по 254
create.ppp.shapers
#!/bin/bash
COUNTER=1
while [ $COUNTER -lt 254 ]; do
echo Shaper for interface ppp$COUNTER created!
rm -f /etc/sysconfig/htb/ppp$COUNTER
rm -f /etc/sysconfig/htb/ppp$COUNTER-2.root
rm -f /etc/sysconfig/htb/ppp$COUNTER-2:10.ppp
cp /etc/sysconfig/htb/ppp0 /etc/sysconfig/htb/ppp$COUNTER
cp /etc/sysconfig/htb/ppp0-2.root
/etc/sysconfig/htb/ppp$COUNTER-2.root
cp /etc/sysconfig/htb/ppp0-2:10.ppp
/etc/sysconfig/htb/ppp$COUNTER-2:10.ppp
let COUNTER=COUNTER+1
done
/etc/init.d/htb.init restart
Т.е. для того чтобы изменить пропускную способность для всех, изменяем
всё что относится к ppp0, а потом запускаем скрипт.
Для того чтобы правила применялись при подключении клиента, необходимо
создать в директории /etc/ppp/ip-up.d скрипт shaper.start
#!/bin/bash
/etc/init.d/htb.init restart
а в директории /etc/ppp/ip-down.d скрипт shaper.stop
#!/bin/bash
/etc/init.d/htb.init restart
Настройка Iptables.
Вот скрипт, который я использую для настройки файрволла.
main.rules.iptables
#!/bin/sh
iptables --flush
iptables -t nat --flush
clear
######################################################################
#####
#
# 1. Configuration options.
#
#
# 1.1 Internet Configuration.
#
INET_IP="21x.9x.1xx.23"
INET_IFACE="eth0"
#
# 1.2 Local Area Network configuration.
#
#
LAN_IP="192.168.1.1"
LAN_IP_RANGE="192.168.1.0/24"
LAN_IFACE="eth1"
#
# 1.3 VPN Configuration.
#
VPN_IP="192.168.2.1"
VPN_IP_RANGE="192.168.2.0/24"
VPN_IFACE="ppp+"
#
# 1.4 Localhost Configuration.
#
LO_IFACE="lo"
LO_IP="127.0.0.1"
#
# 1.5 IPTables Configuration.
#
IPTABLES="iptables"
######################################################################
#####
#
# 2. Module loading.
#
/sbin/depmod -a
#
# 2.1 Required modules
#
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
#
# 2.2 Non-Required modules
#
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
######################################################################
#####
#
# 3. /proc set up.
#
#
# 3.1 Required proc configuration
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# 3.2 Non-Required proc configuration
#
#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
######################################################################
#####
#
# 4. rules set up.
#
######
# 4.1 Filter table
#
#
# 4.1.1 Set policies
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# 4.1.2 Create userspecified chains
#
$IPTABLES -N bad_tcp_packets
#
# Create separate chains for ICMP, TCP and UDP to traverse
#
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# 4.1.3 Create content in userspecified chains
#
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m \
state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j \
LOG --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#
# allowed chain
#
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# TCP rules
#
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 25 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
#
# UDP ports
#
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT
#
# ICMP rules
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# 4.1.4 INPUT chain
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Rules for special networks not part of the Internet
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
#$IPTABLES -A INPUT -p ALL -i $VPN_IFACE -s $VPN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $VPN_IP -j ACCEPT
#
# Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
#
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT
#
# Rules for incoming packets from the internet.
#
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#
#SQUID
#
$IPTABLES -A INPUT -s 192.168.1.0/24 -p tcp --dport 3128 -j DROP
#$IPTABLES -A INPUT -p tcp --dport 3128 -s 192.168.2.0/24 -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT INPUT packet died: "
#
# 4.1.5 FORWARD chain
#
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
#
# Accept the packets we actually want to forward
#
$IPTABLES -A FORWARD -s 192.168.1.10 -d 192.168.0.1 -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#
# 4.1.6 OUTPUT chain
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Special OUTPUT rules to decide which IP's to allow.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $VPN_IP -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
######
# 4.2 nat table
#
#
# 4.2.1 POSTROUTING chain
#
#
# Enable simple IP Forwarding and Network Address Translation
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source
$INET_IP
$IPTABLES -t nat -A PREROUTING -i $VPN_IFACE -d ! $VPN_IP_RANGE -p tcp \
--dport 80 -j REDIRECT --to-port 3128
Кроме того, чтобы пользователя пускало в сеть надо добавлять при
каждом его входе правило в FORWARD и INPUT цепочки с его ip адресом, а
также удалять их, когда пользователь отсоеденился. Для этого делаем
скрипты:
/etc/ppp/ip-up.d/iptables
#!/bin/bash
IPT=/usr/sbin/iptables
UIP=$5
$IPT -A FORWARD -s $UIP -j ACCEPT
$IPT -A INPUT -s $UIP -j ACCEPT
/etc/ppp/ip-down.d/iptables
#!/bin/bash
IPT=/usr/sbin/iptables
UIP=$5
$IPT -D FORWARD -s $UIP -j ACCEPT
$IPT -D INPUT -s $UIP -j ACCEPT
Кстати, мысль для создания собственного биллинга: громим правило из
скрипта(который кроном проходит по базе трафика и лимитов) при
привышении лимита, пишем в базу пользователей что этот юзер залочен.
Трафик перестает бежать, пользователь пытается переподключится и
получает ошибку о неправильном логине\пароле, т.к. его аккаунт
заблокирован. Я так и сделал, возможно, даже выложу скрипты и
Web-интерфейс как только приведу в божеский вид. Проект типа сделаю.