Доброго времени суток. Помогите разобраться.
Есть сервер с тремя сетевыми интерфейсами. Один локалка два других разные интернет провайдеры.
Задача в следующем, иметь доступ к локалке по адресу второго интернет провайдера, но по умолчанию выбирается gateway первого провайдера. В 6 центос все работало без проблем посредством маршрутизации, даже iptables не нужно было крутить, теперь никак не могу разобраться.
Если стоит gw 2 провайдера, то с мира я могу зайти в локалку по rdp, или увидеть камеры внутри сети. Как только меняю gw, пропадает локалка. Куда ткнуть, где копать?
Что сделано:
созданы 2 таблицы в rttables
t1 t2
указаны их айпи и маршруты и правила
в rttables
101 T1
102 T2
(enp5s0 192.168.0.0/24, enp6s0 217.xxx.xxx.218, -первый isp enp7s0 192.168.59.2 - второй isp)
На старте вот так вот скриптик
#!/bin/bash
ip route add 127.0.0.0/8 dev lo table T1
ip route add 192.168.0.0/24 dev enp5s0 table T1
ip route add 217.ххх.ххх.216/29 dev enp6s0 src 217.ххх.ххх.218 table T1
ip route add default via 217.ххх.ххх.217 dev enp6s0 table T1
ip route add 127.0.0.0/8 dev lo table T2
ip route add 192.168.0.0/24 dev enp5s0 table T2
ip route add 192.168.59.0/30 dev enp7s0 src 192.168.59.2 table T2
ip route add default via 192.168.59.1 dev enp7s0 table T2
ip route add 217.xxx.xxx.216/29 dev enp6s0 src 217.xxx.xxx.218
ip route add 192.168.59.0/30 dev enp7s0 src 192.168.59.2
ip route add 192.168.0.0/24 dev enp5s0 src 192.168.0.1
ip rule add from 217.xxx.xxx.218 table T1
ip rule add from 192.168.59.2 table T2
ip route replace default via 192.168.59.1.
exit 0
после чего моя локалка идет через шлюз 2isp т.е. через 192,168,59,1, но тогда из мира при обращении на 217.ххх.ххх.218 не могу попасть в локалку на свой комп, который проброшен в iptables
вот конгфиг iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-I FORWARD -j NETFLOW
-I INPUT -j NETFLOW
-I OUTPUT -j NETFLOW
-A FORWARD -m ratelimit --ratelimit-set lowusersout --ratelimit-mode src -j DROP
-A FORWARD -m ratelimit --ratelimit-set lowusersin --ratelimit-mode dst -j DROP
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp5s0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 123 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 3702 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p udp -m udp --dport 138 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.0/24 --dport 5357 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.0/24 --sport 5357 -j ACCEPT
-A INPUT -p tcp --dport 5357 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -d 239.255.255.250 -m pkttype --pkt-type multicast -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i enp5s0 -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -d 239.255.255.250 -m pkttype --pkt-type multicast -j ACCEPT
-A FORWARD -d 192.168.0.2/32 -i enp6s0 -p tcp -m tcp --dport 9011 -j LOG --log-level debug - камеры с двра чтобы смотреть с мира офис
-A FORWARD -d 192.168.0.2/32 -i enp6s0 -p udp -m udp --dport 9011 -j LOG --log-level debug
-A FORWARD -d 192.168.0.166/32 -i enp6s0 -p tcp -m tcp --dport 53388 -j LOG --log-level debug - компы в локалке для доступа по rdp
-A FORWARD -d 192.168.0.166/32 -i enp6s0 -p udp -m udp --dport 53388 -j LOG --log-level debug
-A FORWARD -d 192.168.0.2/32 -i enp6s0 -p tcp -m tcp --dport 9011 -j ACCEPT
-A FORWARD -d 192.168.0.2/32 -i enp6s0 -p udp -m udp --dport 9011 -j ACCEPT
-A FORWARD -d 192.168.0.166/32 -i enp6s0 -p tcp -m tcp --dport 53388 -j ACCEPT
-A FORWARD -d 192.168.0.166/32 -i enp6s0 -p udp -m udp --dport 53388 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Aug 16 22:34:45 2020
# Generated by iptables-save v1.8.4 on Sun Aug 16 22:34:45 2020
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 217.xxx.xxx.218/32 -i enp6s0 -p tcp -m tcp --dport 9011 -j DNAT --to-destination 192.168.0.2:9011
-A PREROUTING -d 217.xxx.xxx.218/32 -i enp6s0 -p udp -m udp --dport 9011 -j DNAT --to-destination 192.168.0.2:9011
-A PREROUTING -d 217.xxx.xxx.218/32 -i enp6s0 -p tcp -m tcp --dport 53388 -j DNAT --to-destination 192.168.0.166:53388
-A PREROUTING -d 217.xxx.xxx.218/32 -i enp6s0 -p udp -m udp --dport 53388 -j DNAT --to-destination 192.168.0.166:53388
-A POSTROUTING -m mark --mark 0x9 -j MASQUERADE
COMMIT
# Completed on Sun Aug 16 22:34:45 2020
# Generated by iptables-save v1.8.4 on Sun Aug 16 22:34:45 2020
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i enp5s0 -j MARK --set-xmark 0x9/0xffffffff
COMMIT
Есть подозрение, что в centos8 по умолчанию выключены опции в ядре, ipv4 forward =1, но что еще нужно включить в ядре чтобы это работало? Может быть какие-то опции которые теперь по умолчанию выключены...
В общем непонятно, в тупике что-то. Пока по умолчанию gw 217.ххх.ххх.218 работает все отлично, из мира захожу на свой комп в локалке и вижу камеры, как только меняю gw на 192,168,59,1 из мира вижу только apache на 217.ххх.ххх.218, nfsen/mrtg и т.д. но дальше в локалку к компу и камерам попасть не могу
Отвечу на ваш вопрос из комментария: если ipv4 forward =0 то в локальной сети интернет небыл бы доступеню
Сейчас у вас все работает именно так как вы настроили, просто у вас логическая проблема:
у вас есть проброс порта -A PREROUTING -d 217.xxx.xxx.218/32 -i enp6s0 -p tcp -m tcp --dport 53388 -j DNAT --to-destination 192.168.0.166:53388
и пакеты придут на 217.xxx.xxx.218 и попадут на адрес 192.168.0.166:53388, а проблема в том что в соответствии с вашими настройками пакеты от 192.168.0.166(как и от все сети 192.168.0.0/24) пойдут в интернет не с адреса 217.xxx.xxx.218, а через адрес 192.168.59.2 соответственно источник подключения к RDP получит ответ от другово ип адреса чего он никак не ожидает, поэтому отбросит пакеты.
Варианты как это решить:
простой - 192.168.0.166 натить в интернет через 217.xxx.xxx.218
сложный - маскарадить и маркировать запросы вашего шлюза к 192.168.0.166 на нужные порты чтобы потом их отправлять с нужного ип на шлюзе.
Собственно я же итак пробрасываю 192.168.0.166 через 217.ххх.ххх.218 - или что конкретно вы имеете в виду, что-то я не совсем пойму эту фразу:
простой - 192.168.0.166 натить в интернет через 217.xxx.xxx.218
пункт 2 -сложный - маскарадить и маркировать запросы вашего шлюза к 192.168.0.166 на нужные порты чтобы потом их отправлять с нужного ип на шлюзе.
здесь речь идет и connmark я так понимаю? или какой вариант?
Буду очень благодарен и признателен если опишите поподробней
"Отвечу на ваш вопрос из комментария: если ipv4 forward =0" конечно же он включен, вопрос в том, что есть еще вот такие вот моменты и они мне не совсем понятны:
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
ip route replace default scope global nexthop via 217.xxx.xxx.217 dev enp6s0 weight 1 nexthop via 192.168.59.1 dev enp7s0 weight 1
вот в таком варианте я вроде как могу достучаться до 217 и локалке, НО, получается, что работает одновременно 2 шлюза и фиг пойми кто из локалки и как идет в интернет. Очень не хорошо все это
Герман Бронский,
проброс порта в iptables это то как пакеты приходят из интернета и это никак не влияет на то как они будут выходить в интернет, а выходят они default via 192.168.59.1. -через шлюз по умолчанию.
чтобы 192.168.0.166 выходил через другова провайдера вам нужно добавить чтото типа
ip rule add from 192.168.0.166 table T1
то что вы добавил два шлюза они будут по очереди выбиратся и это может привести к неожиданной работе сайтов и приложений у клиентов в локальной сети.
про маскарадинг - попробуйте сначала почитать документацию, как вобще устроен роутинг в линуксе и как ходит трафик внутри netfilter(iptables), почитайте LARTC, потом документацию по интерсующим вас параметрам sysclt.conf с большой вероятность большинство ваших вопросов отпадет после чтения документации.
Владимир, Благодарю вас! Очень помогли и все встало на свои места. На самом деле странно то, что в центос 6 было достаточным указать 2 разных маршрута в таблицах и их гейтвеи и соответственно при обращении не к дефолтному пакеты уходили обратно именно с него. Теперь эта схема не работает, думаю, что даже в 7 оси уже будет тоже самое.
"то что вы добавил два шлюза они будут по очереди выбиратся и это может привести к неожиданной работе сайтов и приложений у клиентов в локальной сети." - это просто эксперимент и учения ради =)
"ip rule add from 192.168.0.166 table T1" - именно это и было собственно тем, что нужно и натолкнуло на определенные мысли, спасибо большое еще раз!