Это заняло у меня некоторое время, но я понял это. Не так просто, как я надеялся, но это работает. Спасибо @dirkt за указание в правильном направлении.
Сначала создайте следующие скрипты в каталоге / usr / local / bin:
nsstart
:
#!/bin/sh # Enable eno1 interface # eno1 is the name of the interface I get my connection from, change it so it fits your system ip link set eno1 up # Add 'internet' namespace ip netns add internet # Create veth pair and add veth1 to 'internet' namespace ip link add type veth ip link set veth1 netns internet ip link set veth0 up # Create bridge interface and add eno1 and veth0 to it ip link add type bridge ip link set bridge0 up ip link set eno1 master bridge0 ip link set veth0 master bridge0 # Enable namespace interfaces, add IP and route ip netns exec internet ip link set lo up ip netns exec internet ip link set veth1 up # Set a free IP from your routers IP range here # You can also use a DHCP client if you have one, mine didn't work with namespaces ip netns exec internet ip addr add 192.168.1.99/24 dev veth1 # Set IP of the router here ip netns exec internet ip route add default via 192.168.1.1 metric 10
nsinternet
:
#!/bin/sh # Execute the command in internet namespace as user who called sudo ip netns exec internet sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"
Затем добавьте и включите службу systemd в файл /etc/systemd/system/internet-namespace.service
(я использую systemd-networkd
для получения своего IP-адреса от моего маршрутизатора, если вы используете что-то другое, измените его ниже, чтобы мост был настроен до того, как клиент DHCP попытается получить для него адрес):
[Unit] Description=Sets up a namespace that uses real internet connection instead of OpenVPN After=systemd-udevd.service Before=systemd-networkd.service network.target Wants=network.target [Service] Type=oneshot RemainAfterExit=1 ExecStart=/usr/local/bin/nsstart [Install] WantedBy=multi-user.target
Затем добавьте эту строку в sudoers
файл (это необязательно, это сделает так, чтобы вам не приходилось вводить пароль при попытке использовать пространство имен, которое мы создали):
%wheel ALL=NOPASSWD: /usr/local/bin/nsinternet
Не забудьте добавить bridge0
к вашему DHCP-клиенту.
Вот и все. Включите службу openvpn-client, и все готово. Теперь по умолчанию используется пространство имен, использующее VPN-соединение, и если вы хотите использовать ваше настоящее интернет-соединение, просто запустите sudo nsinternet YOUR_COMMAND
.