Есть внутри локальной сети некий сервер на адресе $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 умеет как-то «красиво» обрабатывать эту ситуацию??