Решение I: Предварительная загрузка конкретной библиотеки
App-Route-Jail : используйте ld_preload для принудительной настройки интерфейсного шлюза (отличная идея, но требуются возможности root или меток). Подробное описание приведено ниже.
Proxybound : используйте ld_preload для принудительной установки прокси в конкретном приложении (вместо интерфейса используется прокси)
Force-Bind : имеет много функций, но утечки привязки (не надежны)
Bind-Interface-IP : слишком простые и неплотные соединения (не надежно)
Bind-IP : слишком прост и утечка соединений (не надежно)
Решение II: пользовательское пространство Linux
Классическое пользовательское пространство linux ip-netns : отличное решение, но требуется root, и интерфейс может существовать только в одном пользовательском пространстве
Firejail : Firejail может заставить приложение использовать определенную сеть, но совместимость ограничена (например, она не совместима с интерфейсами tun). firejail не требует рутаfirejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail с netns : Firejail может заставить приложение использовать определенное пространство пользователя, которое было создано отдельно, это позволяет нам использовать пространства имен без rootfirejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail с маскарадом и мостом : Firejail может заставить приложение использовать определенный интерфейс с маскарадом iptables , это здорово и не требует root, но это требует ip_forward и может означать влияние на безопасностьfirejail --net=br0 firefox
Решение III: Linux iptables
Iptables можно использовать для этой цели, но это требует ip_forward и может подразумевать влияние на безопасность, если оно настроено неправильно, пример 1 , пример 2 , пример 3 , пример 4
Решения (I, II и III) примечания:
Wireguard
Если вы используете VPN (особенно wireguard) и хотите применить это решение к интерфейсу wireguard ( wireguard с пользовательским пространством ), вы можете следовать инструкциям по ссылке, чтобы создать пространство пользователя, содержащее интерфейс wg (и, следовательно, ограниченное интерфейсом vpn). ) также это можно сочетать с firejail --netns=container
возможностью использования пространства пользователя без рута.
Как найти интерфейсный шлюз
Существует множество решений для поиска шлюза, здесь приведены некоторые команды, позволяющие найти используемый шлюз
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0
Как использовать App-Route-Jail
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
- Добавление маршрута для будущих помеченных пакетов (для заключенного в тюрьму приложения) в этом примере
192.168.1.1
используется в качестве принудительного шлюза, это правило маршрута не повлияет на другие приложения, например, эту манипуляцию нужно выполнять только один раз при загрузке системы, если вы хотите используйте это решение ежедневно
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
- Запустите приложение, которое вы хотите заключить в тюрьму
MARK=10 LD_PRELOAD=./mark.so firefox
- Тестирование wan IP-адреса
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me