Исходная политическая маршрутизация и NAT (DNAT / SNAT) aka Multi WANs на CentOS 5

Первоначально опубликовано в Unix и Linux, но никто не смог ответить на него, поэтому переместите здесь вопрос:

Мой вопрос касается маршрутизации на основе исходного кода на CentOS 5 с двумя WAN-серверами плюс порт LAN (NAT) с балансировкой нагрузки, но сначала перед чем-нибудь некоторые замечания, прежде чем начинать описывать проблему …

Я знаю, что эта тема неоднократно приводилась здесь при обмене стеками и кажется, что лучшие 5 ответов (упорядочены от наименее):

  1. Отключить rp_filter
  2. Маршрутизация политики на основе Mark / Connmark
  3. Маршрутизация политики на основе IP (добавьте больше IP-адресов)
  4. Установите pfSense, Shorewall, Ubuntu ?, Etc …
  5. Купить дорогой маршрутизатор Cisco / 3com / Juniper / Etc … Router

В большинстве случаев некоторые из этих ответов верны, но для меня решения 1 и 2 не имеют тренировки (я не отбрасываю хотя бы пункт 2, потому что у меня могут быть некоторые проблемы с моей настройкой), точка 3 в основном изолирует проблему Вместо того, чтобы решать его (также добавляет сложности таблицам маршрутизации), а решения 4 и 5 просто не входят в сферу действия, поскольку у меня нет ресурсов для покупки специализированного оборудования и вы можете отключить сервер, поскольку он находится на производстве, чтобы суммировать замену Сервер CentOS с чем-то «лучше» отключен от таблицы.

Теперь вернемся к проблеме, давайте сначала опишем текущую настройку …

Интерфейсы :

eth1: IP: 10.0.0.1, GW: 10.0.0.1, NM: 255.255.255.0 (LAN) eth0: IP: 10.0.1.1, GW: 10.0.1.254, NM: 255.255.255.0 (ISP1 - ADSL Router) eth2: IP: 10.0.2.1, GW: 10.0.2.254, NM: 255.255.255.0 (ISP2 - ADSL Router) 

/etc/sysctl.conf :

 # Controls IP packet forwarding net.ipv4.ip_forward = 1 # Controls source route verification net.ipv4.conf.default.rp_filter = 0 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Ignoring broadcasts request net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_messages = 1 

/ и т.д. / iproute2 / rt_tables:

 # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 2 ISP1 3 ISP2 

/ Etc / sysconfig / network-scripts / route-eth0 :

 10.0.1.0/24 dev eth0 src 10.0.1.1 table ISP1 default via 10.0.1.254 dev eth0 table ISP1 

/ Etc / sysconfig / network-scripts / route-eth2 :

 10.0.2.0/24 dev eth2 src 10.0.2.1 table ISP2 default via 10.0.2.254 dev eth2 table ISP2 

/ Etc / sysconfig / network-scripts / rule-eth0 :

 fwmark 2 table ISP1 from 10.0.1.1 table ISP1 

/ Etc / sysconfig / network-scripts / rule-eth2 :

 fwmark 3 table ISP2 from 10.0.2.1 table ISP2 

/ Etc / sysconfig / iptables :

 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # Basic Rules -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT # SSH -A INPUT -i eth0 -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -i eth2 -m tcp -p tcp --dport 22 -j ACCEPT # OpenVPN -A INPUT -i eth0 -m udp -p udp --dport 1194 -j ACCEPT -A INPUT -i eth2 -m udp -p udp --dport 1194 -j ACCEPT # Allow everything from LAN -A INPUT -i eth1 -j ACCEPT # Allow everything from the VPN -A INPUT -i tun0 -j ACCEPT # Default Drop on everything else -A INPUT -j DROP # Allow forwarding from LAN and VPN -A FORWARD -i eth1 -j ACCEPT -A FORWARD -i tun0 -j ACCEPT # Allow all outbound traffic -A OUTPUT -o lo -j ACCEPT -A OUTPUT -o eth1 -j ACCEPT COMMIT *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # DNAT to Developer Box (SSH Server) -A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222 -A PREROUTING -i eth2 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222 # SNAT -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.1.1 -A POSTROUTING -o eth2 -j SNAT --to-source 10.0.2.1 COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Mark Based Routing? (based on NerdBoys site) -A PREROUTING -j CONNMARK --restore-mark -A PREROUTING --match mark --mark 2 -j ACCEPT -A PREROUTING -i eth0 -j MARK --set-mark 2 -A PREROUTING --match mark --mark 3 -j ACCEPT -A PREROUTING -i eth2 -j MARK --set-mark 3 -A PREROUTING -j CONNMARK --save-mark COMMIT 

Балансировка нагрузки возможна с помощью скрипта gwping bash, который в основном контролирует 2 wans (eth0 и eth2) и настраивает маршруты и веса по умолчанию на сервере, как это (в то время как в балансе нагрузки или в 2 оборотах вверх и вниз):

 ip route replace default scope global nexthop via 10.0.1.1 dev eth0 weight 1 nexthop via 10.0.2.1 dev eth1 weight 1 

Проблема в том, что даже с этой настройкой, которую многие люди согласны, является правильной, у m все еще есть проблемы с доступом к службам внутри сети извне (в частности, в поле разработчика ssh и OpenVPN), даже если пакеты «Маркируются» и маршрутизируются соответственно, ответ из окна dev всегда идет по неправильному пути. Я не знаю, пропустил ли m что-то в области mangle или nat или неправильно понял исходную маршрутизацию вообще, так или иначе, если кто-то знает, как сделать эту работу соответственно, она будет любезно оценена.

Моими источниками для этой установки являются:

 lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS fatalsite.net/?p=90 nerdboys.com/2006/05/05/conning-the-mark-multiwan-connections-using-iptables-mark-connmark-and-iproute2/ policyrouting.org/PolicyRoutingBook/ONLINE/CH08.web.html unix.stackexchange.com/questions/58635/iptables-set-mark-route-diferent-ports-through-different-interfaces unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateways bulma.net/body.phtml?nIdNoticia=2145 

С наилучшими пожеланиями

PS1: Я нашел веб-сайт, в котором говорится, что метки в таблице маршрутизации должны быть + 1 отличными от значков iptables (kim.attr.ee/2010/08/source-based-policy-routing-on-centos.html) Это правда? Или этот сайт является супер-неправильным.


Обновление 15/08/2012 22:15

После большего исследования и отладки я нашел веб-сайт, в котором говорится, что я забыл добавить часть SNAT в таблицу после маршрутизации, поэтому добавляю эти правила в конфигурацию iptables:

 -A POSTROUTING --match mark --mark 2 -j SNAT --to-source 10.0.1.1 -A POSTROUTING --match mark --mark 3 -j SNAT --to-source 10.0.2.1 

Но m по-прежнему не может подключиться к devbox извне сети. С хорошей стороны a iptables -t nat -nvL POSTROUTING дает подсказку о разработке маршрутизации политики на основе connmark, поэтому, возможно, что-то связанное с маршрутизатором ISP1 и ISP2:

 Chain POSTROUTING (policy ACCEPT 520 packets, 56738 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x2 to:10.0.1.1 6 312 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x3 to:10.0.2.1 903 70490 SNAT all -- * eth0 0.0.0.0/0 0.0.0.0/0 to:10.0.1.1 931 78070 SNAT all -- * eth2 0.0.0.0/0 0.0.0.0/0 to:10.0.2.1 

Кроме того, я добавляю больше информации из моей настройки, пожалуйста, кто-нибудь бросит меня на жизнь с тех пор, как у m исходит из идей …>. <

Ip route show :

 10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1 10.0.2.0/24 dev eth2 proto kernel scope link src 10.0.2.1 10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1 10.8.0.0/24 via 10.8.0.2 dev tun0 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.1 169.254.0.0/16 dev eth2 scope link default nexthop via 10.0.1.254 dev eth0 weight 1 nexthop via 10.0.2.254 dev eth2 weight 1 

Показать ip правило:

 0: from all lookup 255 1024: from all fwmark 0x2 lookup ISP1 1025: from all fwmark 0x3 lookup ISP2 2024: from 10.0.1.1 lookup ISP1 2025: from 10.0.2.1 lookup ISP2 32766: from all lookup main 32767: from all lookup default 

Новые источники:

 sarcasmasaservice.com/2013/04/linux-routing-capabilities-my-abuse-thereof/ 

С наилучшими пожеланиями

  • Выборочно маршрутизируя трафик через Ethernet или Wi-Fi, с надлежащим DNS (Mac OS X 10.6)
  • Debian: таблица маршрутизации и два интерфейса
  • Linux-маршрутизация и HMA
  • Как принудительно разбить туннель на Mac на Cisco VPN
  • Как обеспечить доступ в Интернет только через VPN
  • Как сопоставить IP-адрес на localhost?
  • Как я могу выполнить ping через альтернативный шлюз?
  • Как настроить сетевой менеджер Ubuntu / Linux для выборочного маршрутизации сетевого трафика через VPN?
  • 3 Solutions collect form web for “Исходная политическая маршрутизация и NAT (DNAT / SNAT) aka Multi WANs на CentOS 5”

    Что ж…

    После нескольких тысяч часов отладки, тестирования различных настроек и 72-часового тяжелого тестирования на производстве мне удалось найти правильное решение / настройку, проблема заключалась в правилах iptables (секция mangle), которые, по-видимому, Но когда они выходят, для пакетов не было никаких, так или иначе, это мое окончательное рабочее решение для моей проблемы:

    / Etc / sysconfig / iptables :

     *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # Basic Rules -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT # SSH -A INPUT -i eth0 -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -i eth2 -m tcp -p tcp --dport 22 -j ACCEPT # OpenVPN -A INPUT -i eth0 -m udp -p udp --dport 1194 -j ACCEPT -A INPUT -i eth2 -m udp -p udp --dport 1194 -j ACCEPT # Allow everything from LAN -A INPUT -i eth1 -j ACCEPT # Allow everything from the VPN -A INPUT -i tun0 -j ACCEPT # Default Drop on everything else -A INPUT -j DROP # Allow forwarding from LAN and VPN -A FORWARD -i eth1 -j ACCEPT -A FORWARD -i tun0 -j ACCEPT # Allow all outbound traffic -A OUTPUT -o lo -j ACCEPT -A OUTPUT -o eth1 -j ACCEPT COMMIT *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # DNAT to Developer Box (SSH Server) -A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222 -A PREROUTING -i eth2 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222 # SNAT -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.1.1 -A POSTROUTING -o eth2 -j SNAT --to-source 10.0.2.1 COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # CONNMARK Source Based Routing -A PREROUTING -i eth0 -m state --state NEW,RELATED,ESTABLISHED -d 10.0.1.1 -j CONNMARK --set-mark 0x2 -A PREROUTING -i eth2 -m state --state NEW,RELATED,ESTABLISHED -d 10.0.2.1 -j CONNMARK --set-mark 0x3 -A PREROUTING -i eth1 -m connmark --mark 0x2 -j CONNMARK --restore-mark -A PREROUTING -i eth1 -m connmark --mark 0x3 -j CONNMARK --restore-mark -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark COMMIT 

    Очевидно, что плюс все предыдущие настройки, связанные с iproute и gwping (для балансировки нагрузки и отката), решения стали возможными благодаря источникам [1] и [2], оба указали мне на другую часть (Luca Gibelli for Часть PREROUTING и Карл Боуден для части OUTPUT) решения, а также здесь живут еще несколько источников для других веб-сайтов, которые указывали мне на правильное направление поиска. Надеюсь, что это поможет другому системному администратору в будущем.

    С наилучшими пожеланиями

    Источники:

     [1]www.nervous.it/2010/09/dnat-and-ip-source-routing-woes/ [2]blog.khax.net/2009/12/01/multi-gateway-balancing-with-iptables/ [3]home.regit.org/netfilter-en/links-load-balancing/ [4]mailman.ds9a.nl/pipermail/lartc/2006q2/018964.html [5]web.archive.org/web/20120320115329/http://versa.net.au/index.php?option=com_content&task=view&id=21&Itemid=34 

    Обновление 10/10/2013

    OpenVPN требует дополнительной директивы конфигурации для работы с несколькими настройками wan (как и предыдущий), поэтому просто добавьте параметр multihome в server.conf (OpenVPN> = 2.1, для более низких версий просто измените локальную директиву, чтобы прослушать только в Конкретный ip), и вам хорошо идти.

    Просто подсказка для вас. Я делаю точный точный тип вещей только без балансировки нагрузки и 3 wan-ссылок, и я даже не использую iptables для всего этого. Я считаю, что использование простой политики на основе маршрутизации и socat будет гораздо более эффективным

    My rt_tables:

     100 lan 102 wireless 103 wan1 104 wan2 105 wan3 

    В интерфейсах для каждой wan-ссылки:

     /bin/ip route add <wan network id> dev eth0 src <wan host ip> table wan1 /bin/ip route add default via <wan gateway address> table wan1 /bin/ip rule add from <wan host ip> table wan1 

    В интерфейсах вниз для каждой wan-ссылки:

     /bin/ip route del default via <wan gateway address> table wan1 /bin/ip rule del from <wan host ip> table wan1 

    Чтобы заставить клиент lan указать конкретную ссылку: поместите это в свой скрипт интерфейса:

     /bin/ip rule add from <lan client ip> table <wan table number of link to force it through> 

    И это в нижнем скрипте:

     /bin/ip rule del from <lan client ip> table <wan table number of link to force it through> 

    Для отправки входящего соединения на конкретный компьютер (например, веб-сервер) добавить что-то подобное в rc.local (это может работать, если ссылка вставлена ​​или нет)

     exec socat -T15 tcp4-listen:80,reuseaddr,fork tcp:<lan host ip to send it to>:80 >> /var/log/socat-web.log 2>&1 

    Затем включите ip forwarding и masquerade и любые другие правила брандмауэра, в которых вы нуждаетесь, и ваше добро пожаловать

    На ubuntu вы даже можете создать upstart job для socat, это мой /etc/init/socat-web.conf:

     description "socat web port tunnel" author "jacqueline" start on started mountall stop on shutdown respawn respawn limit 99 5 script export HOME="/root" exec socat -T15 tcp4-listen:80,reuseaddr,fork tcp:192.168.0.97:80 >> /var/log/socat-web.log 2>&1 end script post-start script # Optionally put a script here that will notifiy you socat has (re)started end script 

    @CentOS_noob

    Во-первых, отличная работа и большое спасибо за то, что поделились, большое вам спасибо! Я много лет боролся с этим. 🙂

    Если вы хотите направить определенные сервисы по выделенной ссылке, вы можете сделать это так, как это делается перед вашими текущими правилами MARKING.

     iptables -t mangle -A PREROUTING -i br1 -s 10.1.1.2 -p tcp --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j CONNMARK --set-mark 0x3 iptables -t mangle -A PREROUTING -i br1 -s 10.1.1.2 -p icmp -j CONNMARK --set-mark 0x4 

    Где:

     br1 - is LAN interface 10.1.1.2 - is LAN's IP of some host. 
    Interesting Posts

    Страница Bash Man: kill <pid> vs kill -9 <pid>

    Сделать Chrome автоматически загружать небезопасный контент для определенных страниц / веб-сайтов

    Scripting: что проще всего извлечь значение в теге XML-файла?

    SFTP как папка на Vista

    Запись видеоигры на P4 … ускорить меня, Скотти?

    Почему Windows7 просыпается после того, как я переспал?

    Мои Windows 10 pc получили очень медленно, хотя использование процессора и памяти в порядке. Что еще я могу сделать?

    Не удалось настроить RAID 1 на Fedora

    Как вы ускоряете просмотр фотографий в Windows 8 Metro Photo Viewer быстрее?

    Как я могу автоматически входить в сеть с невольным порталом в Windows?

    Chainload не-EFI Linux от EFI Linux

    Вентилятор входит в нижнюю или верхнюю часть блока питания?

    Общие папки / настройки Mac OS для проверки (при попытке избавиться от отвратительного самозапускающегося приложения)

    Наследование разрешений каталога Linux для созданных новых файлов

    Обновление и перезагрузка Windows

    Давайте будем гением компьютера.