Добрый день!
Нужна помощь в настройке Iptables.
Есть два шлюза на Linux на которых установлен OpenVPN server и clien соответственно. Оба выполняют функции маршрутизатора NAT и VPN.
NAT настроен, клиенты получают интернет. Связь через OpenVPN между маршрутизаторами есть.
Пинги в локальную сеть от маршрутизатора А проходят в подсеть за маршрутизатором B и наоборот.
Клиентские ПК с обоих сторон пингуют (видят) vpn сеть.
Проблема пробиться клиентским ПК из одной подсети в другую, т.е. сеть LAN_A должна видеть сеть LAN_B и наоборот.
|LAN_A 192.168.100.0/24|-----------|ROUTER_A|----------интернет-----------|ROUTER_B|---------|LAN_B 192.168.70.0/24|
Внутренний IP ROUTER_A 192.168.100.254
VPN Server IP 10.8.8.1
Внутренний IP ROUTER_B 192.168.70.254
VPN Client IP 10.8.8.2
WAN="eth0"
LAN="eth1"
VPN="tun0"
Внешние IP динамические, OpenVPN работает через Dynamic DNS.
В теории от куда ноги растут знаю, это цепочка FORWARD в Iptables, но к сожалению не осилил.
Сами конфиги OpenVPN не выкладываю, как писал выше vpn работает.
Собственно только маршруты
client
push "route 192.168.100.0 255.255.255.0 10.8.8.1"
server
route add -net 192.168.70.0 netmask 255.255.255.0 gw 10.8.8.2 tap0
Iptables конфиги на шлюзах одинаковые, разные только адреса.
#!/bin/sh
IPTB="/sbin/iptables"
# Внешний интерфейс - смотрит в инет
WAN="eth0"
WAN_IP="0/0"
# Loopback интерфейс
LO="lo"
LO_IP="127.0.0.1"
LO_LAN="127.0.0.0/8"
# Внутренний интерфейс - смотрит в локалку
LAN="eth1"
LAN_IP="192.168.100.254"
LAN_NET="192.168.100.0/24"
# OpenVPN
VPN="tun0"
VPN_IP="10.8.8.1"
VPN_NET="10.8.8.0/24"
# Локальные хосты
RDP_TEST="192.168.100.50"
PC_1="192.168.100.49"
###############################################################################
# Очищаем все настройки
${IPTB} -P INPUT ACCEPT
${IPTB} -P FORWARD ACCEPT
${IPTB} -P OUTPUT ACCEPT
${IPTB} -t nat -P PREROUTING ACCEPT
${IPTB} -t nat -P POSTROUTING ACCEPT
${IPTB} -t nat -P OUTPUT ACCEPT
${IPTB} -t mangle -P PREROUTING ACCEPT
${IPTB} -t mangle -P OUTPUT ACCEPT
${IPTB} -F
${IPTB} -t nat -F
${IPTB} -t mangle -F
${IPTB} -X
${IPTB} -t nat -X
${IPTB} -t mangle -X
# Загружаем необходимые модули
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
/sbin/modprobe ipt_owner
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
# Модули для работы pptp. Абы шоб было, а может пригодится.
#/sbin/modprobe ip_conntrack_pptp
#/sbin/modprobe ip_nat_pptp
#/sbin/modprobe ip_gre
# Политка по умочанию, запретить все что не попадает в правила
${IPTB} -P INPUT DROP
${IPTB} -P FORWARD DROP
${IPTB} -P OUTPUT DROP
# Разрешаем все соединения на loopback
${IPTB} -A OUTPUT -o ${LO} -j ACCEPT
${IPTB} -A INPUT -i ${LO} -j ACCEPT
# ЗАЩИТА START
${IPTB} -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT #Простая защита от DoS-атаки
${IPTB} -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset # Защита от спуфинга
${IPTB} -I INPUT -m conntrack --ctstate NEW -p tcp ! --syn -j DROP # Защита от попытки открыть входящее соединение TCP не через SYN
# ЗАЩИТА END
# Разрешаем принимать ответ на уже установленные соединения
${IPTB} -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Разрешаем все соединения на LAN
${IPTB} -A OUTPUT -o ${LAN} -j ACCEPT
# Разрешаем все соединения на VPN
${IPTB} -A OUTPUT -o ${VPN} -j ACCEPT
# Разрешаем выход в интернет нашему роутеру в т.ч. и OpenVPN клиенту
${IPTB} -A OUTPUT -o ${WAN} -p tcp -m multiport --dport 20,21,22,23,53,80,443,1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
${IPTB} -A OUTPUT -o ${WAN} -p udp -m multiport --dport 53,123,1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Разрешить часть запросов ICMP
${IPTB} -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT #разрешим отвечать на запрос
${IPTB} -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT #разрешим ping
# Разрешаем подключение к роутеру с внешней сети по SSH
${IPTB} -A INPUT -i ${WAN} -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #SSH Server
${IPTB} -A OUTPUT -o ${WAN} -p tcp --sport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Разрешаем подключение с внешней сети к OpenVPN-серверу
${IPTB} -A INPUT -i ${WAN} -p udp --dport 1194 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #OpenVPN Server
${IPTB} -A OUTPUT -o ${WAN} -p udp --sport 1194 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#############################################################################################################
# !!! Разрешаем форвадить все в локальную сеть. В этом варианте при нестройке роутинга на чужом маршрутизаторе можно зайти в нашу локальную сеть
#${IPTB} -A FORWARD -s ${LAN_NET} -j ACCEPT
#${IPTB} -A FORWARD -d ${LAN_NET} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#---------------------------------------------VPN ROUTING--------------------------------------------------#
# Разрешаем из VPN сети доступ в нашу локальную сеть
${IPTB} -A FORWARD -s ${VPN_NET} -o ${LAN} -j ACCEPT
${IPTB} -A FORWARD -d ${VPN_NET} -i ${LAN} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Разрешаем из локальной сети в сеть за VPN. НЕРАБОТАЕТ!
${IPTB} -A FORWARD -s ${LAN_NET} -o ${VPN} -j ACCEPT
${IPTB} -A FORWARD -d ${LAN_NET} -i ${VPN} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
${IPTB} -t nat -A POSTROUTING -o ${VPN} -s ${LAN_NET} -j MASQUERADE #Для всей локальной сети
#----------------------------------------------------------------------------------------------------------#
# Разрешаем порты, по которым разрешено ходить в интернет машинам из локальной сети
TCP_ALLOW="-p tcp -m multiport --dport 20,21,22,23,25,110,443,143,80,8080,3389,993,995,465,587" #разрешонные порты для выхода в интернет [ssh,telnet,ftp,http,https,mail_google_yandex]
UDP_ALLOW="-p udp -m multiport --dport 53,123" #dns,ntp
#UDP_ALLOW="-p udp -m multiport --dport 53,123,1194" #dns,ntp, openvpn клиент на ПК пользователя
${IPTB} -A FORWARD -s ${LAN_NET} -o ${WAN} ${UDP_ALLOW} -j ACCEPT
#${IPTB} -A FORWARD -s ${LAN_NET} -o ${WAN} -p icmp --icmp-type echo-reply -j ACCEPT #если открыть то форвадятся пинги в локальную сеть
#${IPTB} -A FORWARD -s ${LAN_NET} -o ${WAN} -p icmp --icmp-type echo-request -j ACCEPT #если открыть то форвадятся пинги в локальную сеть
${IPTB} -A FORWARD -d ${LAN_NET} -i ${WAN} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#---------------------------------------------NAT для локальной сети---------------------------------------#
#${IPTB} -t nat -A POSTROUTING -o ${WAN} -s ${PC_1} -j MASQUERADE #Только для хоста
${IPTB} -t nat -A POSTROUTING -o ${WAN} -s ${LAN_NET} -j MASQUERADE #Для всей локальной сети
#---------------------------------------------PORT FORWARDING----------------------------------------------#
# RDP_TEST
${IPTB} -A FORWARD -s ${RDP_TEST} -o ${WAN} -j ACCEPT
${IPTB} -A FORWARD -i ${WAN} -p tcp --dport 3389 -d ${RDP_TEST} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
${IPTB} -t nat -A PREROUTING -i ${WAN} -p tcp --dport 3389 -j DNAT --to ${RDP_TEST}:3389
exit 0
Вывод шлюза ROUTER_A
root@r5-nix:/etc/network/nat-up# route
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.20.0.1 0.0.0.0 UG 0 0 0 eth0
10.8.8.0 * 255.255.255.0 U 0 0 0 tap0
172.20.0.0 * 255.255.255.0 U 0 0 0 eth0
192.168.70.0 10.8.8.2 255.255.255.0 UG 0 0 0 tap0
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
root@r5-nix:/etc/network/nat-up# ping 192.168.100.50
PING 192.168.100.50 (192.168.100.50) 56(84) bytes of data.
64 bytes from 192.168.100.50: icmp_seq=1 ttl=128 time=5.43 ms
64 bytes from 192.168.100.50: icmp_seq=2 ttl=128 time=0.900 ms
^C
--- 192.168.100.50 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.900/3.166/5.432/2.266 ms
root@r5-nix:/etc/network/nat-up# ping 192.168.100.50
PING 192.168.100.50 (192.168.100.50) 56(84) bytes of data.
64 bytes from 192.168.100.50: icmp_seq=1 ttl=128 time=1.30 ms
64 bytes from 192.168.100.50: icmp_seq=2 ttl=128 time=0.418 ms
64 bytes from 192.168.100.50: icmp_seq=3 ttl=128 time=1.10 ms
64 bytes from 192.168.100.50: icmp_seq=4 ttl=128 time=1.31 ms
64 bytes from 192.168.100.50: icmp_seq=5 ttl=128 time=0.32 ms
Вывод шлюза ROUTER_B
localadmin@r4-nix:~$ route
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
default r1.home.lan 0.0.0.0 UG 0 0 0 eth0
10.8.8.0 * 255.255.255.0 U 0 0 0 tap0
172.20.0.0 * 255.255.255.0 U 0 0 0 eth0
192.168.70.0 * 255.255.255.0 U 0 0 0 eth1
192.168.100.0 10.8.8.1 255.255.255.0 UG 0 0 0 tap0
localadmin@r4-nix:~$ ping 192.168.100.50
PING 192.168.100.50 (192.168.100.50) 56(84) bytes of data.
64 bytes from 192.168.100.50: icmp_seq=1 ttl=127 time=2.21 ms
64 bytes from 192.168.100.50: icmp_seq=2 ttl=127 time=2.50 ms
64 bytes from 192.168.100.50: icmp_seq=3 ttl=127 time=2.43 ms
64 bytes from 192.168.100.50: icmp_seq=4 ttl=127 time=1.87 ms
64 bytes from 192.168.100.50: icmp_seq=5 ttl=127 time=5.52 ms
Как видим на шлюзах маршруты есть, пинги из LAN_A в LAN_B проходят и наоборот.
Теперь клиенты которые невидять сеть за vpn.
LAN_A 192.168.100.50
===========================================================================
Активные маршруты:
Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
0.0.0.0 0.0.0.0 192.168.100.254 192.168.100.50 10
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.70.0 255.255.255.0 192.168.100.254 192.168.100.50 1
192.168.100.0 255.255.255.0 192.168.100.50 192.168.100.50 10
192.168.100.50 255.255.255.255 127.0.0.1 127.0.0.1 10
192.168.100.255 255.255.255.255 192.168.100.50 192.168.100.50 10
224.0.0.0 240.0.0.0 192.168.100.50 192.168.100.50 10
255.255.255.255 255.255.255.255 192.168.100.50 192.168.100.50 1
Основной шлюз: 192.168.100.254
===========================================================================
LAN_B 192.168.70.50
===========================================================================
Активные маршруты:
Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
0.0.0.0 0.0.0.0 192.168.70.254 192.168.70.50 10
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.70.0 255.255.255.0 192.168.70.50 192.168.70.50 10
192.168.70.50 255.255.255.255 127.0.0.1 127.0.0.1 10
192.168.70.255 255.255.255.255 192.168.70.50 192.168.70.50 10
192.168.100.0 255.255.255.0 192.168.70.254 192.168.70.50 1
224.0.0.0 240.0.0.0 192.168.70.50 192.168.70.50 10
255.255.255.255 255.255.255.255 192.168.70.50 192.168.70.50 1
Основной шлюз: 192.168.70.254
===========================================================================
Вариант который работает, прописать в правилах по умолчанию
iptables -P FORWARD -j ACCEPT
или
${IPTB} -A FORWARD -s ${LAN_NET} -j ACCEPT
${IPTB} -A FORWARD -d ${LAN_NET} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Что одно и второе нехорошо. Потому что, если кто нибудь на левом маршрутизаторе пропишет маршрут в нашу сеть,
route add -net 192.168.100.0 netmask 255.255.255.0 gw х.х.х.х "наш внешний IP".
То этот нехороший человек получает полный доступ в нашу сеть.
Пока не прочитал эту статью сам не знал
https://habrahabr.ru/post/134638/Проверил на практике, действительно вся сеть открыта.
P/S Google в помощь не помог, основная масса статей по iptables одинакова до примитива.