Jump to content
Калькуляторы

Не работает ipset hash:ip,port

Есть такая строчка правил:

iptables -t NAT -A PREROUTING -i eth1 -s 1.2.3.4 -p udp -d 1.2.3.5 --dport 53 -j DNAT --to-destination 127.0.0.53:53

Выполняется нормально, DNS-запросы с 1.2.3.4 (тестовая машина) на 1.2.3.5 (публичный DNS) перенаправляет на внутренний интерфейс.

Заменяю правило на такое:

ipset create SVC-DNS hash:ip,port
ipset add    SVC-DNS 1.2.3.5,udp:53
iptables -t NAT -A PREROUTING -i eth1 -s 1.2.3.4 -p udp -m set --match-set SVC-DNS dst -j DNAT --to-destination 127.0.0.53:53

и перестает работать, счетчик правил на нуле.

Что неправильно?

Share this post


Link to post
Share on other sites

---iptables -t NAT -A PREROUTING -i eth1 -s 1.2.3.4 -p udp -m set --match-set SVC-DNS dst -j DNAT --to-destination 127.0.0.53:53
+++iptables -t NAT -A PREROUTING -i eth1 -s 1.2.3.4 -p udp -m set --match-set SVC-DNS dst,dst -j DNAT --to-destination 127.0.0.53:53

 

не?

Share this post


Link to post
Share on other sites

Хотя нет, все работает.

 

Сейчас правила такие:

ipset create FWD-DNS hash:ip,port
ipset add    FWD-DNS aa.aa.124.1,udp:53
ipset add    FWD-DNS aa.aa.124.1,tcp:53
ipset add    FWD-DNS aa.aa.124.124,udp:53
ipset add    FWD-DNS aa.aa.124.124,tcp:53

iptables -t nat -A PREROUTING -i eth1 -p udp -m set ! --match-set EXT src -m set --match-set FWD-DNS dst,dst -j DNAT --to-destination 127.0.0.53:53
iptables -t nat -A PREROUTING -i eth1 -p tcp -m set ! --match-set EXT src -m set --match-set FWD-DNS dst,dst -j DNAT --to-destination 127.0.0.53:53

Можно ли это как-то сократить?

Я протокол указываю и в ipset, и в правилах, что мне кажется избыточным.

Но если правило заменить на одно без указания протокола (-p), то оно не применяется, требует указания протокола.

А если я указываю протокол, то записи ipset с другим протоколом игнорируются.

Share this post


Link to post
Share on other sites

Хм... А если не указывать -p и так же не указывать udp/tcp в ipset?

Share this post


Link to post
Share on other sites

Если для ipset не указывать протокол, то используется tcp.

Все равно выдает сообщение, что нужен протокол.

Share this post


Link to post
Share on other sites

Если номер порта надо проверять, то и протокол надо указывать. И там и там. За исключением протокола "по умолчанию".

Share this post


Link to post
Share on other sites

Как я понял, протокола по умолчанию нет, протокол всегда или udp, или tcp (если не указан).

В ipset это меня вполне устраивает.

Но в iptables из-за этого приходится два правила добавлять, потому что без ключа -p правило не загружается.

Share this post


Link to post
Share on other sites

Как я понял, протокола по умолчанию нет, протокол всегда или udp, или tcp (если не указан).

В ipset это меня вполне устраивает.

Но в iptables из-за этого приходится два правила добавлять, потому что без ключа -p правило не загружается.

 

Ну в ipset есть протокол по умолчанию (tcp), а в iptables надо обязательно протокол указывать, если если писать селектор match-set по порту.

Share this post


Link to post
Share on other sites

Парочка вопросов есть по iptables.

 

1. -m set нужно указывать один раз или для каждого match-set?

То есть "-m set --match-set S1 src -m set --match-set D1 dst" или "-m set --match-set S1 src --match-set D1 dst"?

 

2. Если я указываю "--match-set S1 src,dst", то используется логика OR или AND?

То есть сету S1 должен соответствовать источник и приемник или любой из них?

Share this post


Link to post
Share on other sites

И еще вопрос.

Допустим мне нужно задать правило для подсети, например 192.168.1.0/24.

Как лучше это правило задавать, с помощью модуля set (-m set --match-set NET src) или непосредственно (-s 192.168.1.0/24)?

Мне для единообразия в эстетическом смысле удобнее всю адресацию задавать через ipset. Но если первый вариант заметно медленнее второго, я лучше буду использовать второй вариант.

Share this post


Link to post
Share on other sites

Заметно, вряд ли. Тут скорее всего будет правильнее использовать ipset, в случае набора подсетей для правила/действия. А при единственном случае, то смысла нет.

Share this post


Link to post
Share on other sites

Парочка вопросов есть по iptables.

 

1. -m set нужно указывать один раз или для каждого match-set?

То есть "-m set --match-set S1 src -m set --match-set D1 dst" или "-m set --match-set S1 src --match-set D1 dst"?

 

Я подозреваю, что одного раза хватит, хотя, надо просто проверить. Если одного не хватит - оно должно поругаться.

 

2. Если я указываю "--match-set S1 src,dst", то используется логика OR или AND?

То есть сету S1 должен соответствовать источник и приемник или любой из них?

 

Это описание сета с двумя параметрами. Т.е. в сете S1 долнжа быть строка, в которой оба параметра совпадают с инфой из пакета.

 

И еще вопрос.

Допустим мне нужно задать правило для подсети, например 192.168.1.0/24.

Как лучше это правило задавать, с помощью модуля set (-m set --match-set NET src) или непосредственно (-s 192.168.1.0/24)?

Мне для единообразия в эстетическом смысле удобнее всю адресацию задавать через ipset. Но если первый вариант заметно медленнее второго, я лучше буду использовать второй вариант.

 

Если сеть будет всегда одна - то проще прямо в iptables прописать. Если сетей может быть в будущем несколько, или задействован какой-нибудь механизм автоматизации создания правил, то лучше через ipstt.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this