У меня есть установка, как показано на изображении. Я знаю, что это безумие, но мне нужно работать только с этой конфигурацией.
Это в основном сервер ubuntu, действующий как маршрутизатор с 4 интерфейсами. 3 из них (eth0, eth1 и eth3) действуют как шлюзы к ПК1, ПК2 и ПК3 соответственно.
Я хочу, чтобы ПК выходили в Интернет через них, и установил правила iptable для создания брандмауэра на сервере ubuntu.
-----
| PC1 |10.1.0.101/16 (gw & dns-10.1.0.20)
-----
|
eth1 |10.1.0.20/16
---------------
| |
eth0 | Ubuntu | eth2 -----
10.1.5.244 -------------| Server |-------------| PC2 |10.1.0.102/16
(Router) 10.1.0.10/16| |10.1.0.30/16 ----- (gw & dns-10.1.0.30)
---------------
eth3 |10.1.0.40/16
|
-----
| PC3 |10.1.0.103/16
----- (gw & dns-10.1.0.40)
eth0 - connected to router (internet connected interface - gw=10.1.5.244)
inet addr:10.1.0.10 Bcast:10.1.255.255 Mask:255.255.0.0
eth1 - inet addr:10.1.0.20 Bcast:10.1.255.255 Mask:255.255.0.0
eth2 - inet addr:10.1.0.30 Bcast:10.1.255.255 Mask:255.255.0.0
eth3 - inet addr:10.1.0.40 Bcast:10.1.255.255 Mask:255.255.0.0
$route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.1.5.244 0.0.0.0 UG 0 0 0 eth0
10.1.0.0 * 255.255.0.0 U 0 0 0 eth2
10.1.0.0 * 255.255.0.0 U 0 0 0 eth1
10.1.0.0 * 255.255.0.0 U 0 0 0 eth3
10.1.0.0 * 255.255.0.0 U 0 0 0 eth0
Я решил проблему потока ARP с помощью следующих конфигураций arp.
echo "1" > /proc/sys/net/ipv4/conf/all/arp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
Также я установил IP-маршруты на 3-х интерфейсах eth1, eth2 и eth3, как показано ниже для eth2.
echo "152 table2" >>/etc/iproute2/rt_tables
ip route add default via 10.1.0.10 dev eth0 table table2
ip route add 10.1.0.0/16 dev eth2 table table2
ip rule add from 10.1.0.30 table table2
ip rule add to 10.1.0.30 table table2
Я не уверен в правилах IP на eth0.
с приведенной выше конфигурацией я могу подключаться к отдельным интерфейсам eth1, eth2, eth3 с PC1, PC2 и PC3 (решение проблемы потока arp).
Однако я не могу подключиться к Интернету на ПК1 и ПК3.
Кажется, что возвращаемые пакеты маршрутизируются только на eth2 (1-я запись в маршруте -n для подсети 10.1.0.0/16) независимо от исходящего ПК1, ПК2 или ПК3. (Также я сохранил rp_filter = 1 поскольку я хочу использовать только соответствующий исходящий интерфейс.)
Итак, мой вопрос заключается в том, как направить ответные пакеты на соответствующий интерфейс или как получить доступ к Интернету на ПК только с соответствующего интерфейса.
Похоже, вы пытаетесь заставить маршрутизатор выполнять работу коммутатора ... но почему бы не превратить сервер в настоящий коммутатор?
Вы можете использовать решение сетевого моста в Ubuntu, чтобы просто связать все интерфейсы, а затем вы могли бы использовать сервер в качестве прозрачного брандмауэра, без каких-либо интерфейсов уровня 3, участвующих в трафике с ПК в Интернет.
Посмотреть здесь : https://help.ubuntu.com/community/NetworkConnectionBridge
В качестве альтернативы, сделайте его настоящим маршрутизатором, но в этом случае разделите ваш / 16 на более мелкие подсети, чтобы каждый компьютер находился в своей собственной подсети, а затем получите последнюю подсеть между сервером и интернет-шлюзом.
Linux Netfilter может передавать мостовой трафик в таблицы правил iptables для проверки. Существуют специальные выражения для сопоставления с конкретным физическим интерфейсом (поскольку логический интерфейс, который вы указываете в -i или -o, всегда будет в этом случае интерфейсом-мостом).
Чтобы включить эту функцию, вы должны настроить эти переменные sysctl по мере необходимости (в sysctl.conf
, какой-то файл в sysctl.conf.d
, повторяя 1 в какой-то файл в / proc и т. д.):
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
Значение каждой опции говорит само за себя. Эти ключи появляются только после bridge
модуль ядра загружен, например, с modprobe bridge
.
Затем построить обычный мост:
auto eth0
iface eth0 inet manual
auto eth1
iface eth1 inet manual
auto eth2
iface eth3 inet manual
auto br0
iface br0 inet static
address 10.1.0.10
netmask 255.255.0.0
broadcast 10.1.255.255
network 10.1.0.0
bridge_ports eth0 eth1 eth2
bridge_stp off
bridge_fd 0
Обратите внимание, что вам не нужно иметь несколько IP-адресов маршрутизатора. Мост похож на очень умный переключатель.
После этого вы можете фильтровать свой трафик с помощью модуля Physdev:
iptables -A FILTER -m physdev --physdev-in eth0 -s 10.0.1.2 -j DROP
этот пример правила отбрасывает любой трафик с 10.0.1.2, который входит в маршрутизатор через eth0.
Использовать iptables -m physdev --help
чтобы увидеть все его возможности.
В Netfilter есть и другие функции, разработанные специально для работы с мостовым трафиком. Эти функции открываются с помощью другой утилиты пользовательского пространства, называемой ebtables
. Они позволяют, например, маскировать и преобразовывать MAC-адреса, сканировать и так далее; прочтите руководство по ebtables для подробностей.