Vou explicar meu cenário em que testei o que você deseja alcançar.
Eu lancei um contêiner docker onde a porta 9010 é encaminhada para a porta 8080:
docker run -p 9010:8080 swaggerapi/swagger-editor
O Docker cria uma regra DNAT para a cadeia PREROUTING que encaminha o tráfego da porta 9010 para a porta 8080:
DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9010 to:172.17.0.5:8080
O Docker também cria uma regra na cadeia DOCKER, permitindo todo o tráfego enviado para o endereço IP e porta 8080 do contêiner.
ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.5 tcp dpt:8080
A cadeia DOCKER é usada na cadeia FORWARD, onde todo o tráfego enviado para a ponte docker0 é processado por regras na cadeia DOCKER.
DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
Agora quero filtrar o tráfego enviado para a porta 8080 (o tráfego para a porta 9010 foi processado pelo PREROUTING e agora é o tráfego enviado para a porta 8080) bloqueando todos os endereços IP enquanto permite o tráfego do IP 192.168.1.142. O endereço IP do contêiner pode ser adicionado a essas regras para maior granularidade, é claro.
Eu adiciono as seguintes regras no início da cadeia FORWARD . Alternativamente, você pode substituir FORWARD por DOCKER.
iptables -I FORWARD -p tcp --dport 8080 -j DROP
iptables -I FORWARD -p tcp -s 192.168.1.142 --dport 8080 -j ACCEPT
Graças a essas regras, somente o IP 192.168.1.142 pode alcançar a porta 8080 usada pelo contêiner.
Para aqueles que visitarem essa resposta, se você quiser permitir apenas que um endereço IP específico acesse os contêineres, use o comando iptables sugerido no docentes do Docker .