# nsjail - Makefile # ----------------------------------------- PKG_CONFIG := $(shell command -v pkg-config 2> /dev/null) ifeq ($(PKG_CONFIG),) $(error "Install pkg-config to make it work") endif CC ?= gcc CXX ?= g++ # pkg-config for protobuf can be expensive/slow # Skip pkg-config for: clean, indent, kafel_init, and kafel-only builds ifneq ($(filter-out clean indent kafel_init kafel/libkafel.a,$(MAKECMDGOALS)),) PROTOBUF_CFLAGS := $(shell pkg-config --cflags protobuf) PROTOBUF_LIBS := $(shell pkg-config --libs protobuf) else ifeq ($(MAKECMDGOALS),) # Default target (all) requires protobuf PROTOBUF_CFLAGS := $(shell pkg-config --cflags protobuf) PROTOBUF_LIBS := $(shell pkg-config --libs protobuf) endif NL3_EXISTS := $(shell pkg-config --exists libnl-route-3.0 && echo yes) COMMON_FLAGS += -O2 -c \ -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 \ -fPIE \ -Wformat -Wformat-security -Wno-format-nonliteral \ -Wall -Wextra -Werror \ -Ikafel/include CXXFLAGS += $(USER_DEFINES) $(COMMON_FLAGS) $(PROTOBUF_CFLAGS) -I. \ -std=c++20 -fno-exceptions -Wno-unused -Wno-unused-parameter -Wno-c99-designator LDFLAGS += -pie -Wl,-z,noexecstack -lpthread $(PROTOBUF_LIBS) ifeq ($(NL3_EXISTS), yes) CXXFLAGS += $(shell pkg-config --cflags libnl-route-3.0) -DHAVE_LIBNL3 LDFLAGS += $(shell pkg-config --libs libnl-route-3.0) endif ifdef DEBUG CXXFLAGS += -g -ggdb -gdwarf-4 endif BIN = nsjail LIBS = kafel/libkafel.a TEST_BINS = tests/nstun_buffer_budget_test tests/nstun_policy_test tests/nstun_ip_test # If PASTA_BIN_PATH is not provided in env, dynamically search for it if EMBED_PASTA is requested # or fallback to it naturally. ifdef EMBED_PASTA ifeq ($(PASTA_BIN_PATH),) PASTA_BIN_PATH := $(shell which pasta) endif ifeq ($(PASTA_BIN_PATH),) $(error "'pasta' binary not found. Provide location with PASTA_BIN_PATH") endif endif ifneq ($(PASTA_BIN_PATH),) CXXFLAGS += -DPASTA_BIN_PATH='"$(PASTA_BIN_PATH)"' endif SRCS_CXX = caps.cc cgroup.cc cgroup2.cc cmdline.cc config.cc contain.cc cpu.cc logs.cc mnt.cc mnt_legacy.cc mnt_newapi.cc net.cc nsjail.cc pid.cc sandbox.cc subproc.cc uts.cc user.cc unotify/unotify.cc unotify/stats.cc unotify/syscall.cc util.cc nstun/nstun.cc nstun/policy.cc nstun/encap.cc nstun/iface.cc nstun/tun.cc nstun/ip.cc nstun/icmp.cc nstun/udp.cc nstun/tcp.cc SRCS_PROTO = config.proto unotify/unotify.proto SRCS_PB_CXX = $(SRCS_PROTO:.proto=.pb.cc) SRCS_PB_H = $(SRCS_PROTO:.proto=.pb.h) SRCS_PB_O = $(SRCS_PROTO:.proto=.pb.o) OBJS = $(SRCS_CXX:.cc=.o) $(SRCS_PB_CXX:.cc=.o) # 4. TARGETS .PHONY: all clean depend indent kafel_init all: $(BIN) # Main Binary Linkage $(BIN): $(LIBS) $(OBJS) ifneq ($(NL3_EXISTS), yes) $(warning "You probably miss libnl3(-dev)/libnl-route-3(-dev) libraries") endif $(CXX) -o $(BIN) $(OBJS) $(LIBS) $(LDFLAGS) # Standard Object Compilation # The | $(SRCS_PB_H) ensures headers exist before we try to compile .cc files %.o: %.cc | $(SRCS_PB_H) $(CXX) $(CXXFLAGS) $< -o $@ # Protobuf Generation # We only define the recipe for the .cc file to prevent race conditions. $(SRCS_PB_CXX): $(SRCS_PROTO) protoc --cpp_out=. $(SRCS_PROTO) # The .h file is a side-effect of the .cc rule $(SRCS_PB_H): $(SRCS_PB_CXX) # Kafel Submodule Handling kafel_init: ifeq ("$(wildcard kafel/Makefile)","") git submodule update --init endif kafel/include/kafel.h: kafel_init kafel/libkafel.a: kafel_init +LDFLAGS="" CFLAGS=-fPIE $(MAKE) -C kafel # Utilities clean: $(RM) core Makefile.bak $(OBJS) $(SRCS_PB_CXX) $(SRCS_PB_H) $(SRCS_PB_O) $(BIN) $(TEST_BINS) ifneq ("$(wildcard kafel/Makefile)","") +$(MAKE) -C kafel clean endif depend: all makedepend -Y -Ykafel/include -- -- $(SRCS_CXX) $(SRCS_PB_CXX) indent: clang-format -i -sort-includes $(SRCS_CXX:.cc=.h) macros.h $(SRCS_CXX) $(SRCS_PROTO) configs/*.json # Install PREFIX ?= /usr BINDIR ?= $(PREFIX)/bin MANDIR ?= $(PREFIX)/share/man/man1 .PHONY: install install: $(BIN) install -m 755 -d $(DESTDIR)$(BINDIR) install -m 755 $(BIN) $(DESTDIR)$(BINDIR) install -m 755 -d $(DESTDIR)$(MANDIR) install -m 644 nsjail.1 $(DESTDIR)$(MANDIR) define run_test @echo "Testing: $(1) (expecting exit code $(2))"; \ ($(1)); ret=$$?; \ if [ "$$ret" -ne "$(2)" ]; then \ echo "❌ FAIL: '$(1)' returned $$ret, expected $(2)"; \ exit 1; \ else \ echo "✅ PASS: '$(1)' returned $$ret"; \ fi endef OLD_EF := --experimental_mnt=old NEW_EF := --experimental_mnt=new UID := $(shell id -u) .PHONY: test-cmdline test-cmdline: $(BIN) # --- Command-line integer parsing --- $(call run_test, ./nsjail --time_limit 1.5 --help > /dev/null, 255) $(call run_test, ./nsjail --time_limit=-1 --help > /dev/null, 255) $(call run_test, ./nsjail --max_cpus 4294967296 --help > /dev/null, 255) $(call run_test, ./nsjail --nice_level=2147483648 --help > /dev/null, 255) $(call run_test, ./nsjail --user 1000:1000:1.5 --help > /dev/null, 255) $(call run_test, ./nsjail --rlimit_cpu 1.5 --help > /dev/null, 255) $(call run_test, ./nsjail --time_limit 0x10 --cgroup_mem_swap_max=-1 --user 1000:1000:1 --help > /dev/null, 0) .PHONY: test test: $(BIN) $(TEST_BINS) test-cmdline $(call run_test, ./tests/nstun_buffer_budget_test, 0) $(call run_test, ./tests/nstun_policy_test, 0) $(call run_test, ./tests/nstun_ip_test, 0) # --- Basic sanity tests --- $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 -- /bin/true, 0) $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 -- /bin/false, 1) $(call run_test, strace -f -qq -e inject=setgroups:error=EPERM ./nsjail -q -Mo --disable_clone_newuser --chroot / --user 99999 --group 99999 -- /bin/true, 255) ifeq ($(UID),0) $(call run_test, setpriv --reuid 1000 --regid 1000 --groups 1234 -- ./nsjail -q -Mo --user 65534 --group 65534 --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc -- /bin/true, 255) $(call run_test, setpriv --reuid 1000 --regid 1000 --clear-groups -- ./nsjail -q -Mo --user 65534 --group 65534 --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc -- /bin/true, 0) $(call run_test, setsid --fork --wait ./nsjail -q -Me --disable_clone_newuser --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc --chroot / -- /bin/true, 0) $(call run_test, strace -f -qq -e inject=setsid:error=EPERM ./nsjail -q -Me --disable_clone_newuser --disable_clone_newnet --disable_clone_newcgroup --disable_clone_newns --disable_clone_newpid --disable_clone_newipc --disable_clone_newuts --disable_proc --chroot / -- /bin/true, 255) endif $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 -- /bin/true < /tmp, 255) $(call run_test, ./nsjail -q -Mo --chroot / --user 99999 --group 99999 --pass_fd 0 -- /bin/true < /tmp, 0) $(call run_test, ./nsjail --config tests/seccomp.cfg -q -t 2 -- /bin/bash -c 'strace -o /dev/null /bin/true || exit 77', 77) $(call run_test, ./nsjail --config tests/basic.cfg -q -t 2 -- /bin/bash -c 'strace -o /dev/null /bin/true && exit 77', 77) $(call run_test, ./nsjail --config tests/pasta-nat.cfg -q -t 3 -- /bin/bash -c 'sleep 0.2; ping -W 1 -c 1 8.8.8.8 && exit 77', 77) $(call run_test, ./nsjail --config tests/pasta-port-mappings.cfg -q -t 3 -- /bin/bash -c 'sleep 0.2; { netstat -tan | grep LISTEN; } && exit 77', 77) ifeq ($(NL3_EXISTS), yes) # --- Traffic rules tests --- $(call run_test, ./nsjail --config tests/traffic-rules.cfg -q -t 1 -- /bin/bash -c 'sleep 10', 137) $(call run_test, ./nsjail --config tests/traffic-drop-tcp4.cfg -q -t 1 -- /bin/bash -c 'sleep 10', 137) $(call run_test, ./nsjail --config tests/traffic-drop-udp6.cfg -q -t 1 -- /bin/bash -c 'sleep 10', 137) $(call run_test, ./nsjail --config tests/traffic-mixed.cfg -q -t 1 -- /bin/bash -c 'sleep 10', 137) endif # --- IPv4-only NAT tests --- $(call run_test, ./nsjail --config tests/nat-ip4-only.cfg -q -t 3 --cap CAP_NET_RAW -- /bin/bash -c 'ping -4 -W 1 -c 1 8.8.8.8 && exit 77', 77) # --- IPv6-only NAT tests --- $(call run_test, ./nsjail --config tests/nat-ip6-only.cfg -q -t 3 -- /bin/true < /dev/null, 0) # --- SOCKS5 proxy test --- $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'wget -4 https://dns.google -O /dev/null && exit 77', 77) $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'wget -6 https://dns.google -O /dev/null && exit 77', 77) # SOCKS5 UDP (DNS over UDP) and TCP (DNS over TCP) via IPv4 and IPv6 resolvers $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'host -U dns.google 8.8.8.8 && exit 77', 77) $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'host -T dns.google 8.8.8.8 && exit 77', 77) $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'host -U dns.google 2001:4860:4860::8888 && exit 77', 77) $(call run_test, ./nsjail --config tests/socks5.cfg -q -t 3 -- /bin/bash -c 'host -T dns.google 2001:4860:4860::8888 && exit 77', 77) # --- HTTP CONNECT proxy test --- $(call run_test, ./nsjail --config tests/connect.cfg -q -t 3 -- /bin/bash -c 'wget -4 https://dns.google -O /dev/null && exit 77', 77) $(call run_test, ./nsjail --config tests/connect.cfg -q -t 3 -- /bin/bash -c 'wget -6 https://dns.google -O /dev/null && exit 77', 77) # HTTP CONNECT DNS over TCP via IPv4 and IPv6 resolvers $(call run_test, ./nsjail --config tests/connect.cfg -q -t 3 -- /bin/bash -c 'host -T dns.google 8.8.8.8 && exit 77', 77) $(call run_test, ./nsjail --config tests/connect.cfg -q -t 3 -- /bin/bash -c 'host -T dns.google 2001:4860:4860::8888 && exit 77', 77) # --- HOST_TO_GUEST TCP inbound proxy test (IPv4 + IPv6) --- $(call run_test, { ./nsjail --config tests/dns_http_host_to_guest.cfg -q -t 3 & }; sleep 1; wget -4 -q -O /dev/null --timeout=5 http://127.0.0.1:8080/ && wget -6 -q -O /dev/null --timeout=5 http://[::1]:8080/ && exit 77, 77) # --- --experimental_mnt=old --- $(call run_test, ./nsjail $(OLD_EF) -q -Mo --rw --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch $(HOME)/nsjail_test && exit 77', 77) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch $(HOME)/nsjail_test || exit 77', 77) $(call run_test, rm -f $(HOME)/nsjail_test, 0) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / -m none:/tmp:tmpfs --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / -m none:/tmp:tmpfs:rw --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / -m none:/tmp:tmpfs:ro --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test || exit 77', 77) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / -R /tmp --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test || exit 77', 77) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / -B /tmp --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch /run/user/$(UID)/nsjail_test2 || exit 77', 77) $(call run_test, ./nsjail $(OLD_EF) -q -Mo --chroot / --user 99999 --group 99999 --rw -- /bin/bash -c 'touch /run/user/$(UID)/nsjail_test2 && exit 77', 77) $(call run_test, rm -f /run/user/$(UID)/nsjail_test2, 0) $(call run_test, ./nsjail $(OLD_EF) --config configs/bash-with-fake-geteuid.cfg -q -t 1 < /dev/null, 0) $(call run_test, ./nsjail $(OLD_EF) --config configs/bash-with-fake-geteuid.json -q -t 1 < /dev/null, 0) $(call run_test, ./nsjail $(OLD_EF) --config configs/static-busybox-with-execveat.cfg -q -t 1, 137) $(call run_test, ./nsjail $(OLD_EF) --config configs/home-documents-with-xorg-no-net.cfg -q -- /bin/true, 0) $(call run_test, ./nsjail $(OLD_EF) --config configs/home-documents-with-xorg-no-net.cfg -q -- /bin/false, 1) $(call run_test, ./nsjail $(OLD_EF) --config configs/firefox-with-net-X11.cfg -q -t 2, 137) $(call run_test, ./nsjail $(OLD_EF) --config configs/firefox-with-net-wayland.cfg -q -t 2, 137) $(call run_test, ./nsjail $(OLD_EF) --config configs/chromium-with-net-wayland.cfg -q -t 2, 137) # --- --experimental_mnt=new --- $(call run_test, ./nsjail $(NEW_EF) -q -Mo --rw --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch $(HOME)/nsjail_test && exit 77', 77) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch $(HOME)/nsjail_test || exit 77', 77) $(call run_test, rm -f $(HOME)/nsjail_test, 0) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / -m none:/tmp:tmpfs --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / -m none:/tmp:tmpfs:rw --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / -m none:/tmp:tmpfs:ro --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test || exit 77', 77) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / -R /tmp --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test || exit 77', 77) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / -B /tmp --user 99999 --group 99999 -- /bin/bash -c 'touch /tmp/nsjail_test && rm -f /tmp/nsjail_test', 0) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / --user 99999 --group 99999 -- /bin/bash -c 'touch /run/user/$(UID)/nsjail_test2 || exit 77', 77) $(call run_test, ./nsjail $(NEW_EF) -q -Mo --chroot / --user 99999 --group 99999 --rw -- /bin/bash -c 'touch /run/user/$(UID)/nsjail_test2 && exit 77', 77) $(call run_test, rm -f /run/user/$(UID)/nsjail_test2, 0) $(call run_test, ./nsjail $(NEW_EF) --config configs/bash-with-fake-geteuid.cfg -q -t 1 < /dev/null, 0) $(call run_test, ./nsjail $(NEW_EF) --config configs/bash-with-fake-geteuid.json -q -t 1 < /dev/null, 0) $(call run_test, ./nsjail $(NEW_EF) --config configs/static-busybox-with-execveat.cfg -q -t 1, 137) $(call run_test, ./nsjail $(NEW_EF) --config configs/home-documents-with-xorg-no-net.cfg -q -- /bin/true, 0) $(call run_test, ./nsjail $(NEW_EF) --config configs/home-documents-with-xorg-no-net.cfg -q -- /bin/false, 1) $(call run_test, ./nsjail $(NEW_EF) --config configs/firefox-with-net-X11.cfg -q -t 2, 137) $(call run_test, ./nsjail $(NEW_EF) --config configs/firefox-with-net-wayland.cfg -q -t 2, 137) $(call run_test, ./nsjail $(NEW_EF) --config configs/chromium-with-net-wayland.cfg -q -t 2, 137) @echo "" @echo "========================================" @echo " ✅ All tests passed!" @echo "========================================" @echo "" tests/nstun_buffer_budget_test: tests/nstun_buffer_budget_test.cc nstun/buffer_budget.h $(CXX) $(filter-out -c,$(CXXFLAGS)) $< -o $@ tests/nstun_policy_test: tests/nstun_policy_test.cc nstun/policy.cc logs.cc util.cc $(SRCS_PB_CXX) $(CXX) $(filter-out -c,$(CXXFLAGS)) tests/nstun_policy_test.cc nstun/policy.cc logs.cc util.cc $(SRCS_PB_CXX) -o $@ $(LDFLAGS) tests/nstun_ip_test: tests/nstun_ip_test.cc nstun/net_defs.h $(CXX) $(filter-out -c,$(CXXFLAGS)) tests/nstun_ip_test.cc -o $@ # Dependencies (Generated by makedepend) # DO NOT DELETE THIS LINE -- make depend depends on it. caps.o: caps.h nsjail.h config.pb.h logs.h macros.h util.h cgroup.o: cgroup.h nsjail.h config.pb.h logs.h util.h cgroup2.o: cgroup2.h nsjail.h config.pb.h logs.h util.h cmdline.o: cmdline.h nsjail.h config.pb.h caps.h config.h logs.h macros.h cmdline.o: mnt.h mnt_newapi.h user.h util.h config.o: config.h nsjail.h config.pb.h caps.h cmdline.h logs.h macros.h config.o: mnt.h user.h util.h contain.o: contain.h nsjail.h config.pb.h caps.h cgroup.h cgroup2.h config.h contain.o: cpu.h logs.h macros.h missing_defs.h mnt.h net.h pid.h user.h contain.o: util.h uts.h cpu.o: cpu.h nsjail.h config.pb.h logs.h util.h logs.o: logs.h macros.h util.h nsjail.h config.pb.h mnt.o: mnt.h nsjail.h config.pb.h logs.h macros.h mnt_legacy.h mnt_newapi.h mnt.o: subproc.h util.h mnt_legacy.o: mnt_legacy.h mnt.h nsjail.h config.pb.h logs.h macros.h util.h mnt_newapi.o: mnt_newapi.h mnt.h nsjail.h config.pb.h logs.h util.h net.o: net.h nsjail.h config.pb.h logs.h macros.h nstun/nstun.h util.h nsjail.o: nsjail.h config.pb.h cgroup2.h cmdline.h logs.h macros.h net.h nsjail.o: sandbox.h subproc.h unotify/unotify.h util.h pid.o: pid.h nsjail.h config.pb.h logs.h subproc.h sandbox.o: sandbox.h nsjail.h config.pb.h subproc.h kafel/include/kafel.h sandbox.o: logs.h unotify/syscall_defs.h util.h subproc.o: subproc.h nsjail.h config.pb.h cgroup.h cgroup2.h contain.h logs.h subproc.o: macros.h net.h nstun/nstun.h sandbox.h unotify/unotify.h user.h subproc.o: util.h uts.o: uts.h nsjail.h config.pb.h logs.h user.o: user.h nsjail.h config.pb.h logs.h macros.h subproc.h util.h unotify/unotify.o: unotify/unotify.h nsjail.h config.pb.h logs.h unotify/unotify.o: unotify/record.h unotify/unotify.pb.h unotify/stats.h unotify/unotify.o: unotify/syscall.h util.h unotify/stats.o: unotify/stats.h nsjail.h config.pb.h unotify/record.h unotify/stats.o: unotify/unotify.pb.h logs.h util.h unotify/syscall.o: unotify/syscall.h unotify/record.h unotify/unotify.pb.h unotify/syscall.o: logs.h macros.h unotify/syscall_defs.h util.h nsjail.h unotify/syscall.o: config.pb.h util.o: util.h nsjail.h config.pb.h logs.h macros.h missing_defs.h nstun/nstun.o: nstun/nstun.h nstun/core.h nstun/buffer_budget.h nstun/nstun.o: nstun/net_defs.h nstun/icmp.h nstun/iface.h nstun/ip.h logs.h nstun/nstun.o: macros.h nstun/policy.h nstun/tcp.h nstun/tun.h nstun/udp.h nstun/nstun.o: util.h nsjail.h config.pb.h nstun/policy.o: nstun/policy.h nstun/core.h nstun/buffer_budget.h nstun/policy.o: nstun/net_defs.h nstun/nstun.h logs.h config.pb.h nsjail.h nstun/encap.o: nstun/encap.h nstun/net_defs.h logs.h nstun/iface.o: nstun/iface.h logs.h macros.h nstun/net_defs.h nsjail.h nstun/iface.o: config.pb.h nstun/nstun.h nstun/tun.o: nstun/tun.h nstun/core.h nstun/buffer_budget.h nstun/net_defs.h nstun/tun.o: nstun/nstun.h nstun/icmp.h nstun/ip.h logs.h nstun/ip.o: nstun/ip.h nstun/core.h nstun/buffer_budget.h nstun/net_defs.h nstun/ip.o: nstun/nstun.h nstun/icmp.h logs.h nstun/tcp.h nstun/udp.h nstun/icmp.o: nstun/icmp.h nstun/core.h nstun/buffer_budget.h nstun/icmp.o: nstun/net_defs.h nstun/nstun.h logs.h macros.h nstun/policy.h nstun/icmp.o: nstun/tun.h nstun/udp.o: nstun/udp.h nstun/core.h nstun/buffer_budget.h nstun/net_defs.h nstun/udp.o: nstun/nstun.h nstun/encap.h nstun/icmp.h logs.h macros.h nstun/udp.o: nstun/policy.h nstun/tun.h nstun/tcp.o: nstun/tcp.h nstun/core.h nstun/buffer_budget.h nstun/net_defs.h nstun/tcp.o: nstun/nstun.h nstun/encap.h logs.h macros.h nstun/policy.h nstun/tcp.o: nstun/tun.h util.h nsjail.h config.pb.h config.pb.o: config.pb.h unotify/unotify.pb.o: unotify/unotify.pb.h