Перейти к содержимому
Калькуляторы

Помогите разобраться с NAT на iptables

Есть такой сервер под Debian:

root# ifconfig
...
eth0.20   Link encap:Ethernet  HWaddr 90:94:e4:81:b7:f7  
         inet addr:10.1.128.19  Bcast:10.1.128.255  Mask:255.255.255.0
         inet6 addr: fe80::9294:e4ff:fe81:b7f7/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2125572125 errors:0 dropped:0 overruns:0 frame:0
         TX packets:887700721 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:2918694683053 (2.6 TiB)  TX bytes:58906087628 (54.8 GiB)

eth0.100  Link encap:Ethernet  HWaddr 90:94:e4:81:b7:f7  
         inet addr:aaa.aaa.124.99  Bcast:aaa.aaa.124.127  Mask:255.255.255.128
         inet6 addr: fe80::9294:e4ff:fe81:b7f7/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:45926614 errors:0 dropped:0 overruns:0 frame:0
         TX packets:30404101 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:60958038726 (56.7 GiB)  TX bytes:3338999480 (3.1 GiB)

eth0.900  Link encap:Ethernet  HWaddr 90:94:e4:81:b7:f7  
         inet addr:10.10.0.250  Bcast:10.10.255.255  Mask:255.255.0.0
         inet6 addr: fe80::9294:e4ff:fe81:b7f7/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:58023788 errors:0 dropped:0 overruns:0 frame:0
         TX packets:52833097 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:7393610025 (6.8 GiB)  TX bytes:65076000992 (60.6 GiB)
...

Шлюз по умолчанию aaa.aaa.124.126.

.20 это внутренняя серверная подсеть, .100 это публичная подсеть (с выходом в интернет) и .900 это подсеть для пользователей хотспота.

Для хотспота используется следующие правила iptables:

#!/bin/sh

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

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

IP_EXT=`ip -o -4 addr show dev eth0.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
#$FW -A HOTSPOT -p udp --sport 67:68 --dport 67: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 NTP queries for clients
$FW -A HOTSPOT -p udp --dport 123  -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 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 -i $IF_EXT  -o $IF_WIFI ! -d $NET_INT -s $NET_WIFI                           -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 -j SNAT --to-source $IP_EXT

Собственно весь NAT там в последней строчке, остальное это ACL.

 

Проблема в том, что из хотспота (подсети 10.10.0.0/16) у меня нет доступа к хостам в подсети aaa.aaa.124.0/25 (публичной подсети).

Подозреваю, что это из-за того, что пакеты на (к примеру) aaa.aaa.124.40 не подвергаются трансляции.

Подскажите, как нужно поправить NAT, чтобы хосты в aaa.aaa.124.0/25 были доступными?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 124.0 на устройствах прописать маршрут на 10.10.0.0/16 через 124.99? (статиком или ospf/rip). Хотя с виду правильно , может для начала поставить на пинг чтото там и tcpdump'om глянуть на .100 что происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Разобрался, дело в другом было.

Самое главное забыл - aaa.aaa.124.40 это не настоящий IP-адрес, а SNAT-трансляция на бордере. Делал временно и забыл про это.

Сделал нормальный IP, без NAT - теперь работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.