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

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.