Дублирование правил фаервола. Зачем?
У биллинга странная логика работы с этими правилами, начинаешь редактировать пользователя, он шлет в utm_rfw 2 раза правило на выключение, 1 раз на включение. При изменении блокировки пользователя шлется правило, которое прописано в поле "Изменение типа блокировки" в качестве параметров ему передается адрес 0.0.0.0/0, и 2 раза правило на выключение. Короче без бутылки это не понять 

- Lex
- NetUP Team
- Сообщения: 623
- Зарегистрирован: Ср мар 09, 2005 12:12
- Откуда: НетАП
- Контактная информация:
Внимательно перечитайте документацию на предмет того, какие переменные в каком случае можно использовать и учитывайте, что каждый раз, когда изменяется абонент у которого интернет выключен выполняется правило на выключение. За исключением указанного мной момента правила повторно исполняться не должны. Внимательно смотрите в debug.log - там можно увидеть причину выполнения каждого правила.Kuzmich писал(а):У биллинга странная логика работы с этими правилами, начинаешь редактировать пользователя, он шлет в utm_rfw 2 раза правило на выключение, 1 раз на включение. При изменении блокировки пользователя шлется правило, которое прописано в поле "Изменение типа блокировки" в качестве параметров ему передается адрес 0.0.0.0/0, и 2 раза правило на выключение. Короче без бутылки это не понять
В версии 5.2.1-004 наблюдается этот же глюк.
Есть лицевой счёт. У него 2 тарифных плана. Тарифный план 416 со своим правилом фаерволла
и тарифный план 419 со своим правилом фаерволла.
Правила фаерволла вот такие
То есть правило создано для тарифа и выполняется
только при полном совпадении.
При включении инета вот что происходит:
В общем он находит правила для обоеих тарифов, а потом выполняет
их для всех IP - то есть первое правило для IP первого тарифного
плана, первое правило для IP второго тарифного плана, второе
правило для IP первого тарифного плана и второе правило для IP
второго тарифного плана.
Естественно получается, что для обоих тарифов работает правило,
предназначенное только для первого тарифа.
Куда копать?
Есть лицевой счёт. У него 2 тарифных плана. Тарифный план 416 со своим правилом фаерволла
и тарифный план 419 со своим правилом фаерволла.
Правила фаерволла вот такие
Код: Выделить всё
mysql> SELECT is_for_all, uid, group_id, tariff_id, rule_on, rule_off, rule_block, router_id, and_logic, add_user, edit_user, del_user FROM firewall_rules WHERE is_deleted='0';
+------------+------+----------+-----------+--------------------------------------------------+----------------------------------------+------------+-----------+-----------+----------+-----------+----------+
| is_for_all | uid | group_id | tariff_id | rule_on | rule_off | rule_block | router_id | and_logic | add_user | edit_user | del_user |
+------------+------+----------+-----------+--------------------------------------------------+----------------------------------------+------------+-----------+-----------+----------+-----------+----------+
| 0 | 0 | 0 | 416 | /netup/utm/enable.sh UIP/UBITS RULE_ID 512 pipe | /netup/utm/disable_inet.sh UIP RULE_ID | | 1 | 1 | 0 | 0 | 0 |
| 0 | 0 | 0 | 419 | /netup/utm/enable.sh UIP/UBITS RULE_ID 64 queue | /netup/utm/disable_inet.sh UIP RULE_ID | | 1 | 1 | 0 | 0 | 0 |
+------------+------+----------+-----------+--------------------------------------------------+----------------------------------------+------------+-----------+-----------+----------+-----------+----------+
только при полном совпадении.
При включении инета вот что происходит:
Код: Выделить всё
?Debug : Nov 07 23:05:09 DBCtx: SQL SELECT query: SELECT is_for_all, uid, group_id, tariff_id, rule_on, rule_off, rule_block, router_id, and_logic, add_user, edit_user, del_user FROM firewall_rules WHERE is_deleted='0'
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule on </netup/utm/enable.sh UIP/UBITS RULE_ID 128 queue> off </netup/utm/disable_inet.sh UIP RULE_ID>. User check <0> tariffs check <-1> groups check <0>. And logic <enabled>
----- skiped -----
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule on </netup/utm/enable.sh UIP/UBITS RULE_ID 512 pipe> off </netup/utm/disable_inet.sh UIP RULE_ID>. User check <0> tariffs check <1> groups check <0>. And logic <enabled>
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule added to final list!
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule on </netup/utm/enable.sh UIP/UBITS RULE_ID 64 queue> off </netup/utm/disable_inet.sh UIP RULE_ID>. User check <0> tariffs check <1> groups check <0>. And logic <enabled>
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule added to final list!
?Debug : Nov 07 23:05:09 UTM5 DBA: Rule on </netup/utm/enable.sh UIP/UBITS RULE_ID 128 queue> off </netup/utm/disable_inet.sh UIP RULE_ID>. User check <0> tariffs check <-1> groups check <0>. And logic <enabled>
?Debug : Nov 07 23:05:09 ModFWMan: Ready to execute 2 FW rules for UID 102. State:1...
?Debug : Nov 07 23:05:09 ModFWMan: FW rule parse. Setting RULE_ID to <5102> uid <102>
----- то есть он добавил в список для выполнения 2 правила ------------
?Debug : Nov 07 23:05:09 DBA:Ctx: Looking for free context
----- skiped -----
?Debug : Nov 07 23:05:09 ModFWMan: Exec [/netup/utm/enable.sh 172.16.0.66/32 5102 512 pipe] on 1
?Debug : Nov 07 23:05:09 FW@172.16.254.254: Sending [/netup/utm/enable.sh 172.16.0.66/32 5102 512 pipe]
----- skiped -----
?Debug : Nov 07 23:05:09 ModFWMan: Exec [/netup/utm/enable.sh 172.16.100.66/32 5102 512 pipe] on 1
?Debug : Nov 07 23:05:09 FW@172.16.254.254: Sending [/netup/utm/enable.sh 172.16.100.66/32 5102 512 pipe]
----- skiped -----
?Debug : Nov 07 23:05:09 ModFWMan: Exec [/netup/utm/enable.sh 172.16.0.66/32 5102 64 queue] on 1
?Debug : Nov 07 23:05:09 FW@172.16.254.254: Sending [/netup/utm/enable.sh 172.16.0.66/32 5102 64 queue]
----- skiped -----
?Debug : Nov 07 23:05:09 ModFWMan: Exec [/netup/utm/enable.sh 172.16.100.66/32 5102 64 queue] on 1
?Debug : Nov 07 23:05:09 FW@172.16.254.254: Sending [/netup/utm/enable.sh 172.16.100.66/32 5102 64 queue]
их для всех IP - то есть первое правило для IP первого тарифного
плана, первое правило для IP второго тарифного плана, второе
правило для IP первого тарифного плана и второе правило для IP
второго тарифного плана.
Естественно получается, что для обоих тарифов работает правило,
предназначенное только для первого тарифа.
Куда копать?
АЙ ПАМАГУ УЖЖО
сам раньше сталкивался с ситуацией..
ИСПОЛЬЗУЕМ ТАБЛИЦЫ
1) удобно
2) правила не дублируются
3) произаодительность на порядок выше становится
итак:
1) в правилах файрвола создаем строки
ipfw add ip from table\(1\) to any
ipfw add ip from any to table\(1\)
в UTM правила файрвол ставим
Включение: table 1 add UIP/UBITS
Выключение: table 1 del UIP/UBITS
просмотр списка кто есть в таблице
ipfw table 1 list
вуаля..
сам раньше сталкивался с ситуацией..
ИСПОЛЬЗУЕМ ТАБЛИЦЫ
1) удобно
2) правила не дублируются
3) произаодительность на порядок выше становится
итак:
1) в правилах файрвола создаем строки
ipfw add ip from table\(1\) to any
ipfw add ip from any to table\(1\)
в UTM правила файрвол ставим
Включение: table 1 add UIP/UBITS
Выключение: table 1 del UIP/UBITS
просмотр списка кто есть в таблице
ipfw table 1 list
вуаля..
Дык, не то это!
Нужно чтоб для тарифа А выполнялось правило А с IP тарифной связки А, а для тарифа В выполнялось правило В с IP тарифной связки В.
А сейчас выполняется правило А для IP А и для IP В, потом выполняется правило В для IP А и IP В.
И получается что услуга с IP В работает по правилу А, так как оно первое выполнилось.
А это грустно, так как если например тариф А - безлимитный 512к, а тариф В - безлимитный 64к.
Или я чтото в логике работы биллинга не понимаю.
Нужно чтоб для тарифа А выполнялось правило А с IP тарифной связки А, а для тарифа В выполнялось правило В с IP тарифной связки В.
А сейчас выполняется правило А для IP А и для IP В, потом выполняется правило В для IP А и IP В.
И получается что услуга с IP В работает по правилу А, так как оно первое выполнилось.
А это грустно, так как если например тариф А - безлимитный 512к, а тариф В - безлимитный 64к.
Или я чтото в логике работы биллинга не понимаю.
у меня правила дублировались из-за двух лицевых счетов на одном логине, на них были назначены одинаковые тарифные планы, но ip-адрес был прописан для одной услуги. Мало того, что правила дублировались, еще и адрес 0.0.0.0/0 вылез в правилах, разрешая всем беспрепятственно ходить.
После того, как убрал на втором лицевом счете тарифный план, все пришло в норму.
Добавление: а вот фиг, опять дублируются. Кто как заборол, поделитесь?
После того, как убрал на втором лицевом счете тарифный план, все пришло в норму.
Добавление: а вот фиг, опять дублируются. Кто как заборол, поделитесь?
- Nightingale
- Сообщения: 122
- Зарегистрирован: Сб июн 09, 2007 17:32
Со временем работы в IT понимаешь что самое сложное это не разобраться в настройках программы, принцип работы которой не понял сам программист или устранить неполадку с помошью телепатии, а просто умение сдержать агрессию в ответ на изумленно-возмущенный вопрос:
- А почему ты не помнишь мой пароль от почты?
- А почему ты не помнишь мой пароль от почты?
Я бы хотел увидеть подробное описание как-же можно просматривать данный файло на предмет: "догадайся а не из-за этого ли параметра вылетело правило фаервола?" !Внимательно смотрите в debug.log - там можно увидеть причину выполнения каждого правила.
ну сейчас пока задвоения нет, а выбрать из дебаг.лога то, что к нему относилось трудно. но вот адрес 0.0.0.0/0 появляется:
Код: Выделить всё
?Debug : Jan 22 09:59:21 FW@127.0.0.1: Ping reply received
?Debug : Jan 22 09:59:51 FW@127.0.0.1: Ping reply received
?Debug : Jan 22 10:00:21 FW@127.0.0.1: Ping reply received
?Debug : Jan 22 10:00:51 FW@127.0.0.1: Ping reply received
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call: 0x2003 (rpcf_change_intstat_for_user)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Real Call: 0x2003 (rpcf_change_intstat_for_user)
?Debug : Jan 22 10:01:04 DBCtx: SQL query: UPDATE accounts SET int_status='1' WHERE id='1'
?Debug : Jan 22 10:01:04 BusLogic: BLM(39) pushed (comment: )
?Debug : Jan 22 10:01:04 UTM5 DBA: hw unblock for account 1
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call 0x2003 (rpcf_change_intstat_for_user) finished...
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Stream cleared
?Debug : Jan 22 10:01:04 BusLogic: try to execute 39
?Debug : Jan 22 10:01:04 BusLogic: hw_block_handler with code 39
?Debug : Jan 22 10:01:04 BusLogic: hw_block_handler start bla_user_hw_unblock|bla_user_hw_block
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT is_for_all, uid, group_id, tariff_id, rule_on, rule_off,
rule_block, router_id, and_logic, add_user,
edit_user, del_user FROM firewall_rules WHERE is_deleted='0'
?Debug : Jan 22 10:01:04 UTM5 DBA: Rule on <-t nat -A POSTROUTING -s UIP/UBITS -j MASQUERADE> off <-t nat -D
POSTROUTING -s UIP/UBITS -j MASQUERADE>. User ch
eck <1> tariffs check <0> groups check <0>. And logic <disabled>
?Debug : Jan 22 10:01:04 UTM5 DBA: Rule added to final list!
?Debug : Jan 22 10:01:04 ModFWMan: Ready to execute 1 FW rules for UID 1. State:1...
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Setting RULE_ID to <5001> uid <1>
?Debug : Jan 22 10:01:04 DBA:Ctx: Looking for free context
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT login, password,
basic_account, is_blocked,
create_date, last_change_date, who_create, who_change,
is_juridical, full_name, ju
ridical_address, actual_address, work_telephone, home_telephone,
mobile_telephone,
web_page, icq_number, tax_number, kpp_number, bank_id,
bank_account, comments,
discount_period_id, email, house_id, flat_number,
entrance, floor, district,
building, passport, personal_manager, connect_date,
is_send_invoice, advanc
e_payment FROM users WHERE id='1' AND is_deleted=0
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT group_id FROM users_groups_link WHERE user_id='1'
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT paramid, value FROM user_additional_params WHERE userid='1'
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT group_name FROM groups WHERE id='400'
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT remote_switch_id, port_number FROM users WHERE id='1'
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting ACCOUNT_ID with value <1> original value <0>
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting empty ULOGIN with value <vz4kv30>
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting UBITS with value <32> original value <-1>
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting EMAIL with value <> (obtained from user data)
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting TRAFFIC_LIMIT with value <0>
?Debug : Jan 22 10:01:04 DBA:Ctx: Pushing back free context
-Stats : Jan 22 10:01:04 DBA Groups: Stats: Uptime: 00:00:00. Events: 0; Errors: 0
?Debug : Jan 22 10:01:04 ModFWMan: Exec [-t nat -A POSTROUTING -s 192.168.80.1/32 -j MASQUERADE] on 2
?Debug : Jan 22 10:01:04 FW@127.0.0.1: Sending [-t nat -A POSTROUTING -s 192.168.80.1/32 -j MASQUERADE]
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Setting RULE_ID to <5000> uid <0>
?Debug : Jan 22 10:01:04 DBA:Ctx: Looking for free context
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT login, password,
basic_account, is_blocked,
create_date, last_change_date, who_create, who_change,
is_juridical, full_name, ju
ridical_address, actual_address, work_telephone, home_telephone,
mobile_telephone,
web_page, icq_number, tax_number, kpp_number, bank_id,
bank_account, comments,
discount_period_id, email, house_id, flat_number,
entrance, floor, district,
building, passport, personal_manager, connect_date,
is_send_invoice, advanc
e_payment FROM users WHERE id='0' AND is_deleted=0
ERROR : Jan 22 10:01:04 DBAExistingError: get_user_full_by_uid: no such user
?Trace : Jan 22 10:01:04 trace: Obtained 13 stack frames.
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_Z15print_backtracev+0x22) [0x8395ba2]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8DBAErrorC2ERKSsS2_+0x50) [0x81f6870]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM16DBAExistingErrorC1ESs+0x47) [0x81f6a97]
?Trace : Jan 22 10:01:04 trace:
/netup/utm5/bin/utm5_core(_ZN3UTM8DBAccess22__get_user_full_by_uidEiPNS_12UserDataFullE+0x134) [0x820a9b4]
?Trace : Jan 22 10:01:04 trace:
/netup/utm5/bin/utm5_core(_ZN3UTM8DBAccess20get_user_full_by_uidEiPNS_12UserDataFullE+0x3b) [0x831e55b]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8ModFWMan10rule_substERSsPNS_10fwrule_valE+0x339)
[0x83992b9]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8ModFWMan21block_user_or_accountEiiix+0xb0f)
[0x839d27f]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8ModFWMan10block_userEiix+0x35) [0x839d565]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(hw_block_handler+0x1e3) [0x8382023]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8BusQueue7executeERPN3Bus9blm_basicE+0xd9)
[0x8377ed9]
?Trace : Jan 22 10:01:04 trace: /netup/utm5/bin/utm5_core(_ZN3UTM8BusLogic7processEPv+0x122) [0x8375fa2]
?Trace : Jan 22 10:01:04 trace: /lib/libpthread.so.0 [0x44c862db]
?Trace : Jan 22 10:01:04 trace: /lib/libc.so.6(clone+0x5e) [0x44be012e]
ERROR : Jan 22 10:01:04 ModFWMan: Unexisting used <0>
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT remote_switch_id, port_number FROM users WHERE id='0'
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting UBITS with value <32> original value <-1>
?Debug : Jan 22 10:01:04 ModFWMan: FW rule parse. Substituting TRAFFIC_LIMIT with value <0>
?Debug : Jan 22 10:01:04 DBA:Ctx: Pushing back free context
-Stats : Jan 22 10:01:04 DBA Groups: Stats: Uptime: 00:00:00. Events: 0; Errors: 0
?Debug : Jan 22 10:01:04 ModFWMan: Exec [-t nat -A POSTROUTING -s 0.0.0.0/32 -j MASQUERADE] on 2
?Debug : Jan 22 10:01:04 FW@127.0.0.1: Sending [-t nat -A POSTROUTING -s 0.0.0.0/32 -j MASQUERADE]
?Debug : Jan 22 10:01:04 BusLogic: hw_block_handler end bla_user_hw_unblock|bla_user_hw_block
?Debug : Jan 22 10:01:04 BusLogic: finished unknown
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call: 0x2011 (rpcf_get_users_count)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Real Call: 0x2011 (rpcf_get_users_count)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call 0x2011 (rpcf_get_users_count) finished...
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Stream cleared
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call: 0x2400 (rpcf_get_groups_list)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Real Call: 0x2400 (rpcf_get_groups_list)
?Debug : Jan 22 10:01:04 DBA:Ctx: Looking for free context
?Debug : Jan 22 10:01:04 DBCtx: SQL SELECT query: SELECT id, group_name FROM groups
?Debug : Jan 22 10:01:04 DBA:Ctx: Pushing back free context
-Stats : Jan 22 10:01:04 DBA Groups: Stats: Uptime: 00:00:00. Events: 0; Errors: 0
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call 0x2400 (rpcf_get_groups_list) finished...
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Stream cleared
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call: 0x2001 (rpcf_get_users_list)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Real Call: 0x2001 (rpcf_get_users_list)
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Call 0x2001 (rpcf_get_users_list) finished...
?Debug : Jan 22 10:01:04 RPCConn[SSL]<init@192.168.80.1>: Stream cleared
utm5-2.1.008 + Mikrotik
Правило на включение интернета - /ip firewall address-list add address=UIP list=allow_ip comment=UID
на выключение - /ip firewall address-list remove [find comment=UID]
По неизвестной до сих пор причине в какой то момент правила также начинают дублироваться. То есть 5 правил на включение интернета у одного и того же айпи и, соответственно, когда нужно выключить интернет, одно из них удаляется, а остальные остаются.
Помогите кто чем может пожалуйста, я уже голову сломал и не понимаю почему так происходит...
Правило на включение интернета - /ip firewall address-list add address=UIP list=allow_ip comment=UID
на выключение - /ip firewall address-list remove [find comment=UID]
По неизвестной до сих пор причине в какой то момент правила также начинают дублироваться. То есть 5 правил на включение интернета у одного и того же айпи и, соответственно, когда нужно выключить интернет, одно из них удаляется, а остальные остаются.
Помогите кто чем может пожалуйста, я уже голову сломал и не понимаю почему так происходит...

выключение интернета
:foreach i in=[/ip firewall address-list find comment="UIP/UBITS"] do={/ip firewall address-list remove $i}
включение
:foreach i in=[/ip firewall address-list find comment="UIP/UBITS"] do={/ip firewall address-list remove $i}; ip firewall address-list add address=UIP/UBITS list=512k_list comment=UIP/UBITS
микротик 3.30
512k_list - это allow_ip, у нас просто на каждый тариф свои акцесс листы
:foreach i in=[/ip firewall address-list find comment="UIP/UBITS"] do={/ip firewall address-list remove $i}
включение
:foreach i in=[/ip firewall address-list find comment="UIP/UBITS"] do={/ip firewall address-list remove $i}; ip firewall address-list add address=UIP/UBITS list=512k_list comment=UIP/UBITS
микротик 3.30
512k_list - это allow_ip, у нас просто на каждый тариф свои акцесс листы
ни кто не сталкивался, не срабатывает вторая часть правила после ";" для включения интернета :foreach i in=[/ip firewall address-list find comment=UIP] do={/ip firewall address-list remove $i};ip firewall address-list add address=UIP list=SERVICE_ID comment=UIP или /ip firewall address-list remove [find comment=UIP]; ip firewall address-list add address=UIP list=SERVICE_ID comment=UIP причем на прямую в микротик через telnet или ssh проходит полностью. в логах тоже все ок
5.2.1-009
5.2.1-009