true Posted November 13, 2005 Posted November 13, 2005 Есть комп-маршрутизатор на Linux, в котором: eth0 - интерфейс в локальную сеть, с провайдером 1 eth1 - интерфейс в ADSL-модем со стримом ppp0 и ppp1 - pppoe итерфейсы к провайдерам Провайдер 1 дает список российских сетей, траффик с которых бесплатный, с отстальных - платный. Требуется: сделать, чтобы траффик на зарубежный сети ходил через стрим, а российский - через провайдера 1, при возможности натить инет на один из компов локалки Есть 2 варианта: 1. Свид x 2 2. iproute2 + iptables Понятно, что более правилен вариант 2, но нигде не нашел схемы решения проблемы на основе iproute. Читал про маркировку пакетов с помощью iptabes и расфасовке iproute, но вникнуть в тему как следует так и не смог. Заранее спасибо. P.S. До того, как появился стрим, делал фильтрацию входящего траффика с помощью iptables, исходящего - squid P.P.S. Таблица вида: 193.109.114.0/24 193.109.76.0/24 193.109.77.0/24 193.109.89.0/24 193.110.0.0/23 193.110.4.0/23 ... Вставить ник Quote
Cyper Posted November 13, 2005 Posted November 13, 2005 Ну что-то в этом роде..... Создаем 2 таблицы echo 202 net1 >> /etc/iproute2/rt_tables echo 210 net2 >> /etc/iproute2/rt_tables перенаправляем помеченый трафик в определенные таблицы ip rule add fwmark 2 table net1 ##Российский трафик ip rule add fwmark 3 table net2 ##Иностранный трафик ip route add default via шлюз_прова_1 dev ppp0 table net1 ##Добавляем шлюз для таблицы с российским трафиком ip route add default via шлюз_прова_2 dev ppp1 table net2 ##Добавляем шлюз для таблицы с иностранным трафиком ip route flush cache ## Инициализируем таблицу маршрутизации iptables -t mangle -A PREROUTING -d РОССИЙСКАЯ_сеть -j MARK --set-mark 2 ## Маркируем трафик который направлен в РОССИЙСКИЕ сети iptables -t mangle -A PREROUTING -d ИНОСТРАННАЯ_сеть -j MARK --set-mark 3 ## Маркируем трафик который направлен в ИНОСТРАННЫЕ сети .... А вообще в сети куча инфы по этой тематике. :-) Удачи Вставить ник Quote
true Posted November 13, 2005 Author Posted November 13, 2005 Cyper, кстати, после отправки пакеты будут куда возвращаться? туда, откуда пришли или как..? :) Вставить ник Quote
Guest Posted November 13, 2005 Posted November 13, 2005 Cyper, не работает твой вариант Сделал немного по-другому: ppp1 - default route сделал так: ip rule add fwmark 1 table russian маркирую пакеты, принадлежащие к российским сетям: /sbin/iptables -t mangle -A PREROUTING -d 193.109.77.0/24 -j MARK --set-mark 1 /sbin/iptables -t mangle -A PREROUTING -d 193.109.89.0/24 -j MARK --set-mark 1 /sbin/iptables -t mangle -A PREROUTING -d 193.110.0.0/23 -j MARK --set-mark 1 затем: ip route add default via $WAN_GATE dev ppp0 table russian нат: /sbin/iptables -t nat -A POSTROUTING -s 192.168.24.3 -d 0/0 -j MASQUERADE Пакеты вообще перестают ходить. По идее, маркированые пакеты должны ходить через один defroute, а маркированые - через другой. Что я делаю не так? Вставить ник Quote
kisa Posted November 13, 2005 Posted November 13, 2005 Всем привет! Совершенно не вижу смысла в двух таблицах маршрутизации и, соответсвенно, в необходимости маркировать пакеты, для направления в разные таблицы маршрутизации. Я бы делал так: 1. для того чтобы отправлять российкий трафик пров-ру 1 необходимо просто прописать маршруты в эти сети, установив в качесте гейта для этих маршрутов гейт провайдера 1 Что-то вроде route add -net X1 gw GW1 route add -net X2 gw GW1 ... route add -net Xn gw GW1 2. Весь остальной трафик идет на default gateway провайдера 2 route add default GW2 3. А теперь решим вопрос с входящим трафиком. Трафик будет возвращаться по тому каналу с чьих IP адресов идет отправка. Если отправляете трафик с адресов провайдера 1, то, соответсвенно, возвращаться он и будет через канала 1 провайдера. Если используете NAT, то нужно написать некоторое кол-во правил, которые будут маскарадить весь трафик в российские сети на адрес или адреса, которые Вам выдал провайдер 1, а весь остальной трафик натить за адрес/адреса провайдера 2. iptables -t nat -A POSTROUTING -s LOCAL_NET -d X1 -j SNAT --to inet_ip_prov1 iptables -t nat -A POSTROUTING -s LOCAL_NET -d X2 -j SNAT --to inet_ip_prov1 ... iptables -t nat -A POSTROUTING -s LOCAL_NET -d Xn -j SNAT --to inet_ip_prov1 # весь остальной трафик iptables -t nat -A POSTROUTING -s LOCAL_NET -j SNAT --to inet_ip_prov2 где: LOCAL_NET - серые адреса Ваших клиентов X1..Xn - бесплатные сети inet_ip_prov1 - адрес из блока адресов, которые вам выдал пров. 1 inet_ip_prov2 - адрес из блока адресов, которые вам выдал пров. 2 Вставить ник Quote
Guest Posted November 13, 2005 Posted November 13, 2005 kisa спасибо, будем, пробовать Вставить ник Quote
true Posted November 13, 2005 Author Posted November 13, 2005 Спасибо огромное, все заработало, как планировалось.. сделал немного проще, чем iptables -t nat -A POSTROUTING -s LOCAL_NET -d Xn -j SNAT --to inet_ip_prov1 , через маскарад теперь, пожалуй, последний вопрос: как сбрасывать это все хозяйство в первоначальное состояние? я сделал скриптик, который генерит из той таблицы такую: route add -net 192.160.233.0/24 gw $GW route add -net 192.175.48.0/24 gw $GW и т.д. поскольку у прова каждый час происходят обновления, мне тоже надо у себя их производить... Вставить ник Quote
Guest Posted November 13, 2005 Posted November 13, 2005 Спасибо огромное, все заработало, как планировалось.. сделал немного проще, чем iptables -t nat -A POSTROUTING -s LOCAL_NET -d Xn -j SNAT --to inet_ip_prov1 , через маскарад теперь, пожалуй, последний вопрос: как сбрасывать это все хозяйство в первоначальное состояние? я сделал скриптик, который генерит из той таблицы такую: route add -net 192.160.233.0/24 gw $GW route add -net 192.175.48.0/24 gw $GW и т.д. поскольку у прова каждый час происходят обновления, мне тоже надо у себя их производить... Что Вы имеете ввиду под первоначальным состоянием? Удаляйте маршруты, удаляйте правила маскарада, далее создавайте все снова. Вставить ник Quote
true Posted November 14, 2005 Author Posted November 14, 2005 ip route | grep "via xxx.xxx.xxx.xxx" | awk '{print $1}' и далее route del -net xxx.xxx.xxx.xxx/xx gw xxx.xxx.xxx.xxx все сбрасывается в состояние, которое было до того, как добавили маршруты всем спасибо, тема закрыта Вставить ник Quote
Ugnich Anton Posted November 14, 2005 Posted November 14, 2005 ip rule add to <net1>/24 table 1000 ... ip rule add to <net255>/24 table 1000 ip route add table 1000 via <gw1> dev ppp0 route add default gw <gw2> dev ppp1 iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source <ppp0_ip> iptables -t nat -A POSTROUTING -o ppp1 -j SNAT --to-source <ppp1_ip> Вроде так... Правил для NAT нужно ровно два - по количеству интерфейсов. Также, IMHO, комбинация 'ip rule'+'ip route' лучше, чем использование только 'route add'. Вставить ник Quote
true Posted November 14, 2005 Author Posted November 14, 2005 Ugnich Anton, то же самое по сути... но, все равно, спасибо Вставить ник Quote
Guest Posted November 14, 2005 Posted November 14, 2005 ip rule add to <net1>/24 table 1000Также, IMHO, комбинация 'ip rule'+'ip route' лучше, чем использование только 'route add'.А можно узнать чем? Разве не появляется лишнее звено - дополнительная таблица маршрутизации? Вставить ник Quote
desperado Posted November 14, 2005 Posted November 14, 2005 ip rule add to <net1>/24 table 1000Также, IMHO, комбинация 'ip rule'+'ip route' лучше, чем использование только 'route add'.А можно узнать чем? Разве не появляется лишнее звено - дополнительная таблица маршрутизации? ИМХО например можно вертеть второй таблицей не боясь задеть первую, еще отключать всё оптом, не удаляя правил из таблицы, а вообще это монопенисуально. Вставить ник Quote
true Posted November 14, 2005 Author Posted November 14, 2005 desperado, у меня задача была делать маршрутизацию по одной таблице ;) Так что route здесь больше всего подходит, IMHO. По крайней мере, минимальные извращения :) Вставить ник Quote
Ugnich Anton Posted November 15, 2005 Posted November 15, 2005 ip rule add to <net1>/24 table 1000Также, IMHO, комбинация 'ip rule'+'ip route' лучше, чем использование только 'route add'.А можно узнать чем? Разве не появляется лишнее звено - дополнительная таблица маршрутизации?Насчет лишних звеньев - пофиг. А в остальном - гибче и удобнее. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.