У меня есть определенный пакет, который я хочу постоянно перенаправлять на определенный IP-адрес в моем виртуальном сетевом интерфейсе. На данный момент мои iptables настроены следующим образом:
(команды, я использую \ as сейчас, чтобы сделать его более читаемым, читается как «объединить следующую строку с этой строкой» :)) Для разрешенных IP:
iptables \
-t nat -A PREROUTING \
-i vmbr0 -p udp --dport 7777 \
-m set --match-set whitelist \
-j DNAT --to 192.168.0.1:7777
Для запрещенных IP:
iptables \
-t nat -A PREROUTING \
-i vmbr0 -p udp --dport 7777 \
-m set ! --match-set whitelist \
-j DNAT --to 192.168.0.1:7778
Но есть определенный пакет udp (который соответствует некоторому шестнадцатеричному числу, желательно с подстановочными знаками, если возможно), который я хочу передать 192.168.0.1:7777
независимо от записи в белом списке, как мне это сделать?
Итак, в конечном итоге это будет результат:
Подловил! :-) Я ошибался. О чем я думал ( -m string
match extension) невозможно, мы находимся в таблице nat и только первый пакет "соединения" (даже если udp) пройдет через эту таблицу. Таким образом, мы не можем проверить все пакеты одного и того же соединения и отклонить только один.
Вы можете проверить расширение соответствия string
(-m string
).
Также обратите внимание, что цель DNAT завершается, что означает, что если пакет соответствует правилу с целью DNAT, пакет не будет проходить через следующие правила.
Итак, вы можете пойти на такое решение:
В вашей таблице нат:
Первое правило: первое упомянутое вами правило, которое соответствует белому списку.
Пакеты, все еще проходящие после этого правила, - это пакеты, которые не соответствуют белому списку (точнее, пакеты UDP для порта 7777, которые не соответствуют белому списку).
Второе правило: здесь вы можете использовать -m строку. Помните, что проверка строк в пакетах может быть ресурсоемкой. Вы можете сопоставить шестнадцатеричные строки (--hex-string
option), но я не знаю подстановочных знаков в этом расширении соответствия.
Третье правило: можно упростить из-за завершения целевого DNAT
Надеюсь это поможет.
Чтобы соответствовать строке в [содержимое контейнера, вы можете использовать
"--string [!] string"
если он скомпилирован в Вашем ядре.
Но нет wildchar, и я не нашел способа использовать hex.