
Я использую Gentoo Linux, поэтому использую простые iptbales для управления своим брандмауэром и сетью. Обычно я использую wan0 для всего своего трафика, но поскольку у меня уже есть веб-сервер за ним, я хотел бы wan1 (привязать к другому домену) для своего второго веб-сервера.
У меня есть три интерфейса:
- eth0 = ЛВС
- wan0 = Основной используемый WAN (шлюз по умолчанию)
- wan1 = Вторичный WAN
Некоторая информация о шлюзах
> route -n
Kernel IP Routentabelle
Ziel Router Genmask Flags Metric Ref Use Iface
0.0.0.0 80.108.x.x 0.0.0.0 UG 0 0 0 wan0
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
80.108.x.0 0.0.0.0 255.255.254.0 U 0 0 0 wan0
84.114.y.0 0.0.0.0 255.255.255.0 U 0 0 0 wan1
127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo
Значение по умолчанию для NAT/MASQUEARDING:
sysctl -q -w net.ipv4.conf.all.forwarding=1
iptables -N BLOCK
iptables -A BLOCK -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i eth0 -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i lo -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan1 -j MASQUERADE
За этим шлюзом я запускаю несколько веб-серверов. На одной машине я запускаю HTTP-сервер на порту 8000 вместо 80. Обычно, когда я использую wan0 как входящий интерфейс, я использую следующие правила:
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan0 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan0 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
Это отлично работает. Теперь я хотел бы использовать wan1, так как wan0 привязан к IP/домену, который я обычно использую для чего-то другого.
Я думал, что простое изменение wan1 поможет.
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan1 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan1 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
Но это не работает. Я думаю, проблема в том, что wan0 — это GW по умолчанию. Поэтому я думаю, что пакеты, полученные wan1, пересылаются на lan_host1, но при отправке обратно на шлюз они отправляются через wan0 вместо wan1 или, по крайней мере, с использованием ip от wan0.
Есть ли у вас какие-нибудь предложения, как мне с этим справиться?
Спасибо заранее, Роб
решение1
Поскольку ответ привязан к конфигурации, я делаю некоторые предположения. Вам придется адаптировать ответ, чтобы он соответствовал фактической конфигурации.
wan1LAN и шлюз дляwan1произвольно выбраны как 84.114.7.0/24 и 84.114.7.254.
правила брандмауэра не учитываются, но все это не должно с ними взаимодействовать.
На Линуксеip link
,ip address
иip route
всегда следует использовать вместо устаревших ifconfig
и route
. route
вероятно, в любом случае не сможет обрабатывать дополнительные таблицы маршрутизации.
Просто в качестве напоминания,iptablesили на самом делесетевой фильтр, не маршрутизирует, но может своими действиями изменять решения о маршрутизации, принимаемые стеком маршрутизации IP. Этосхемапоказывает, где могут быть приняты решения о маршрутизации. Для маршрутизированного (а не локально возникшего) трафика, который находится только в одном месте, и изменения должны произойти до:raw/ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА,mangle/ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧАилиnat/ПРЕДВАРИТЕЛЬНАЯ ПЕРЕДАЧА, ссыройчасто непрактично инаттолько в ограниченных случаях, в основном оставляяувечье.
Абазовая многосетевая система, чтобы использовать несколько путей к интернету, обычно требуетсямаршрутизация политики, где маршрут может меняться не только с пунктом назначения, как обычно, но и с источником или другими селекторами (как это будет сделано здесь), используемыми в правилах политики. В Linux дополнительные правила, созданные с помощьюip rule
можно выбрать другую таблицу маршрутизации, например, чтобы выбрать другой маршрут по умолчанию (все равно будет только один маршрут по умолчанию, но одинна таблицу маршрутизации).
Итак, вот принцип, при этом сохраняя активностьСтрогая переадресация по обратному пути(rp_filter), заключается в приеме пакетов, поступающих отwan1и направить их как обычно в сторонуeth0используя альтернативную таблицу (которая позволит пройтиrp_filter). Эта дополнительная таблица маршрутизации должна дублировать основную таблицу маршрутизации, но использовать только маршруты, необходимые для альтернативного пути (wan1) и, таким образом, не включая обычные маршруты с «нормальным» путем (wan0). Если другие маршруты (например, VPN и т. д.) должны быть задействованы в потоках, проходящих черезwan1, есть вероятность, что придется добавить и их маршрут, или создать другие дополнительные правила и таблицы, чтобы справиться с этим.
Поскольку Linux прекратил использование кэша маршрутизации в ядре 3.6, ничто в стеке маршрутизации не будет сообщать о необходимости отправки ответных пакетов изхост1клиенту черезwan1и они в конечном итоге выйдут, используя основной маршрут по умолчанию черезwan0, NAT с неправильным IP для этого интерфейса (сетевой фильтрне зависит от маршрута и уже выбрал NAT, который будет выполнен при получении первого пакета соединения) и, вероятно, был сброшен следующим маршрутизатором провайдера, также выполняющим строгую фильтрацию обратного пути. Естьсетевой фильтрфункция, позволяющая копировать метку пакета в метку conntrack и помещать ее обратно в пакет: это будет действовать как память маршрута для соединения. Такiptablesисетевой фильтр'sconntrackбудет использоваться для двух связанных функций: для маркировки пакета с целью изменения решения о маршрутизации и для восстановления этой маркировки в ответных пакетах, идентифицированных как часть того же соединения.
Все это преобразуется в следующие команды:
- часть маршрутизации
Используйте для маркированных пакетов (произвольное значение метки 101) дополнительную таблицу маршрутизации (несвязанное произвольное значение также 101):
ip rule add fwmark 101 lookup 101
Заполните таблицу записями, похожими наосновнойтаблица маршрутизации, минусwan0записи:
ip route add table 101 192.168.0.0/16 dev eth0
ip route add table 101 84.114.7.0/24 dev wan1
ip route add table 101 default via 84.114.7.254 dev wan1
- iptables/сетевой фильтрчасть
Возможны различные варианты оптимизации следующих команд. Вероятно, их можно улучшить.
Восстановить потенциальную предыдущую отметку, уже сохраненную, чтобы ответные пакеты получили ту же отметку, что и исходные пакеты:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
Отметить пакеты, прибывающие изwan1для изменения решения о маршрутизации выше:
iptables -t mangle -A PREROUTING -i wan1 -j MARK --set-mark 101
Если есть отметка, сохраните ее вconntrack(можно было сделать внаттаблицу, чтобы сделать это только один раз для каждого потока соединения, а не для каждого пакета):
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
На самом деле это все равно не сработаетСтрогая переадресация по обратному путипроверьте, так как этонедокументированная функциябыл добавлен в 2010 году. Его необходимо использовать здесь:
sysctl -w net.ipv4.conf.wan1.src_valid_mark=1