Добрый день всем!
Не нашел в форуме подходящей темы по моему вопросу.
Имеется сервер на 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-save после цикла.
> А проверить что цикл выводит не судьба?
> Ну или просто посмотреть итоговой 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-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 делаете?
> reload squid после выполнения скрипта iptables делаете?А что это даст то? что за глупости.
А не проще сделать привязку к маку в DHCP, а в iptables уже рулить адресами?
Если боитесь что будут назначать адреса вручную, сделать привязку адреса к масу в ARP-таблице.
> А не проще сделать привязку к маку в DHCP, а в iptables
> уже рулить адресами?
> Если боитесь что будут назначать адреса вручную, сделать привязку адреса к масу
> в ARP-таблице.то что могут вручную назначить не боюсь, прав не хватит.
т.е. в dhcp будет выглядеть примерно так:
host comp1 {
hardware ethernet 01:02:03:04:05:06;
fixed-address 192.168.0.77;
}
и так для каждого?
многовато писать и при добавлении нового компа нужно прописать в dhcp и в iptables добавить
Достаточно добавить в 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 заранее все пропишите.
> адреса для 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-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 отрабатывает правильно.Сделайте по человечески, или без !, или по адресам.
>[оверквотинг удален]
> Стоит задача половина компов пустить через белый адрес, а вторую половину через
> прокси на 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 куда вы его там
> содаёте новую цепочку, все кто по одному адресу - в эту цепочку,
> остальных на пhjкси в это цепочке указываете DNAT куда вы
> его тамТогда надо без исключений делать, то есть без !, иначе смысла нет в цепочке, после первого правила по -j RETURN, если мак-адрес не совпадает, будет сбрасывать на прокси.
>> содаёте новую цепочку, все кто по одному адресу - в эту цепочку,
>> остальных на пhjкси в это цепочке указываете DNAT куда вы
>> его там
> Тогда надо без исключений делать, то есть без !, иначе смысла нет
> в цепочке, после первого правила по -j RETURN, если мак-адрес не
> совпадает, будет сбрасывать на прокси.да -- верно никаких ! не нужно в данном случае... а вот при чём тут -j RETURN не асилил.
> да -- верно никаких ! не нужно в данном случае... а вот
> при чём тут -j RETURN не асилил.Я имел ввиду правила в цепочках.
>> да -- верно никаких ! не нужно в данном случае... а вот
>> при чём тут -j RETURN не асилил.
> Я имел ввиду правила в цепочках.если цепочка вложенная то -j RETURN выполняется в дефолте по окончанию правил цепочки... насколько я ничего не помню.
>>> да -- верно никаких ! не нужно в данном случае... а вот
>>> при чём тут -j RETURN не асилил.
>> Я имел ввиду правила в цепочках.
> если цепочка вложенная то -j RETURN выполняется в дефолте по окончанию правил
> цепочки... насколько я ничего не помню.кроме того можно все делать через --set-mark и без цепочек и с чётким определением кого куда.
> кроме того можно все делать через --set-mark и без цепочек и с
> чётким определением кого куда.Совершенно верно. Но думаю, по адресам намного удобнее сделать.
>> кроме того можно все делать через --set-mark и без цепочек и с
>> чётким определением кого куда.
> Совершенно верно. Но думаю, по адресам намного удобнее сделать.По адресам, если привязывать адреса к макам в dhcp, то имена хостов не записываются в зоны bind.
можно подробнее про --set-mark, на днях пробовал, но чего то не получилось
>>> кроме того можно все делать через --set-mark и без цепочек и с
>>> чётким определением кого куда.
>> Совершенно верно. Но думаю, по адресам намного удобнее сделать.
> По адресам, если привязывать адреса к макам в dhcp, то имена хостов
> не записываются в зоны bind.
> можно подробнее про --set-mark, на днях пробовал, но чего то не получилосьвсем спасибо за советы и предложения, кому интересно, то вот таким образом получилось:
$ipt -t mangle -N check_mactouch /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