Переадресация портов iptables только для определенного диапазона IP

Я использую контейнеры LXC. Каждый из моих контейнеров имеет IP-адрес в 10.0.3.0/24. Я хочу, чтобы пакеты, поступающие на мой хост через определенный порт, были перенаправлены в контейнер, поэтому я использую это правило:

iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 10.0.3.4:3000

Это позволяет делать (вне пакета)# -> ВЕДУЩИЙ: 3000 -> КОНТЕЙНЕР: 3000

Работает отлично. Однако, когда я нахожусь в контейнере (не тот, который использовался в этом предыдущем правиле), и я хочу получить доступ к другому хосту (скажем, HOST2) на порту 3000, мой пакет перенаправляется в мой контейнер. Оно делает:

(внутри пакета контейнера)# -> HOST2:3000 -> HOST:3000 -> КОНТЕЙНЕР: 3000

вместо (внутри пакета контейнера)# -> HOST2:3000 -> HOST:3000 -> HOST2: 3000

Я пытался изменить свое правило выше, чтобы

iptables -t nat -A PREROUTING -s 10.0.3.0/24 -p tcp --dport 3000 -j DNAT --to-destination 10.0.3.4:3000

чтобы сказать: если пакет приходит из контейнера, не применяйте правило, однако это не работает. Любая помощь будет отличной, С уважением

Вот мои правила iptables:

Chain PREROUTING (policy ACCEPT 154 packets, 29925 bytes)
pkts bytes target     prot opt in     out     source               destination         
4   240 DNAT       tcp  --  *      *       10.0.3.0/24          0.0.0.0/0            tcp      dpt:3000 to:10.0.3.5:3000
3   180 DNAT       tcp  --  *      *       10.0.3.0/24          0.0.0.0/0            tcp   dpt:3001 to:10.0.3.6:3001

Chain INPUT (policy ACCEPT 126 packets, 28400 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 25 packets, 1900 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 29 packets, 2140 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   28  1525 MASQUERADE  all  --  *      *       10.0.3.0/24         !10.0.3.0/24

Под "не работает" я имею в виду, что когда я сверну 3000 любых хостов из контейнера, я перенаправлюсь в свой контейнер: 3000

1 ответ

Решение

-s flags выбирает только тот трафик, который соответствует указанному хосту или сети. Если вы хотите сопоставить весь трафик, кроме этого, используйте

! -s 10.0.3.0/24

и не забудьте избежать этого ! из оболочки с кавычками или обратной косой чертой.

Другие вопросы по тегам