Вопрос по IPTABLES, просьба проверить

Автор alibek, 31 мая 2014, 20:25:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

alibek

Есть сервер с тремя интерфейсами.
Первый интерфейс - интернет, второй интерфейс - локальная сеть, третий интерфейс - отдельная изолированная сеть (хотспот).
Нужно натить пользователей с третьего интерфейса.
Составил такой скрипт, но с iptables работал мало, просьба проверить.


#!/bin/sh

IPT=`which iptables`
IPS=`which ipset`
[ -z "$IPT" ] && exit

IF_LOOP=lo
IF_INT=eth1.20
IF_EXT=eth1.100
IF_WIFI=eth1.900

IP_EXT=`ip -o -4 addr show dev eth1.100 | sed -ne 's/.*inet \(.*\) brd.*/\1/p'`
IP_EXT=${IP_EXT%/*}

NET_INT="10.0.0.0/8"
NET_WIFI="10.10.0.0/16"
NET_UNIFI="10.10.10.0/24"

FW="$IPT -t filter"
NAT="$IPT -t nat"
MARK="$IPT -t mangle"

## Filter section
$FW -F
$FW -X
$FW -Z
$FW -P INPUT DROP
$FW -P OUTPUT ACCEPT
$FW -P FORWARD DROP


## Filter input invalid and bad packets
$FW -N INVALID
$FW -A INVALID -p tcp ! --syn -m state --state NEW -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL ALL -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL NONE -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL SYN -m state --state ESTABLISHED -j DROP
$FW -A INVALID -p icmp --fragment -j DROP
$FW -A INVALID -m state --state INVALID -j DROP
$FW -A INVALID -d 255.255.255.255 -j DROP
$FW -A INVALID -j RETURN


## Internet services
$FW -N INTERNET
# Allow ICMP
$FW -A INTERNET -p icmp --icmp-type 0 -j ACCEPT
$FW -A INTERNET -j RETURN


## Intranet services
$FW -N INTRANET
# Allow ICMP
$FW -A INTRANET -p icmp --icmp-type 0 -j ACCEPT
$FW -A INTRANET -p icmp               -j ACCEPT
# Allow HTTP
$FW -A INTRANET -p tcp --dport 80 -j ACCEPT
# Allow MySQL
$FW -A INTRANET -p tcp --dport 3306 -j ACCEPT
# Access to UniFi
$FW -A INTRANET -p tcp --dport 8443 -j ACCEPT
$FW -A INTRANET -j RETURN


## Hotspot services
$FW -N HOTSPOT
# Allow DHCP request and reply
$FW -A HOTSPOT -p udp --sport 67 --dport 68 -j ACCEPT
# Block foreign networks
$FW -A HOTSPOT ! -s $NET_WIFI -j DROP
# Allow ping reply
$FW -A HOTSPOT -p icmp --icmp-type 0  -j ACCEPT
$FW -A HOTSPOT -p icmp --icmp-type 3  -j ACCEPT
$FW -A HOTSPOT -p icmp --icmp-type 8  -j ACCEPT
$FW -A HOTSPOT -p icmp --icmp-type 11 -j ACCEPT
# Allow HTTP and HTTPS for clients
$FW -A HOTSPOT -p tcp --dport 80  -j ACCEPT
$FW -A HOTSPOT -p tcp --dport 443 -j ACCEPT
# Allow DNS queries for clients
$FW -A HOTSPOT -p tcp --dport 53  -j ACCEPT
$FW -A HOTSPOT -p udp --dport 53  -j ACCEPT
# Allow AP communications
$FW -A HOTSPOT -p tcp --dport 8080 -s $NET_UNIFI -j ACCEPT
$FW -A HOTSPOT -p tcp --dport 8443 -s $NET_UNIFI -j ACCEPT
$FW -A HOTSPOT -j RETURN


## Global rules
$FW -A INPUT -i $IF_LOOP -j ACCEPT
$FW -A INPUT -j INVALID
$FW -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Block bogons on external interface
$FW -A INPUT -i $IF_EXT    -s 10.0.0.0/8      -j DROP  # Private, class A
$FW -A INPUT -i $IF_EXT    -s 172.16.0.0/12   -j DROP  # Private, class B
$FW -A INPUT -i $IF_EXT    -s 192.168.0.0/16  -j DROP  # Private, class C
$FW -A INPUT -i $IF_EXT    -s 224.0.0.0/4     -j DROP  # Multicast, class D
$FW -A INPUT -i $IF_EXT    -s 240.0.0.0/5     -j DROP  # Reserved, class E
$FW -A INPUT -i $IF_EXT    -s 169.254.0.0/16  -j DROP  # Link-local
$FW -A INPUT -i $IF_EXT    -s 127.0.0.0/8     -j DROP  # Loopback
# Block foreign networks on internal interfaces
$FW -A INPUT -i $IF_INT  ! -s $NET_INT        -j DROP

# SSH access
$FW -A INPUT -i $IF_INT -p tcp --dport 22 -s 10.1.128.0/24 -j ACCEPT
$FW -A INPUT -i $IF_INT -p tcp --dport 22 -s 10.1.144.0/24 -j ACCEPT

# Main processing
$FW -A INPUT -i $IF_EXT -j INTERNET
$FW -A INPUT -i $IF_INT -j INTRANET
$FW -A INPUT -i $IF_WIFI -j HOTSPOT
$FW -A INPUT -j LOG --log-prefix "INPUT DROP: "

## NAT section
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p icmp                   -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p tcp --dport 80         -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p tcp --dport 443        -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p tcp --dport 1024:49151 -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p tcp --dport 92         -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p udp --dport 53         -j ACCEPT
$FW -A FORWARD -i $IF_WIFI -o $IF_EXT  -s $NET_WIFI ! -d $NET_INT -p udp --dport 1024:49151 -j ACCEPT
$FW -A FORWARD -i $IF_EXT  -o $IF_WIFI -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A FORWARD -j LOG --log-prefix "FORWARD DROP: "
$NAT -F
$NAT -X
$NAT -Z
$NAT -A POSTROUTING -o $IF_EXT -s $NET_WIFI -p icmp --icmp-type 0 -j SNAT --to-source $IP_EXT
$NAT -A POSTROUTING -o $IF_EXT -s $NET_WIFI -p icmp --icmp-type 8 -j SNAT --to-source $IP_EXT
$NAT -A POSTROUTING -o $IF_EXT -s $NET_WIFI -p tcp                -j SNAT --to-source $IP_EXT
$NAT -A POSTROUTING -o $IF_EXT -s $NET_WIFI -p udp                -j SNAT --to-source $IP_EXT


## Finish
$IPT -L -vnx


Есть чуть подробнее, то:

1. Интерфейс eth1.100 это интернет-подключение, с публичным (белым) IP. Никаких сервисов на этом интерфейсе пока не требуется, в будущем там будет максимум ssh и http.

2. Интерфейс eth1.20 это основное подключение, с приватным IP 10.1.128.19/24. С помощью этого подключения осуществляется работа с сетью (сеть в общем случае 10.0.0.0/8). На этом интерфейсе будет работать ssh, http, https.

3. Интерфейс eth1.900 используется для предоставления доступа в интернет для пользователей беспроводной сети (хотспота). На этом интерфейсе приватный IP 10.10.0.250/24, подсеть хотспота 10.10.0.0/16. Эта сеть должна быть изолирована от локальной сети, для пользователей хотспота на интерфейсе подняты автономные сервисы dhcp, dns, http. У пользователей должен быть доступ по HTTP к порталу авторизации (10.10.0.250), а также доступ в интернет (NAT через eth1.100), во внутреннюю подсеть доступа не должно быть.

Вроде бы ошибок не вижу, но почему-то с интерфейса 10.10.0.250 нет выхода в интернет.
Может что-то упустил?

Utility

Если терпит, вечером посмотрю, - сам хочу поразбираться.
ИМХО, в сети не рекомендуют такой метод (мне всё равно) и плюс не читабельно из-за обозначений.
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802

Utility

#2
Не знаю, использовали, но например:
iptables --table nat --list
ИМХО, попробуйте скармливать кусками и смотреть.

Цитировать
$FW -A FORWARD -j LOG --log-prefix "FORWARD DROP: "
$NAT -F
$NAT -X
$NAT -Z
Не оно?
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802

alibek

Я как-то не уловил смысла ответа.

И $FW, и $NAT — это все тот же iptables. Только в первом случае он применяется фильтру (цепочка filter), во втором случае применяется к NATу (цепочка nat).
$NAT -F удаляет все правила NAT, чтобы затем добавить их заново.

Причем сам NAT у меня работает, я из подсети 10.10.0.0/16 могу пинговать внешние узлы, как по IP-адресу, так и по имени (то есть правило $FW -A HOTSPOT -p udp --dport 53  -j ACCEPT работает).
Раз работает пинг, значит правило $NAT -A POSTROUTING -o $IF_EXT -s $NET_WIFI -p icmp -j SNAT --to-source $IP_EXT так же работает.
Но вот веб-сайты не открываются, хотя NAT для них настроен идентично (для протокола tcp).

Utility

Цитата: alibek от 04 июня 2014, 09:08:47Я как-то не уловил смысла ответа.
Я понял тебя, имхо не особо читабельно (не люблю оперировать блоками, - что ли сужает формат мышления. ХЗ но не привыкаю).
Цитировать$FW -P INPUT DROP
$FW -P OUTPUT ACCEPT
$FW -P FORWARD DROP
Понимаю, что глупо, но методики проверки не предлагали и по традиции "затык" наверняка правило-цепочка. Не силёе в iptables, но для себя хочу поразбираться.
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802