cipipi
05-01-2009, 16:22
Преамбула:
Есть некий пров N, который для абонентов с прямыми подключением и внешними стат. IP не делает разграничения между локальным и внешним трафиком. Хотел это побороть. Зная, что на последней миле ходят пакеты от локальной сети 10.64.20.0/24 + IP всех мучеников с вешним статическим, я мог потенциально стать участником локальной сети, если правильно пропишу локальный IP, локальный шлюз + настрою роуты. Их я выяснил.
$2=10.64.20.11/24 -- мой локальный IP (любой свободный)
$3=10.64.20.1/24 -- шлюз
$4=10.64.20.255 -- Broadcast
Написал скрипт поднятия алиаса на WLANe (с коментами не проверял работоспособность):
#!/bin/sh
#Имя файла конфигурации iptables
NAME_IPTBL_ORIG=".iptbl.orig"
#МикроHELP
echo "wlan-alias [up|down] [Local IP] [Local Gate] [Local Broadcast]"
#Подсети где прячутся DC++, FTP сервера (ну понятно какой провайдер)
subnet1="212.1.226.0"
subnet2="212.1.224.0"
#Аргументов у вызова скрипта нет - ничего не делаем
if [ -z $1 ]; then
echo "Nothing to be done!!!"
exit 1
fi;
#Поднимаем алиас на WLANe
if [ $1 = "up" ]; then
#Если файл настроек iptables есть, то уже поднято - ничего не делаем
[ -f $NAME_IPTBL_ORIG ] && exit 1
#Если нехватает аргументов вызова, то ничего не делаем
[ -z $2 ] && exit 1
[ -z $3 ] && exit 1
[ -z $4 ] && exit 1
#Сохраняем таблицу iptables в файл
iptables-save >> $NAME_IPTBL_ORIG
#Собственно поднимаем второй IP (алиас) на WLANe
ifconfig vlan1:0 $2 netmask 255.255.255.0 broadcast $4
#прописываем в таблице маршрутизации локальный шлюз
route add $3 dev vlan1:0
#регистрируем локальную сеть в маршрутах
route add -net 10.0.0.0 netmask 255.0.0.0 gw $3 dev vlan1:0
#регистрируем дополнительные локальные подсети не из диапазона 10.0.0.0/8
#route add -net $subnet1 netmask 255.255.255.0 gw $3 dev vlan1:0
#route add -net $subnet2 netmask 255.255.255.0 gw $3 dev vlan1:0
#настраиваем маскарадиг + перенаправления на открытые порты (VSERVER)
#настораживает, что на вторую строчку iptables выдает варнинг на название интерфейса
iptables -t nat -A PREROUTING -d $2 -j VSERVER
iptables -t nat -A POSTROUTING -s ! $2 -o vlan1:0 -j MASQUERADE
echo "Alias on WLAN is open"
exit 0
fi;
#Закрываем алиас на WLANe
if [ $1 = "down" ]; then
#Если конфига iptables нет, то обратно восстанавливать не будем. Да поможет великий reboot
if [ ! -f $NAME_IPTBL_ORIG ]; then
echo "ERROR: Has no original iptables save file!!"
exit 1
fi;
#Кладем алиас. Автоматически снимаются прописанные в таблице маршруты
ifconfig vlan1:0 down
#Все правила в iptables нафиг очищаем (навсякий, т.к. не разбирался).
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables -X
#потом восстанавливаем оригинальные правила до поднятия алиаса
iptables-restore $NAME_IPTBL_ORIG
#удаляем файл оригинальной конфигурации iptables
rm $NAME_IPTBL_ORIG
echo "Alias on WLAN is closed"
exit 0
fi;
exit 0
Таблица маршрутизации до запуска скрипта
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
INET GW 0.0.0.0 255.255.255.255 UH 0 0 0 vlan1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
INET SUBNET 0.0.0.0 255.255.255.112 U 0 0 0 vlan1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 INET GW 0.0.0.0 UG 0 0 0 vlan1
Таблица маршрутизации после запуска скрипта
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.64.20.1 * 255.255.255.255 UH 0 0 0 vlan1
INET GW * 255.255.255.255 UH 0 0 0 vlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 br0
INET SUBNET * 255.255.255.112 U 0 0 0 vlan1
10.64.20.0 * 255.255.255.0 U 0 0 0 vlan1
subnet1 10.64.20.1 255.255.255.0 UG 0 0 0 vlan1
subnet2 10.64.20.1 255.255.255.0 UG 0 0 0 vlan1
10.0.0.0 10.64.20.1 255.0.0.0 UG 0 0 0 vlan1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default INET GW 0.0.0.0 UG 0 0 0 vlan1
, где INET GW - интернетский шлюз для моего статичесого IP,
INET SUBNET - адресное пространство в котором распологается мой стат внешний IP.
Запустил. Проверил. Интерфейс vlan1:0 поднялся. Дополнительные рауты в таблице маршрутизации появились.
Полез с моей машины 196.168.0.0/24 конектиться к локальному DC серверу, который находится в subnet1=212.1.226.0/24 (ну вы поняли, что за провайдер N ;) )
Сервер DC при соединении отписал мой внешний IP
(в настройках DC клиента установил адрес 10.64.20.11 - адрес алиаса).
Что я делаю не так?
Есть некий пров N, который для абонентов с прямыми подключением и внешними стат. IP не делает разграничения между локальным и внешним трафиком. Хотел это побороть. Зная, что на последней миле ходят пакеты от локальной сети 10.64.20.0/24 + IP всех мучеников с вешним статическим, я мог потенциально стать участником локальной сети, если правильно пропишу локальный IP, локальный шлюз + настрою роуты. Их я выяснил.
$2=10.64.20.11/24 -- мой локальный IP (любой свободный)
$3=10.64.20.1/24 -- шлюз
$4=10.64.20.255 -- Broadcast
Написал скрипт поднятия алиаса на WLANe (с коментами не проверял работоспособность):
#!/bin/sh
#Имя файла конфигурации iptables
NAME_IPTBL_ORIG=".iptbl.orig"
#МикроHELP
echo "wlan-alias [up|down] [Local IP] [Local Gate] [Local Broadcast]"
#Подсети где прячутся DC++, FTP сервера (ну понятно какой провайдер)
subnet1="212.1.226.0"
subnet2="212.1.224.0"
#Аргументов у вызова скрипта нет - ничего не делаем
if [ -z $1 ]; then
echo "Nothing to be done!!!"
exit 1
fi;
#Поднимаем алиас на WLANe
if [ $1 = "up" ]; then
#Если файл настроек iptables есть, то уже поднято - ничего не делаем
[ -f $NAME_IPTBL_ORIG ] && exit 1
#Если нехватает аргументов вызова, то ничего не делаем
[ -z $2 ] && exit 1
[ -z $3 ] && exit 1
[ -z $4 ] && exit 1
#Сохраняем таблицу iptables в файл
iptables-save >> $NAME_IPTBL_ORIG
#Собственно поднимаем второй IP (алиас) на WLANe
ifconfig vlan1:0 $2 netmask 255.255.255.0 broadcast $4
#прописываем в таблице маршрутизации локальный шлюз
route add $3 dev vlan1:0
#регистрируем локальную сеть в маршрутах
route add -net 10.0.0.0 netmask 255.0.0.0 gw $3 dev vlan1:0
#регистрируем дополнительные локальные подсети не из диапазона 10.0.0.0/8
#route add -net $subnet1 netmask 255.255.255.0 gw $3 dev vlan1:0
#route add -net $subnet2 netmask 255.255.255.0 gw $3 dev vlan1:0
#настраиваем маскарадиг + перенаправления на открытые порты (VSERVER)
#настораживает, что на вторую строчку iptables выдает варнинг на название интерфейса
iptables -t nat -A PREROUTING -d $2 -j VSERVER
iptables -t nat -A POSTROUTING -s ! $2 -o vlan1:0 -j MASQUERADE
echo "Alias on WLAN is open"
exit 0
fi;
#Закрываем алиас на WLANe
if [ $1 = "down" ]; then
#Если конфига iptables нет, то обратно восстанавливать не будем. Да поможет великий reboot
if [ ! -f $NAME_IPTBL_ORIG ]; then
echo "ERROR: Has no original iptables save file!!"
exit 1
fi;
#Кладем алиас. Автоматически снимаются прописанные в таблице маршруты
ifconfig vlan1:0 down
#Все правила в iptables нафиг очищаем (навсякий, т.к. не разбирался).
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables -X
#потом восстанавливаем оригинальные правила до поднятия алиаса
iptables-restore $NAME_IPTBL_ORIG
#удаляем файл оригинальной конфигурации iptables
rm $NAME_IPTBL_ORIG
echo "Alias on WLAN is closed"
exit 0
fi;
exit 0
Таблица маршрутизации до запуска скрипта
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
INET GW 0.0.0.0 255.255.255.255 UH 0 0 0 vlan1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
INET SUBNET 0.0.0.0 255.255.255.112 U 0 0 0 vlan1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 INET GW 0.0.0.0 UG 0 0 0 vlan1
Таблица маршрутизации после запуска скрипта
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.64.20.1 * 255.255.255.255 UH 0 0 0 vlan1
INET GW * 255.255.255.255 UH 0 0 0 vlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 br0
INET SUBNET * 255.255.255.112 U 0 0 0 vlan1
10.64.20.0 * 255.255.255.0 U 0 0 0 vlan1
subnet1 10.64.20.1 255.255.255.0 UG 0 0 0 vlan1
subnet2 10.64.20.1 255.255.255.0 UG 0 0 0 vlan1
10.0.0.0 10.64.20.1 255.0.0.0 UG 0 0 0 vlan1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default INET GW 0.0.0.0 UG 0 0 0 vlan1
, где INET GW - интернетский шлюз для моего статичесого IP,
INET SUBNET - адресное пространство в котором распологается мой стат внешний IP.
Запустил. Проверил. Интерфейс vlan1:0 поднялся. Дополнительные рауты в таблице маршрутизации появились.
Полез с моей машины 196.168.0.0/24 конектиться к локальному DC серверу, который находится в subnet1=212.1.226.0/24 (ну вы поняли, что за провайдер N ;) )
Сервер DC при соединении отписал мой внешний IP
(в настройках DC клиента установил адрес 10.64.20.11 - адрес алиаса).
Что я делаю не так?