70 lines
2.4 KiB
Bash
70 lines
2.4 KiB
Bash
#!/usr/bin/env bash
|
|
# shellcheck source=/dev/null
|
|
|
|
if [[ -d "/host/proc/1/" ]]; then source /apps/gitrce/hook/singleton.sh "$0"; fi
|
|
|
|
# find /sys/fs/cgroup/ -name net_cls.classid -exec sh -c 'echo -n "{} -> "; cat {}' \;
|
|
# cat /sys/fs/cgroup/net_cls,net_prio/docker/b45932ef28ad33bf2315e7e47a7b44fc0f3f2db2cbcd8c0ac4f4f4c40ab71d9a/net_cls.classid
|
|
__get_mount_paths_cgroup_id() {
|
|
docker ps -q --no-trunc | while read -r cid; do
|
|
_path=$(docker inspect "$cid" --format '{{range .Mounts}}{{.Source}}{{"\n"}}{{end}}' 2>/dev/null)
|
|
if grep -q "$CACHE/$FILE_PATH_START" <<<"$_path"; then
|
|
_cmd="find /sys/fs/cgroup/ -type d -name $cid | grep net_cls 2>/dev/null"
|
|
_cgroup_path=$(nsenter --mount=/host/proc/1/ns/mnt --net=/host/proc/1/ns/net sh -c "$_cmd")
|
|
_cmd_classid="cat $_cgroup_path/net_cls.classid 2>/dev/null"
|
|
_cgroup_id=$(nsenter --mount=/host/proc/1/ns/mnt --net=/host/proc/1/ns/net sh -c "$_cmd_classid")
|
|
echo "$_cgroup_id"
|
|
fi
|
|
done
|
|
}
|
|
# __get_mount_paths_cgroup_id
|
|
|
|
__get_in_cgroup_ids() {
|
|
awk '$0 != 1' /sys/fs/cgroup/net_cls,net_prio/*/net_cls.classid
|
|
}
|
|
|
|
__main() {
|
|
update-alternatives --set iptables /usr/sbin/iptables-legacy 2>/dev/null
|
|
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy 2>/dev/null
|
|
|
|
readarray -t _cgroup_ids < <(__get_mount_paths_cgroup_id)
|
|
|
|
if [[ ${#_cgroup_ids[@]} -eq 0 ]]; then
|
|
readarray -t _cgroup_ids < <(__get_in_cgroup_ids)
|
|
fi
|
|
|
|
_owner_id=52000
|
|
_chain="output_netflow_owner_${_owner_id}"
|
|
|
|
for cmd in iptables ip6tables; do
|
|
$cmd -t mangle -N "$_chain" 2>/dev/null || true
|
|
if ! $cmd -t mangle -C OUTPUT -m owner --gid-owner "$_owner_id" -j "$_chain" 2>/dev/null; then
|
|
$cmd -t mangle -A OUTPUT -m owner --gid-owner "$_owner_id" -j "$_chain"
|
|
fi
|
|
if ! $cmd -t mangle -C "$_chain" -j RETURN 2>/dev/null; then
|
|
$cmd -t mangle -A "$_chain" -j RETURN
|
|
fi
|
|
$cmd -t mangle -L OUTPUT -v -n -x
|
|
done
|
|
|
|
for cgid in "${_cgroup_ids[@]}"; do
|
|
for cmd in iptables ip6tables; do
|
|
$cmd -t mangle -N "$_chain" 2>/dev/null || true
|
|
if ! $cmd -t mangle -C OUTPUT -m cgroup --cgroup "$cgid" -m addrtype ! --dst-type LOCAL -j "$_chain" 2>/dev/null; then
|
|
$cmd -t mangle -A OUTPUT -m cgroup --cgroup "$cgid" -m addrtype ! --dst-type LOCAL -j "$_chain"
|
|
fi
|
|
if ! $cmd -t mangle -C "$_chain" -j RETURN 2>/dev/null; then
|
|
$cmd -t mangle -A "$_chain" -j RETURN
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
__main
|
|
|
|
__help() {
|
|
cat >/dev/null <<-'EOF'
|
|
|
|
EOF
|
|
}
|