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

У меня есть 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) подключен ко второму маршрутизатору (Cable) (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 NIC необходимо пересылать их. Как это сделать?

4 ответа

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

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

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

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

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

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

Допустим, вы хотите маршрутизировать хост 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 читает эту отметку и пытается найти соответствующее правило. Очевидно, здесь чего-то не хватает, но это главная идея.

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

Другие вопросы по тегам