LINUX.ORG.RU
ФорумAdmin

iptables

 


0

3

Здравствуйте!

Имеем eth0 = 192.168.1.1 смотрит внутрь

eth1 = 111.111.11.11 смотрит наружу

открыл 80 порт наружу - открывается страничка по ip eth1 с eth0.

Поднял на машинке 192.168.1.10 сайтик. Как его выпустить наружу, чтобы по ip eth1 открывалась страница c 192.168.1.10.

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 192.168.1.10:80

Чтоб это понял еще хоть кто-то, кроме вас, воспользуйтесь знаками препинания, знаками вопроса, разбейте текст на абзацы.

Igron ★★★★★ ()

Вообще вроде правильно, но нужно знать конфигурацию сети. Правильно ли я понимаю, что 192.168.1.1 является шлюзом по умолчанию для 192.168.1.10, и 192.168.1.10 преобразуется в 111.111.11.11?

te111011010 ()

С 192.168.1.10 хотя бы Яндекс пингуется?

sunny1983 ★★★★★ ()
Ответ на: комментарий от Dmit84

А все правила iptables на шлюзе можно посмотреть? Может ты своё правило не туда запихнул, и данный пакет обрабатывается одним из предыдущих правил в цепочке.

te111011010 ()
Ответ на: комментарий от te111011010

IPTABLES=/sbin/iptables
INT_IP=192.168.1.1
INT_IT=vmbr0

EXT_IP=111.111.11.11
EXT_IT=eth1

date
echo 0 > /proc/sys/net/ipv4/ip_forward

$IPTABLES -F
$IPTABLES -t filter -A FORWARD -s 192.168.1.0/24 -d 87.240.128.0/18 -p tcp --dport 443 -j REJECT
$IPTABLES -t filter -A FORWARD -s 192.168.1.0/24 -d 87.240.131.0/18 -p tcp --dport 443 -j REJECT
$IPTABLES -t filter -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu
$IPTABLES -t filter -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
$IPTABLES -t filter -A INPUT -j ACCEPT -s 127.0.0.1 -d 127.0.0.1
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p udp -m multiport --dport 53,67,68
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp -m multiport --dport 80,81,445,5038,5060,3306,3128
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp --dport 22
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp -m multiport --dport 8006
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p icmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p igmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p ospf
$IPTABLES -t filter -A INPUT -j REJECT -i $INT_IT

$IPTABLES -t filter -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu
$IPTABLES -t filter -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
$IPTABLES -t filter -A INPUT -j ACCEPT -s 127.0.0.1 -d 127.0.0.1

$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp --dport 22
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp -m multiport --dport 8006,10050
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp -m multiport --dport 80,81
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p icmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p igmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p ospf
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p gre
$IPTABLES -t filter -A INPUT -j DROP -i $EXT_IT

$IPTABLES -t mangle -F
$IPTABLES -t mangle -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu

$IPTABLES -t mangle -A OUTPUT -j TOS -o $INT_IT -p udp --set-tos 0x10
$IPTABLES -t mangle -A INPUT -j TOS -i $INT_IT -p udp --set-tos 0x10

$IPTABLES -t nat -F
##Windows2008R2 RDP
$IPTABLES -t nat -A PREROUTING -j DNAT -d $EXT_IP -p tcp --dport 3399 --to-destination 192.168.1.200:3389
$IPTABLES -t nat -A POSTROUTING -j SNAT -d 192.168.1.200 -p tcp --dport 3389 -s 192.168.0.0/16 --to-source 192.168.1.1

$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.10 --sport 80 -o eth1 -j SNAT --to-source 111.111.11.11:80

$IPTABLES -t nat -A PREROUTING -s 192.168.1.0/16 ! -d 192.168.1.0/16 -p tcp --dport 80 -j REDIRECT --to-ports 3128
#redirect HTTP to proxy
$IPTABLES -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT -o $EXT_INT --to-source $EXT_IP #internet access

echo 1 > /proc/sys/net/ipv4/ip_forward

Dmit84 ()
Ответ на: комментарий от Dmit84

А где твоё правило (iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 192.168.1.10:80)?

te111011010 ()
Ответ на: комментарий от Dmit84

IPTABLES=/sbin/iptables
INT_IP=192.168.1.1
INT_IT=vmbr0

EXT_IP=111.111.11.11
EXT_IT=eth1

date
echo 0 > /proc/sys/net/ipv4/ip_forward

$IPTABLES -F
$IPTABLES -t filter -A FORWARD -s 192.168.1.0/24 -d 87.240.128.0/18 -p tcp --dport 443 -j REJECT
$IPTABLES -t filter -A FORWARD -s 192.168.1.0/24 -d 87.240.131.0/18 -p tcp --dport 443 -j REJECT
$IPTABLES -t filter -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu
$IPTABLES -t filter -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
$IPTABLES -t filter -A INPUT -j ACCEPT -s 127.0.0.1 -d 127.0.0.1
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p udp -m multiport --dport 53,67,68
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp -m multiport --dport 80,81,445,5038,5060,3306,3128
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp --dport 22
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p tcp -m multiport --dport 8006
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p icmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p igmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $INT_IT -p ospf
$IPTABLES -t filter -A INPUT -j REJECT -i $INT_IT

$IPTABLES -t filter -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu
$IPTABLES -t filter -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
$IPTABLES -t filter -A INPUT -j ACCEPT -s 127.0.0.1 -d 127.0.0.1

$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp --dport 22
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp -m multiport --dport 8006,10050
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p tcp -m multiport --dport 80,81
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p icmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p igmp
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p ospf
$IPTABLES -t filter -A INPUT -j ACCEPT -i $EXT_IT -p gre
$IPTABLES -t filter -A INPUT -j DROP -i $EXT_IT

$IPTABLES -t mangle -F
$IPTABLES -t mangle -A FORWARD -j TCPMSS -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu

$IPTABLES -t mangle -A OUTPUT -j TOS -o $INT_IT -p udp --set-tos 0x10
$IPTABLES -t mangle -A INPUT -j TOS -i $INT_IT -p udp --set-tos 0x10

$IPTABLES -t nat -F
##Windows2008R2 RDP
$IPTABLES -t nat -A PREROUTING -j DNAT -d $EXT_IT -p tcp --dport 3399 --to-destination 192.168.1.200:3389
$IPTABLES -t nat -A POSTROUTING -j SNAT -d 192.168.1.200 -p tcp --dport 3389 -s 192.168.0.0/16 --to-source 192.168.1.1

$IPTABLES -t nat -A PREROUTING -j DNAT -i $EXT_IT -p tcp --dport 80 --to-destination 192.168.1.10:80
$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.10 --sport 80 -o $EXT_IT -j SNAT --to-source 111.111.11.11:80

$IPTABLES -t nat -A PREROUTING -s 192.168.1.0/16 ! -d 192.168.1.0/16 -p tcp --dport 80 -j REDIRECT --to-ports 3128 #redirect HTTP to proxy
$IPTABLES -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT -o $EXT_INT --to-source $EXT_IP #internet access

echo 1 > /proc/sys/net/ipv4/ip_forward

Dmit84 ()

А никого не смущает, что заходя на 111.111.11.11:80, вы ставите свой шлюз в неловкое положение, заставляя его делать неявный выбор:

1) натить в 192.168.1.1:80

2) натить в 192.168.1.10:80

И, мне кажется логичным, что выбирается connected-интерфейс.

irr123 ()
Ответ на: комментарий от anonymous

Это я просто некорректно выразился, никакого ната в 192.168.1.1:80 нет, просто демон http на шлюзе висит на 0.0.0.0:80, т.к.

не помогло. Открывается страница шлюза, а не 192.168.1.10

Суть в том, что нужно делать как-то так:

echo 0 > /proc/sys/net/ipv4/ip_forward
$IPTABLES -t nat -A PREROUTING -j DNAT -i $EXT_IT -p tcp --dport 2001 --to-destination 192.168.1.10:80
$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.10 --sport 80 -o $EXT_IT -j SNAT --to-source 111.111.11.11:2001

Соответственно и ходить на 111.111.11.11:2001 тобы попасть на сайт, расположенный на 192.168.1.10:80.

irr123 ()
Ответ на: комментарий от Dmit84

Откуда проверяешь, изнутри этой же локалки или извне? Если изнутри, то с твоими правилами работать не будет. Для проверки извне воспользуйся любым анонимайзером.

Запусти tcpdump на веб-сервере и смотри на приходящие пакеты - на 80 порт что-нибудь есть? Также запусти tcpdump на обоих интерфейсах твоего шлюза.

anonymous ()
Ответ на: комментарий от irr123

1. Если сделать

echo 0 > /proc/sys/net/ipv4/ip_forward

, то его шлюз прекратит быть шлюзом, т.к. перестанет маршрутизировать пакеты.

2. То, что веб-сервер шлюза слушает на 0.0.0.0:80, не помешает перенаправлять пакеты куда надо при правильной настройке фаерволла. Целесообразность оставлять веб-сервер на 80 порту - это другой вопрос, конечно.

3.

$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.10 --sport 80 -o $EXT_IT -j SNAT --to-source 111.111.11.11:2001

Данное правило не нужно, т.к. через таблицу nat проходят только пакеты с cstate NEW. Все ответные пакеты от веб-сервера на 192.168.1.10 будут с cstate ESTABLISHED.

anonymous ()

$IPT -t nat -A PREROUTING -d EXIP -p tcp -m multiport --dports 80 -j DNAT --to-destination INIP не?

julixs ★★ ()
Ответ на: комментарий от anonymous

Если ему нужен доступ из локалки, то следующие правила помогут:

iptables -t nat -A PREROUTING -d 111.111.11.11 -p tcp --dport 80 -j DNAT --to 192.168.1.10
iptables -t nat -a POSTROUTING -s 192.168.1.0/24 -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to 192.168.1.1

anonymous ()
Ответ на: комментарий от anonymous

echo 0 > /proc/sys/net/ipv4/ip_forward

Да, действительно, так не надо делать; только сейчас обратил внимание, что здесь bridge-интерфейс, просто до конца был уверен, что это sub-интерфейс.

что веб-сервер шлюза слушает на 0.0.0.0:80, не помешает перенаправлять пакеты куда надо при правильной настройке фаерволла

Никак не могу представить себе логику, на основании которой при обращении к 111.111.11.11:80 фаерволл сможет определить по какому из двух 80х портов нужно инициировать соединение.

Все ответные пакеты от веб-сервера на 192.168.1.10 будут с cstate ESTABLISHED.

А вот этого не знал, спасибо.

irr123 ()
Ответ на: комментарий от irr123

Да, действительно, так не надо делать; только сейчас обратил внимание, что здесь bridge-интерфейс, просто до конца был уверен, что это sub-интерфейс.

Bridge или нет - здесь ни при чем. Если ты туда напишешь 0, то машина перестанет форвардить пакеты, перестанет быть маршрутизатором, и через нее уже никто в интернет не попадет.

Никак не могу представить себе логику, на основании которой при обращении к 111.111.11.11:80 фаерволл сможет определить по какому из двух 80х портов нужно инициировать соединение.

Сначала пакет попадает в PREROUTING, где ему изменяют адрес назначения с 111.111.11.11 на 192.168.1.10. Потом его маршрутизируют, определяя, должен он уйти на маршрутизатор или куда-то еще. Т.к. адрес назначения не соответствует ни одному из адресов маршрутизатора, то определяется интерфейс, через который его надо отправить, и он идет дальше.

anonymous ()
Ответ на: комментарий от anonymous

Проверяю извне. Возможно вообще реализовать такую схему или нет? Другой порт (не 80) указывать на 111.111.11.11 как то не айс

Dmit84 ()
Ответ на: комментарий от anonymous

~#iptables-save
# Generated by iptables-save v1.4.14 on Sat Mar 14 00:56:31 2015
*nat
:PREROUTING ACCEPT [4364953:292880449]
:POSTROUTING ACCEPT [80888:5193572]
:OUTPUT ACCEPT [70190:4506507]
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 3399 -j DNAT --to-destination 192.168.1.200:3389
-A PREROUTING -i 111.111.11.11 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 6600 -j DNAT --to-destination 192.168.1.9
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 7600 -j DNAT --to-destination 192.168.1.8
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 192.168.1.9
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 192.168.1.8
-A PREROUTING -d 111.111.11.11/32 -p tcp -m tcp --dport 40001 -j DNAT --to-destination 192.168.1.9
-A PREROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -s 192.168.0.0/16 -d 192.168.1.200/32 -p tcp -m tcp --dport 3389 -j SNAT --to-source 192.168.1.1
-A POSTROUTING -s 192.168.1.10/32 -o 111.111.11.11 -p tcp -m tcp --sport 80 -j SNAT --to-source 111.111.11.11:80
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 111.111.11.11
COMMIT
# Completed on Sat Mar 14 00:56:31 2015
# Generated by iptables-save v1.4.14 on Sat Mar 14 00:56:31 2015
*filter
:INPUT ACCEPT [30:2130]
:FORWARD ACCEPT [22221836:6981974662]
:OUTPUT ACCEPT [3562814:1919415045]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A INPUT -i vmbr0 -p udp -m multiport --dports 53,67,68 -j ACCEPT
-A INPUT -i vmbr0 -p tcp -m multiport --dports 80,81,445,5038,5060,3306,3128 -j ACCEPT
-A INPUT -i vmbr0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i vmbr0 -p tcp -m multiport --dports 8006 -j ACCEPT
-A INPUT -i vmbr0 -p icmp -j ACCEPT
-A INPUT -i vmbr0 -p igmp -j ACCEPT
-A INPUT -i vmbr0 -p ospf -j ACCEPT
-A INPUT -i vmbr0 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -p tcp -m multiport --dports 8006,10050 -j ACCEPT
-A INPUT -i eth1 -p tcp -m multiport --dports 80,81 -j ACCEPT
-A INPUT -i eth1 -p icmp -j ACCEPT
-A INPUT -i eth1 -p igmp -j ACCEPT
-A INPUT -i eth1 -p ospf -j ACCEPT
-A INPUT -i eth1 -p gre -j ACCEPT
-A INPUT -i eth1 -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

Dmit84 ()
Ответ на: комментарий от Dmit84

-A PREROUTING -i 111.111.11.11 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

Вот и ответ. Поменяй в правиле -i на -d.

-A POSTROUTING -s 192.168.1.10/32 -o 111.111.11.11 -p tcp -m tcp --sport 80 -j SNAT --to-source 111.111.11.11:80

А это правило можно вообще убрать, т.к.

через таблицу nat проходят только пакеты с cstate NEW. Все ответные пакеты от веб-сервера на 192.168.1.10 будут с cstate ESTABLISHED.

anonymous ()
Ответ на: комментарий от Dmit84

Как именно? Открываешь браузером, telnet, netcat? Если браузер, то помогает ли его перезапуск или перезагрузка компа?

anonymous ()
Ответ на: комментарий от Dmit84

Запусти tcpdump на веб-сервере и смотри на приходящие пакеты - на 80 порт что-нибудь есть? Также запусти tcpdump на обоих интерфейсах твоего шлюза.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.