Есть шлюз, который маршрутизирует несколько сетей. Для обяснения вопроса хватит трёх:
Код: Выделить всё
192.168.0.0/24
192.168.1.0/24
192.168.100.0/24
Задача следующая:
Сети 192.168.0.0 и 192.168.1.0 должны ходить в интернет.
Из сети 192.168.0.0 помимо интернета, должен быть доступ во все сети.
Из сети 192.168.1.0 должен быть доступ только к сети 192.168.100.0.
Из сети 192.168.100.0 не должно быть доступа никуда. Только если в неё стукнутся из 192.168.0.0 или 192.168.1.0.
Вот интерфейсы на шлюзе:
Код: Выделить всё
enp1s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::21b:21ff:fe98:98c prefixlen 64 scopeid 0x20<link>
ether 00:1b:21:98:09:8c txqueuelen 1000 (Ethernet)
RX packets 150691686 bytes 48123777316 (44.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 173453652 bytes 188693398226 (175.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xfbee0000-fbefffff
enp1s0f0:5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:1b:21:98:09:8c txqueuelen 1000 (Ethernet)
device memory 0xfbee0000-fbefffff
enp1s0f0:100: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:1b:21:98:09:8c txqueuelen 1000 (Ethernet)
device memory 0xfbee0000-fbefffff
192.168.1.1 и 192.168.100.1 - алиасы на одном физическом интерфейсе.
В интернет смотрит enp2s0.
Для реализации задачи добавил вот такие нехитрые правила iptables:
Код: Выделить всё
# Generated by iptables-save v1.6.0 on Wed Sep 13 15:03:47 2017
*nat
:PREROUTING ACCEPT [28146:2000758]
:INPUT ACCEPT [134:26457]
:OUTPUT ACCEPT [10:1298]
:POSTROUTING ACCEPT [77:8345]
-A POSTROUTING -s 192.168.0.0/24 -o enp2s0 -j MASQUERADE
-A POSTROUTING -s 192.168.1.0/24 -o enp2s0 -j MASQUERADE
COMMIT
# Completed on Wed Sep 13 15:03:47 2017
# Generated by iptables-save v1.6.0 on Wed Sep 13 15:03:47 2017
*filter
:INPUT DROP [4483:305219]
:FORWARD DROP [29:13484]
:OUTPUT ACCEPT [551:86334]
-A INPUT -i enp2s0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i enp1s0f0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.0.0/24 -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -j ACCEPT
-A FORWARD -s 192.168.1.0/24 -d 192.168.100.0/24 -j ACCEPT
-A FORWARD -s 192.168.1.0/24 -o enp2s0 -j ACCEPT
COMMIT
В такой конфигурации из сети 192.168.0.0 доступно всё, как и задумывалось.
Но из 192.168.1.0 нет доступа к сети 192.168.100.0.
Зато при добавлении ещё одного правила:
Код: Выделить всё
-A FORWARD -s 192.168.100.0/24 -d 192.168.1.0/24 -j ACCEPT
Доступ к сети 100 появляется.
На мой взгляд, это правило избыточное, так как ожидаю, что
Код: Выделить всё
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
всё разрулит и при обращении в 192.168.100.0 обратные пакеты пролетят через шлюз, как это и работает для сети 192.168.0.0.
Полагаю, проблема где-то в районе использования алиасов вместо полноценных физических интерфейсов. Или я не прав?