Всем добрый вечер. Возникла необходимость возвращать reset при попытке коннекта на хост:порт. Для ipv4 это делается очень просто: Сначала коннект есть:
root@srv:~# telnet -4 google.com 80
Trying 74.125.143.101...
Connected to la-in-f101.1e100.net.
Escape character is '^]'.
^]
telnet> Connection closed.
root@srv:~# iptables -t filter -A OUTPUT -d google.com -p tcp --dport 80 -j REJECT --reject-with tcp-reset
root@srv:~# time telnet -4 google.com 80
Trying 74.125.143.102...
Trying 74.125.143.113...
Trying 74.125.143.138...
Trying 74.125.143.139...
Trying 74.125.143.100...
Trying 74.125.143.101...
telnet: Unable to connect to remote host: Connection refused
real 0m0.064s
user 0m0.000s
sys 0m0.000s
При попытке проделать тоже самое с ipv6 получается следующее:
root@srv:~# telnet -6 google.com 80
Trying 2a00:1450:4010:c03::64...
Connected to google.com.
Escape character is '^]'.
^]
telnet> Connection closed.
root@srv:~# ip6tables -t filter -A OUTPUT -d google.com -p tcp --dport 80 -j REJECT --reject-with tcp-reset
root@srv:~# time telnet -6 google.com 80
Trying 2a00:1450:4010:c03::64...
telnet: Unable to connect to remote host: Connection timed out
real 1m3.137s
user 0m0.000s
sys 0m0.000s
При этом в tcpdump'е ничего не видно, и reset не возвращается.
Это баг. Он известен, и описан вот тут: https://bugs.launchpad.net/ubuntu/ source/linux/ bug/1234877 Баг в ядре, и он пофикшен 2 месяца назад. Но проблема в том, что, как известно, на серверы ставят LTS, а в убунте щас, например, ядро 3.2, и ждать туда ядра 2-месячной давности можно годами, а проблему решать нужно.
Внимание вопрос, уважаемые знатоки: как мне сделать то, что я хочу, в обход этого бага?
Пытался ещё сделать вот так:
ip6tables -t mangle -A OUTPUT -d google.com -p tcp --dport 80 -j MARK --set-mark 1
ip -6 rule add fwmark 1 unreachable