URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93116
[ Назад ]

Исходное сообщение
"iptables mac-source"

Отправлено hitr , 04-Мрт-12 12:38 
Добрый день всем!
Не нашел в форуме подходящей темы по моему вопросу.
Имеется сервер на Ubuntu 10.04, 2.6.32-38-server, iptables v1.4.4, Squid Cache: Version 3.0.STABLE19
Имеется сеть провайдера с белым адресом и по этому же проводу приходит VLAN серой сетки с фильтрацией трафика для школ.
Стоит задача половина компов пустить через белый адрес, а вторую половину через прокси на VLAN, использую вот такую конструкцию iptables -t nat -I PREROUTING -m mac ! --mac-source ${M} -p tcp -m multiport --dport 80,8080 -j DNAT --to-destination 192.168.0.1:3128, эта строчка выполняется в цыкле.
И почему то все отправляются на прокси, а должны только чьи мак адреса не указаны в массиве ${M}. Если написать одну строку без цыкла iptables -t nat -I PREROUTING -m mac ! --mac-source 90:E6:BA:2F:37:E6 -p tcp -m multiport --dport 80,8080 -j DNAT --to-destination 192.168.0.1:3128, то все нормально, все кроме этого мак адреса идут на прокси, а этот просто натится. Что не так делаю, может кто сталкивался?

Содержание

Сообщения в этом обсуждении
"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 12:56 
А проверить что цикл выводит не судьба?
Ну или просто посмотреть итоговой iptables-save после цикла.

"iptables mac-source"
Отправлено hitr , 04-Мрт-12 13:22 
> А проверить что цикл выводит не судьба?
> Ну или просто посмотреть итоговой iptables-save после цикла.

после цыкла все нормально :OUTPUT ACCEPT [609337:47247402]
-A PREROUTING -p tcp -m mac ! --mac-source 08:00:27:57:F4:9F -m multiport --dports 80,8080 -j DNAT --to-destination 192.168.0.1:3128
-A PREROUTING -p tcp -m mac ! --mac-source 90:E6:BA:2F:37:21 -m multiport --dports 80,8080 -j DNAT --to-destination 192.168.0.1:3128
-A PREROUTING -p tcp -m mac ! --mac-source 20:CF:30:3A:B9:70 -m multiport --dports 80,8080 -j DNAT --to-destination 192.168.0.1:3128
т.е. в цикле все нормально отрабатывает


"iptables mac-source"
Отправлено pgs , 04-Мрт-12 14:08 
>> А проверить что цикл выводит не судьба?
>> Ну или просто посмотреть итоговой iptables-save после цикла.
> после цыкла все нормально :OUTPUT ACCEPT [609337:47247402]
> -A PREROUTING -p tcp -m mac ! --mac-source 08:00:27:57:F4:9F -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
> -A PREROUTING -p tcp -m mac ! --mac-source 90:E6:BA:2F:37:21 -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
> -A PREROUTING -p tcp -m mac ! --mac-source 20:CF:30:3A:B9:70 -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
>  т.е. в цикле все нормально отрабатывает

reload squid после выполнения скрипта iptables делаете?


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 14:13 
> reload squid после выполнения скрипта iptables делаете?

А что это даст то? что за глупости.


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 14:12 
А не проще сделать привязку к маку в DHCP, а в iptables уже рулить адресами?
Если боитесь что будут назначать адреса вручную, сделать привязку адреса к масу в ARP-таблице.

"iptables mac-source"
Отправлено hitr , 04-Мрт-12 15:10 
> А не проще сделать привязку к маку в DHCP, а в iptables
> уже рулить адресами?
> Если боитесь что будут назначать адреса вручную, сделать привязку адреса к масу
> в ARP-таблице.

то что могут вручную назначить не боюсь, прав не хватит.
т.е. в dhcp будет выглядеть примерно так:
host comp1 {                                                                                                                      
  hardware ethernet 01:02:03:04:05:06;                                                                                              
  fixed-address 192.168.0.77;                                                                                                        
}
и так для каждого?
многовато писать и при добавлении нового компа нужно прописать в dhcp и в iptables добавить


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 15:16 
Достаточно добавить в dhcp только тех кто будет ходить через NAT, ну или наоборот, только тех кто через прокси. Кого меньше, того и добавляйте.
а в iptables заранее все пропишите.
адреса для NAT-а выделяйте от 192.168.0.1 до 192.168.0.126
а диапазон без привязки к макам сделайте от 192.168.0.129 до 192.168.0.254

192.168.0.0/25 для NAT
192.168.0.128/25 для прокси.

И соответственно:

-A PREROUTING -s 192.168.0.128/25 -p tcp -m multiport --dports 80,8080 -j DNAT --to-destination 192.168.0.1:3128 


"iptables mac-source"
Отправлено hitr , 04-Мрт-12 15:33 
>[оверквотинг удален]
> или наоборот, только тех кто через прокси. Кого меньше, того и
> добавляйте.
> а в iptables заранее все пропишите.
> адреса для NAT-а выделяйте от 192.168.0.1 до 192.168.0.126
> а диапазон без привязки к макам сделайте от 192.168.0.129 до 192.168.0.254
>
192.168.0.0/25 для NAT 
> 192.168.0.128/25 для прокси.

> И соответственно:
>
-A PREROUTING -s 192.168.0.128/25 -p tcp -m multiport --dports 80,8080 -j DNAT 
> --to-destination 192.168.0.1:3128

спасибо огромное за совет, сейчас буду пробовать


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 14:16 
>> А проверить что цикл выводит не судьба?
>> Ну или просто посмотреть итоговой iptables-save после цикла.
> после цыкла все нормально :OUTPUT ACCEPT [609337:47247402]
> -A PREROUTING -p tcp -m mac ! --mac-source 08:00:27:57:F4:9F -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
> -A PREROUTING -p tcp -m mac ! --mac-source 90:E6:BA:2F:37:21 -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
> -A PREROUTING -p tcp -m mac ! --mac-source 20:CF:30:3A:B9:70 -m multiport --dports
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128
>  т.е. в цикле все нормально отрабатывает

В принципе все правильно, у Вас с логикой правил проблема.
Когда обрабатывается первое правило, если мак отличный от 08:00:27:57:F4:9F то оно посылает его на прокси.
Так что, iptables отрабатывает правильно.

Сделайте по человечески, или без !, или по адресам.


"iptables mac-source"
Отправлено тень_pavel_simple , 04-Мрт-12 16:24 
>[оверквотинг удален]
> Стоит задача половина компов пустить через белый адрес, а вторую половину через
> прокси на VLAN, использую вот такую конструкцию iptables -t nat -I
> PREROUTING -m mac ! --mac-source ${M} -p tcp -m multiport --dport
> 80,8080 -j DNAT --to-destination 192.168.0.1:3128, эта строчка выполняется в цыкле.
> И почему то все отправляются на прокси, а должны только чьи мак
> адреса не указаны в массиве ${M}. Если написать одну строку без
> цыкла iptables -t nat -I PREROUTING -m mac ! --mac-source 90:E6:BA:2F:37:E6
> -p tcp -m multiport --dport 80,8080 -j DNAT --to-destination 192.168.0.1:3128, то
> все нормально, все кроме этого мак адреса идут на прокси, а
> этот просто натится. Что не так делаю, может кто сталкивался?

содаёте новую цепочку, все кто по одному адресу - в эту цепочку, остальных на пhjкси  в это цепочке указываете DNAT куда вы его там


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 16:28 
> содаёте новую цепочку, все кто по одному адресу - в эту цепочку,
> остальных на пhjкси  в это цепочке указываете DNAT куда вы
> его там

Тогда надо без исключений делать, то есть без !, иначе смысла нет в цепочке, после первого правила по -j RETURN, если мак-адрес не совпадает, будет сбрасывать на прокси.


"iptables mac-source"
Отправлено тень_pavel_simple , 04-Мрт-12 16:31 
>> содаёте новую цепочку, все кто по одному адресу - в эту цепочку,
>> остальных на пhjкси  в это цепочке указываете DNAT куда вы
>> его там
> Тогда надо без исключений делать, то есть без !, иначе смысла нет
> в цепочке, после первого правила по -j RETURN, если мак-адрес не
> совпадает, будет сбрасывать на прокси.

да -- верно никаких ! не нужно в данном случае... а вот при чём тут -j RETURN не асилил.


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 16:32 
> да -- верно никаких ! не нужно в данном случае... а вот
> при чём тут -j RETURN не асилил.

Я имел ввиду правила в цепочках.


"iptables mac-source"
Отправлено тень_pavel_simple , 04-Мрт-12 16:35 
>> да -- верно никаких ! не нужно в данном случае... а вот
>> при чём тут -j RETURN не асилил.
> Я имел ввиду правила в цепочках.

если цепочка вложенная то -j RETURN выполняется в дефолте по окончанию правил цепочки... насколько я ничего не помню.


"iptables mac-source"
Отправлено тень_pavel_simple , 04-Мрт-12 16:37 
>>> да -- верно никаких ! не нужно в данном случае... а вот
>>> при чём тут -j RETURN не асилил.
>> Я имел ввиду правила в цепочках.
> если цепочка вложенная то -j RETURN выполняется в дефолте по окончанию правил
> цепочки... насколько я ничего не помню.

кроме того можно все делать через --set-mark и без цепочек и с чётким определением кого куда.


"iptables mac-source"
Отправлено shadow_alone , 04-Мрт-12 16:42 
> кроме того можно все делать через --set-mark и без цепочек и с
> чётким определением кого куда.

Совершенно верно. Но думаю, по адресам намного удобнее сделать.


"iptables mac-source"
Отправлено hitr , 04-Мрт-12 18:29 
>> кроме того можно все делать через --set-mark и без цепочек и с
>> чётким определением кого куда.
> Совершенно верно. Но думаю, по адресам намного удобнее сделать.

По адресам, если привязывать адреса к макам в dhcp, то имена хостов не записываются в зоны bind.
можно подробнее про --set-mark, на днях пробовал, но чего то не получилось


"iptables mac-source"
Отправлено hitr , 04-Мрт-12 20:25 
>>> кроме того можно все делать через --set-mark и без цепочек и с
>>> чётким определением кого куда.
>> Совершенно верно. Но думаю, по адресам намного удобнее сделать.
> По адресам, если привязывать адреса к макам в dhcp, то имена хостов
> не записываются в зоны bind.
> можно подробнее про --set-mark, на днях пробовал, но чего то не получилось

всем спасибо за советы и предложения, кому интересно, то вот таким образом получилось:

$ipt -t mangle -N check_mac

touch /tmp/query
echo 'SELECT name FROM mac;' | mysql -s -ubase_user -pbase_pass base_name > /tmp/query
MAC=`cat /tmp/query`
for M in ${MAC}; do
$ipt -t mangle -A check_mac -m mac --mac-source ${M} -j MARK --set-mark 1
done
rm /tmp/query

$ipt -t mangle -I PREROUTING -p tcp -j check_mac
$ipt -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -m mark ! --mark 1 -j DNAT --to-destination 192.168.0.1:3128