论坛风格切换切换到宽版
  • 1073阅读
  • 8回复

[问题求助]iptables + tc 对pppoe-server限速 [复制链接]

上一主题 下一主题
离线tantan886.
 
发帖
2044
C币
-140694
威望
374
贡献值
1
银元
-1
铜钱
4597
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
各位对iptabl.es + tc 对pppoe-server的每个客户.连接限速做过研究没? 有没经验能共享一下! 谢谢!健康

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线sfs041134.
发帖
2126
C币
-60295
威望
402
贡献值
1
银元
-1
铜钱
4790
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
Re:iptables
我试过用tc+iptables做限速,针对客户,需要对每个ip地址做规则,比较烦琐,不过很有效,没试在pppoe server上用

离线xky1314.
发帖
1951
C币
-61061
威望
356
贡献值
1
银元
0
铜钱
4258
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
仿佛 tc 只能用于标准以太网的情况,对于 PPP 封装的 PPPoE 二层帧,以及 802.1Q 帧都是无效的

离线yulingli.
发帖
1912
C币
-235952
威望
344
贡献值
2
银元
-2
铜钱
4187
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
Re:iptables
使用freebsd  的ipfw的pipe可以对pppoe进行限速, 想看看tc能否也可以!

离线zxlovest.
发帖
2235
C币
-60023
威望
421
贡献值
1
银元
-1
铜钱
5033
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-13
Re:iptables
可以去做个试验,然后告诉我们大家结果:)

发帖
2133
C币
-193311
威望
363
贡献值
1
银元
-2
铜钱
4686
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-13
Re:iptables


QUOTE:原帖由 ippen 于 2006-6-7 23:50 发表
我试过用tc+iptables做限速,针对客户,需要对每个ip地址做规则,比较烦琐,不过很有效,没试在pppoe server上用

这个我实现过! 现在是建了pppoe server, 再做限速!

发帖
2105
C币
-235376
威望
396
贡献值
1
银元
-1
铜钱
4796
人人网人气币
0
只看该作者 6楼 发表于: 2010-04-13
Re:iptables


QUOTE:原帖由 platinum 于 2006-6-8 10:41 发表
可以去做个试验,然后告诉我们大家结果:)



我用tc对pppoe server出现的客户生成的ppp1进行限制, 没效果!

对eth1( pppoe server  listen interface) 的出去包dst ip限制也没效果!

pppoe server 生成的通道不知能使用什么去管理???

离线xychina1006.
发帖
2047
C币
-198963
威望
352
贡献值
1
银元
-5
铜钱
4534
人人网人气币
0
只看该作者 7楼 发表于: 2010-04-13
Re:iptables
对,ppp1 上是 PPP 协议,eth1 上是 PPPoE 协议

离线bakkey.
发帖
2046
C币
-235861
威望
424
贡献值
1
银元
-6
铜钱
4679
人人网人气币
0
只看该作者 8楼 发表于: 2010-04-13
Re:iptables
Настройка 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-интерфейс как только приведу в божеский вид. Проект типа сделаю.
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个