Jump to content
Калькуляторы

Помогите разобраться с 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 были доступными?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this