Это можно сделать с помощью `iproute2
framework.
Создайте таблицу правил для блочной / недоступной корзины (в моем примере id 33 таблицы) и задайте для нее высокий приоритет:
# ip rule add from all lookup 33 prio 1
Теперь найдите соединения, которые вы пытаетесь заблокировать. В моем случае я использовал Chromium для подключения к google.com:
# ss -n -e -p | grep "chrom" | grep "173.194.*:443"
ESTAB 0 0 10.211.55.4:46710 173.194.35.2:443 timer: (keepalive,38sec,0) users:(("chromium-browse",8488,106)) uid:1000 ino:38318 sk:f6a4f800
ESTAB 0 0 10.211.55.4:49288 173.194.35.18:443 timer:(keepalive,34sec,0) users:(("chromium-browse",8488,109)) uid:1000 ino:38047 sk:f6a4cb00
Итак, давайте добавим 173.194.0.0/16 в таблицу 33 и очистим кеш:
# ip route add unreachable 173.194.0.0/16 table 33
# ip route flush cache
Попробуйте подключиться к google.com прямо сейчас в своем браузере, и вы получите ERR_CONNECTION_REFUSED
в своем браузере.
Чтобы поднять завесу вашей добровольной блокировки, вы просто промойте ведро:
# ip route flush table 33
Конечно, если вам нужно более детальное различие, вы можете использовать tc
и классификатор u32, чтобы пометить точную комбинацию IP:PORT
(и другие аспекты пакета) и добавить правило fw в корзину (не проверено):
# tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \
match ip src 173.194.0.0/16 match ip dport 443 classid :1
# ip rule add fwmark 1 table 33 prio 1 realms 3/4