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

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

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

  • Без пароля SSH (Windows -> CentOS)
  • Изменение размеров разделов LVM
  • Как подключиться к Active Directory с помощью Linux-машины
  • Где Linux размещает сообщения о загрузке?
  • Как установить gcc 4.7.x / 4.8.x на CentOS
  • Как установить CentOS 5.5?
  • Я знаю, что эта тема неоднократно приводилась здесь при обмене стеками и кажется, что лучшие 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/ 

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

  • Как установить путь для команд sudo
  • Как просматривать изображения LuraWave в Linux?
  • Проблема с удаленным отображением приложений Java
  • Как сделать двоичную разницу двух файлов одинакового размера в Linux?
  • Emerge жалуется на заблокированные пакеты: что мне делать?
  • Смонтируйте диск HFSPlus с разрешениями на чтение и запись в Linux
  • 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. 
    Давайте будем гением компьютера.