Для настройки iptables таким образом, чтобы порт был доступен только внутри Docker, на интерфейсе loopback и для одного внешнего IP, можно использовать следующие правила:
1. Разрешить трафик на интерфейсе loopback:
```
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
```
2. Разрешить доступ только с определенного внешнего IP:
```
iptables -A INPUT -p tcp -s <внешний_IP> --dport 1111 -j ACCEPT
```
3. Запретить доступ со всех остальных IP:
```
iptables -A INPUT -p tcp --dport 1111 -j DROP
```
4. Разрешить трафик внутри Docker:
```
iptables -A INPUT -p tcp -s <IP_диапазон_докер_сети> --dport 1111 -j ACCEPT
```
5. Запретить доступ из Docker в локальной сети:
```
iptables -A INPUT -i docker0 ! -s 127.0.0.1 -j DROP
```
6. Запретить доступ из Docker на loopback:
```
iptables -A INPUT -i docker0 -s 127.0.0.0/8 -j DROP
```
7. Запретить доступ из локальной сети в Docker:
```
iptables -A INPUT -i eth0 ! -d 127.0.0.1 -j DROP
```
8. Запретить доступ из локальной сети на loopback:
```
iptables -A INPUT -i eth0 -d 127.0.0.0/8 -j DROP
```
После применения этих правил, порт 1111 будет доступен только с указанного внешнего IP, на интерфейсе loopback и внутри Docker.
Почему порт 1111 недоступен с localhost и в сетях Docker, но доступен любому внешнему IP-адресу, после настройки правил iptables в Linux?
Причина, почему порт 1111 недоступен с localhost и в сетях Docker после настройки правил iptables, может быть связана с тем, что в правилах не прописано разрешение доступа с loopback-интерфейса (127.0.0.1).
Исправить это можно путем добавления следующих строк в правила iptables:
```
iptables -A INPUT -i lo -p tcp --dport 1111 -j ACCEPT
iptables -A OUTPUT -o lo -p tcp --dport 1111 -j ACCEPT
```
Эти правила разрешат трафик на порту 1111 внутри loopback-интерфейса, что позволит доступ к порту как с localhost, так и в сети Docker.