#!/bin/sh # # /etc/rc.d/init.d/vlan script # Marat "Billy" Bilialov, devel @ socket.ru, http://socket.ru/vlan-howto # Made of script by Doug Monroe doug @ planetconnect.com, http://www.planetconnect.com/vlan/ # Mar. 22, 2002 # To install under Redhat : chkconfig --add vlan # iptables: # chkconfig: - 99 10 # description: start/stop VLANs (with DHCPD) . /etc/rc.d/init.d/functions . /etc/sysconfig/vlans # # Важно: работает только с модифицированными скриптами: # /etc/rc.d/init.d/dhcpd # /etc/rc.d/init.d/iptables DHCPLIST="" # Список DNS-серверов для dhcpd DNSLIST="1.2.3.4, 5.6.7.8" ########################## START case $1 in start) # Сперва запустить ./iptables, чтобы очистить правила /etc/rc.d/init.d/iptables restart # eth1 - интерфейс локальной сети, eth0 идет в Интернет /sbin/ifconfig eth1 down /sbin/ifconfig eth1 up 192.168.1.254 # шлюз для администраторской сетки /sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.101 # это # нуждается в некотором объяснении. Так как я предпочитаю маскировать каждую виртуальную подсеть за # ИНДИВИДУАЛЬНЫМ IP-адресом (для отлова спамеров и продвинутых юзверей), на eth0 я поднимаю алиасы # 1.2.3.101...1.2.3.199 для подсетей 192.168.1.0...192.168.99.0 соответственно. # Так как iptables не понимает точек в именах интерфейсов, типа eth1.8, нужно указать vconfig-у # использовать "канонические" имена виртуальных интерфейсов, вроде vlan8. /usr/local/sbin/vconfig set_name_type VLAN_PLUS_VID_NO_PAD # Делаем конфиг для dhcpd echo "ddns-update-style ad-hoc;" > /tmp/vlan-dhcpd.conf # Динамический апдейт dns ######################### VLANs WITH DHCP for i in $VLAN_DHCP do action $"Creating VLAN $i..." /usr/local/sbin/vconfig add eth1 $i # Новые правила iptables для нового интерфейса. Не забывайте, что -I работает задом # наперед, т.е. правила надо указывать в обратной последовательности, первое - последним. # Посмотреть их можно командой '/sbin/iptables -nvL' # # Скрыть эту подсеть от остальных, но выпускать наружу: echo $"adding iptables rules for VLAN $i..." /sbin/iptables -I FORWARD -i vlan$i -o ! vlan$i -j DROP /sbin/iptables -I FORWARD -i vlan$i -o vlan$i -j ACCEPT /sbin/iptables -I FORWARD -i vlan$i -o eth0 -j ACCEPT /sbin/iptables -t nat -A POSTROUTING -s 192.168.$i.0/24 -o eth0 -j SNAT --to-source 1.2.3.1${i} # маскарад, о котором я говорил выше - смотрите на единичку перед {$i} в конце строки! # А теперь поднять интерфейс action $"bringing VLAN 5$i interface up..." /sbin/ifconfig vlan${i} up 192.168.${i}.254 # Добавить в список dhcp DHCPLIST="$DHCPLIST vlan$i" # Добавляем подсетки в наш dhcpd.conf echo "subnet 192.168.$i.0 netmask 255.255.255.0 { # --- default gateway option routers 192.168.$i.254; option subnet-mask 255.255.255.0; option domain-name-servers $DNSLIST; option time-offset -3; # Moscow Time range dynamic-bootp 192.168.$i.20 192.168.$i.240; # оставим IP адреса 1..19 на всякий случай default-lease-time 21600; max-lease-time 43200; }" >> /tmp/vlan-dhcpd.conf done ######################### VLANs WITHOUT DHCP for x in $VLAN_NO_DHCP do action $"Creating non-DHCP VLAN $x..." /usr/local/sbin/vconfig add eth1 $x # Новые правила iptables для нового интерфейса. Не забывайте, что -I работает задом # наперед, т.е. правила надо указывать в обратной последовательности, первое - последним. # Посмотреть их можно командой '/sbin/iptables -nvL' # # Скрыть эту подсеть от остальных, но выпускать наружу: echo $"adding iptables rules for VLAN $x..." /sbin/iptables -I FORWARD -i vlan$x -o ! vlan$x -j DROP /sbin/iptables -I FORWARD -i vlan$x -o vlan$x -j ACCEPT /sbin/iptables -I FORWARD -i vlan$x -o eth0 -j ACCEPT /sbin/iptables -t nat -A POSTROUTING -s 192.168.$x.0/24 -o eth0 -j SNAT --to-source 1.2.3.1${x} # А теперь поднять интерфейс action "bringing non-DHCP VLAN $x interface up..." /sbin/ifconfig vlan5$x up 192.168.${x}.254 done # Выгрузить dhcpd... if [ -f /var/lock/subsys/dhcpd ]; then /etc/rc.d/init.d/dhcpd stop fi # ...и поднять его с новым конфигом action $"Starting DHCP for $DHCPLIST" /etc/rc.d/init.d/dhcpd start "$DHCPLIST" # Убрать файл конфига, дабы не мешался mv /tmp/vlan-dhcpd.conf /tmp/vlan-dhcpd.conf-OLD # Запустить статистику /usr/local/sbin/fetchipac -S ;; ########################## STOP stop) # Убрать dhcpd action $"Stopping DHCP" /etc/rc.d/init.d/dhcpd stop # Очистить правила iptables /etc/rc.d/init.d/iptables stop # и убрать сделанные нами интерфейсы for i in `ls /proc/net/vlan|grep -v config` do action $"Removing VLAN interface $i" /usr/local/sbin/vconfig rem $i done ;; ########################## RESTART restart) $0 stop $0 start ;; ########################## USAGE *) echo "usage: $0 {start|stop|restart}" ;; esac