Какого-либо простого способа не видится. Демон работает в пространстве пользователя и вообще ничего не знает об отдельных пакетах, а читает уже декапсулированные данные из сокетного буфера. Более того, уже на программном уровне модуль HTTP оперирует L7-концепциями, отдельными HTTP запросами.
В man 7 socket упоминается опция SO_MARK, но я подозреваю, что getsockopt(SO_MARK) на соединении просто вернет ранее установленное через setsockopt(SO_MARK) значение. Возможно, что я ошибаюсь.
Что-то типа getsockopt(fd, SOL_SOCKET, SO_MARK, &mark, &len);
По примерам это похоже на точто нужно
Получается нужно “поднять” эту маркировку до контекст соединения angie по аналогии с remote_addr/remote_port/server_port
Я полагаю, что все же getsockopt(fd, SOL_SOCKET, SO_MARK, &mark, &len); не вернет то, что было прислано. Оно лишь вернет то значение, что могло быть ранее установлено через setsockopt() для этого дескриптора (т.е. никакого) и потому смысла не имеет.
Я рекомендую всё же проверить на простом тестовом примере, прежде чем пытаться что-то делать дальше.
Короче, парни, был не прав, вот рабочий вариант
в системе от root делаем
sysctl -w net.ipv4.tcp_fwmark_accept=1
iptables -t mangle -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j MARK --set-mark 100
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j MARK --set-mark 101
лучше для списков потом использовать ipset
В angie.service , обычно тут лежит /etc/systemd/system/multi-user.target.wants/angie.service
[Service]
AmbientCapabilities=CAP_NET_ADMIN