Назад | Перейти на главную страницу

Почти работает: как настроить правила iptables и iproute2 на двойном сервере WAN linux?

У меня есть Raspberry Pi (работающий под управлением Raspbian) с тремя сетевыми интерфейсами (один Ethernet и два USB-Wi-Fi). Я хочу добиться следующего: у меня есть два WAN-подключения к Интернету (DSL + Cable), и я хочу настроить RasPi таким образом, чтобы он предлагал два шлюза по умолчанию. Я хочу, чтобы определенные клиенты в моей локальной сети использовали тот или иной шлюз. Вот обзор того, чего я хочу достичь:

Обычно у вас не может быть двух шлюзов по умолчанию по очевидным причинам, но я обнаружил, что с iproute2 вы можете сделать именно это и использовать несколько таблиц маршрутизации (и, следовательно, шлюзы по умолчанию), которые применяются по правилам. (См. Подробности моей конфигурации ниже)

Интерфейс Ethernet (192.168.10.1) подключен к коммутатору, который соединяет мою локальную сеть (192.168.10.0/24).

Интерфейс wlan0 (192.168.178.199) подключен к первому маршрутизатору WLAN (DSL) (192.168.178.1). Интерфейс wlan1 (192.168.0.199) подключен ко второму роутеру (Кабель) (192.168.0.1).

Вот мой /etc/network/interfaces

auto lo
iface lo inet loopback

iface eth0 inet static
address 192.168.10.1
netmask 255.255.255.0

iface wlan0 inet static
address 192.168.178.199
netmask 255.255.255.0
wpa-ssid "ALICE"
wpa-psk "yyyyyyyy"

iface wlan1 inet static
address 192.168.0.199
netmask 255.255.255.0
wpa-ssid "BOB"
wpa-psk "xxxxxxxx"

По какой-то причине установка auto так как два интерфейса wlan работали не так хорошо, большую часть времени хотя бы один из них не получал "повышенный", поэтому я пока поместил ifup для них в rc.local. Когда я загружаюсь, оба интерфейса wlan работают, подключены к своим wlan, и оба могут пинговать свои маршрутизаторы (например, ping 192.168.178.1 -I wlan0).

Следующим шагом была настройка iproute2. Вот мой /etc/iproute2/rt_tables

#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
1 alice
2 bob

После определения этих двух таблиц я создал эти ip настройки, которые применяются при каждой загрузке после включения всех сетевых адаптеров:

ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.199 table alice
ip route add default via 192.168.178.1 table alice
ip route add 192.168.0.0/24 dev wlan1 src 192.168.0.199 table bob
ip route add default via 192.168.0.1 table bob
ip rule add from 192.168.178.199 table alice
ip rule add from 192.168.0.199 table bob
ip route add default scope global nexthop via 192.168.178.1 dev wlan0 weight 1 nexthop via 192.168.0.1 dev wlan1 weight 1

В целях тестирования я установил сервер имен Google (8.8.8.8) по умолчанию на данный момент в /etc/resolv.conf.

На данный момент я могу успешно пинговать хосты в Интернете из RasPi, полученные запросы отправляются равномерно через тот или иной шлюз (я проверил это с помощью ping -R 8.8.8.8).

Теперь мой вопрос (ы):

  1. Что мне нужно сделать, чтобы клиенты (со статическим IP-адресом, без DHCP) в моей локальной сети 192.168.10.0/24 использовали RasPi в качестве gw по умолчанию (192.168.10.1 - интерфейс eth0) для доступа в Интернет? Я думаю, что это сделано с маскарадингом и iptables, но я понятия не имею, как это сделать с этой настройкой.

  2. Как мне изменить ip правила, чтобы клиенты не только могли подключаться к Интернету, как сам RasPi, но и использовали тот или иной шлюз? Например, если я хочу, чтобы хост 192.168.10.100 использовал шлюз «ALICE», а 192.168.10.101 использовал «BOB»?

Я чувствую себя довольно близко к финишу, любая помощь в этом, вероятно, не таком распространенном вопросе приветствуется. Заранее спасибо!

С уважением, Роб

Обновить:

Я немного продвинулся: после добавления этих правил ...

ip rule add fwmark 1 table alice prio 1024
ip rule add fwmark 2 table bob prio 1025

... Я могу (из 192.168.10.100) пинговать не только интерфейс Ethernet RasPi на 192.168.10.1, но и интерфейс wlan на 192.168.178.199. Я пока не могу пропинговать маршрутизатор за этим интерфейсом (192.168.178.1) или какие-либо хосты в Интернете. Но я думаю, мы приближаемся ... Итак, пакеты поступают на правильный интерфейс wlan, но теперь wlan nics должен их пересылать. Как это сделать?

route добавить gw 192.168.10.1 по умолчанию на каждом из клиентов

и

РЕДАКТИРОВАТЬ:

iptables -t mangle -A PREROUTING -s 192.168.10.100/32 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.10.101/32 -j MARK --set-mark 2

Смотрите также:

http://lartc.org/howto/lartc.rpdb.multiple-links.html

http://linux-ip.net/html/adv-multi-internet.html

войти в etc/sysctl.conf файл и изменить

**net.ipv4.ip_forward=0** to
**net.ipv4.ip_forward=1**
**sysctl -p /etc/sysctl.conf**

#iptables -P FORWARD ACCEPT
#service iptables save

Для второго вопроса вам необходимо иметь два интерфейса для LAN на вашем маршрутизаторе. Скажем, например, у вас есть Eth3 и Eth4 в качестве сетевых интерфейсов. Адрес Eth3 для BOB и адрес Eth4 для Алисы. Невозможно использовать шлюз WAN в качестве шлюза LAN.

Допустим, вы хотите маршрутизировать хост 192.168.10.252 через wlan0:

iptables -t mangle -N MARK1
iptables -t mangle -A MARK1 -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j CONNMARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j ACCEPT

# local traffic
iptables -t mangle -A PREROUTING -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT 
# rest
iptables -t mangle -A PREROUTING -i eth0 ! -d 192.168.10.0/24 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -s 192.168.10.252 -i eth0 -j MARK1

iptables -t nat -N SNAT1
iptables -t nat -A SNAT1 -j SNAT1 --to-source 192.168.178.199/32
iptables -t nat -A SNAT1 -j ACCEPT

iptables  -t nat -A POSTROUTING -o wlan0 -m mark --mark 0x1 -j SNAT1

Скажите iproute2 прочитать эти отметки:

ip rule add pref 30000 fwmark 1 lookup alice
ip rule add pref 29000 from 192.168.178.199 lookup alice

ip route add 0.0.0.0 dev wlan0 scope link src 192.168.178.199 table alice
ip route add  default  via 192.168.178.1  dev wlan0 scope global table alice
ip route add 192.168.10.0/24 dev eth0 scope link src 192.168.10.1 table alice

Если хост 192.168.10.252 хочет получить доступ к чему-то, что не предназначено для самого маршрутизатора, это соединение помечается как "1", iproute читает этот знак и пытается найти подходящее правило. Очевидно, здесь чего-то не хватает, но это основная идея.

Если вы хотите следовать этому решению, вам необходимо удалить веса маршрута. Когда вы возитесь с таблицами маршрутизации и правилами, не забудьте очистить кеш.

если у вас есть только один общедоступный IP-адрес в каждой WAN, вам может потребоваться выполнить PAT (преобразование адресов порта) вместо NAT (преобразование сетевых адресов)

что-то вроде:

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE

РЕДАКТИРОВАТЬ: я предполагаю, что вы заменяете свои WAN IP-адреса частными IP-адресами ...