LINUX.ORG.RU
ФорумAdmin

Iptables - настройка nat

 ,


0

1

Есть внутри локальной сети некий сервер на адресе $SOME_SERVER_LOC_IP и на порту $SOME_SERVER_LOC_PORT

Делаю проброс портов, чтобы выставить его в инет:

/sbin/iptables -t nat -A PREROUTING -i $INET_IFACE --dst $INET_IFACE_IP -p tcp --dport $SOME_SERVER_EXT_PORT
    -j DNAT --to-destination $SOME_SERVER_LOC_IP:$SOME_SERVER_LOC_PORT

До кучи делаю еще один nat-инг, чтобы сервер получал запросы с локальных адресов, а не с инетных (чтобы все внутри локалки ходило с локальными адресами):

/sbin/iptables -t nat -A POSTROUTING -o $LOCAL_IFACE --dst $SOME_SERVER_LOC_IP -p tcp --dport $SOME_SERVER_LOC_PORT
    -j SNAT --to-source $LOCAL_IFACE_IP

Но тут берут сомнения.. Допустим, к серверу обращаются два клиента. Они у себя открывают сокеты для обращения к серверу:

<ip-клиента1>:<порт-на-клиенте1> <-> <ip-сервера>:<порт-сервера>
<ip-клиента2>:<порт-на-клиенте2> <-> <ip-сервера>:<порт-сервера>

а что будет, если вдруг <порт-на-клиенте1> и <порт-на-клиенте2> будут одинаковыми???

например:

клиент1: 1.1.1.1:38454
клиент2: 2.2.2.2:38454
роутер: снаружи: 7.7.7.7, изнутри: 192.168.10.254, порт сервера снаружи: 80
сервер: 192.168.10.10, порт сервера внутри локалки: 8080

на роутер приходят пакеты:

1.1.1.1:38454 -> 7.7.7.7:80
2.2.2.2:38454 -> 7.7.7.7:80

после nat-a в prerouting будут такие пакеты:

1.1.1.1:38454 -> 192.168.10.10:8080
2.2.2.2:38454 -> 192.168.10.10:8080

после nat-a в postrouting будут такие пакеты:

192.168.10.254:38454 -> 192.168.10.10:8080
192.168.10.254:38454 -> 192.168.10.10:8080

т.е. на сервер придут два разных пакета, у которых адрес и порт отправителя одинаковые.

Iptables умеет как-то «красиво» обрабатывать эту ситуацию??


Умеет, просто будет подставлен первый свободный порт. «Красиво» это или нет, решайте сами, лично мне мотив «чтобы все внутри локалки ходило с локальными адресами» совершенно не понятен, мне всегда было важнее иметь логи сервера, чтобы было видно с каких адресов на него заходили.

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

Умеет, просто будет подставлен первый свободный порт.

т.е. будет что-то типа этого?

192.168.10.254:38454 -> 192.168.10.10:8080
192.168.10.254:38455 -> 192.168.10.10:8080

лично мне мотив «чтобы все внутри локалки ходило с локальными адресами» совершенно не понятен

Сервер может находиться в другом сегменте локалки, для чего придется маршуртизировать инетный трафик на внутренних роутерах. Или у сервера может быть свой шлюз по умолчанию (на другой роутер). Поэтому изменяем source ip, чтобы он был из сегмента локалки.

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

ИМХО, вместо SNAT'а лучше поставить какой-нибудь nginx, это позволит отслеживать реальные адреса клиентов через X-Forwarded-For

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

Да, но, вроде как первый свободный ищется с начала диапазона (1-512, 600-1023, 1024-65535), то есть маловероятно, что будет 38455. И это при условии, что у SNAT-правила нет опции random, если эта опция указана, то там порт заменяется на случайный.

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

вместо SNAT'а лучше поставить какой-нибудь nginx, это позволит отслеживать реальные адреса клиентов через X-Forwarded-For

там реально не веб-сервер. 80-й порт я привел для примера.

KLfer
() автор топика
Ответ на: комментарий от mky

вроде как первый свободный ищется с начала диапазона (1-512, 600-1023, 1024-65535), то есть маловероятно, что будет 38455

тут всмысле не конкретная цифра, а факт того, что она будет отличной от номера порта в другом соединении.

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