コンテナや仮想化なしでOpenVPNを介して個々のアプリケーションを実行する

ある晴れた朝、私は元の友人や同僚に、Linuxのネットワーク名前空間とは何か、それは何を使っているのかを電報で伝えました。 同僚は以前と同じように賞賛しましたが、以前のようにスクリプトを握るのではなく、別のネットワークネームスペースとその中のOpenVPNの起動を自動化する必要があることに気付きました。 私はDebian SidとUbuntu 16.04 LTSを使用しているので、systemdユニットの形で自動化を行いましたが、それについては記事の最後で詳しく説明しました。 今度はITから遠く離れた別の人に、ブラウザなどの1つのアプリケーションのみをVPNで実行し、残りは以前と同じように言った後、彼はこう言いました。「これのために、コンピュータでLinuxに切り替えてください」 、そして私はこれを行う方法に関する記事を書くことにしました。



Linuxのネットワーク名前空間とは何かについて多くのことが書かれていますが、知らない人のために、 手に入れたロシア語の説明を簡単に引用します。



「Linuxでは、名前空間のような素晴らしいものが比較的昔に登場しました。 このテクノロジーの主なアプリケーションはコンテナ仮想化ですが、名前空間には「ネットワーク名前空間」があるため、ルーターにはさまざまなアプリケーションが考えられます。 ネットワーク名前空間を使用すると、各名前空間の1台のマシン内で次のことが可能になります。





それでは、記事のトピックに移りましょう。



手動でネットワーク名前空間を上げて、コメント付きでOpenVPNを実行するためのスクリプト

#!/bin/bash sudo ip netns add vpn #  namespace   vpn sudo ip netns exec vpn ip addr add 127.0.0.1/8 dev lo #     lo sudo ip netns exec vpn ip link set lo up #  loopback-  netns sudo ip link add vpn0 type veth peer name vpn1 #     ,    netns     sudo ip link set vpn0 up #    sudo ip link set vpn1 netns vpn up #   netns       sudo ip addr add 10.10.10.1/24 dev vpn0 #       sudo ip netns exec vpn ip addr add 10.10.10.2/24 dev vpn1 #      netns sudo ip netns exec vpn ip route add VPN_IP via 10.10.10.1 dev vpn1 #    VPN-( VPN_IP    ) sudo ip netns exec vpn ip route add default via 10.10.10.254 dev vpn1 #           ,   OpenVPN       (    ,  OpenVPN               ) sudo iptables -A INPUT ! -i vpn0 -s 10.10.10.0/24 -j DROP sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o en+ -j MASQUERADE #  ,  en+  wl+    wifi-     sudo sysctl -q net.ipv4.ip_forward=1 #    sudo mkdir -p /etc/netns/vpn #         resolv.conf   netns echo "nameserver 8.8.8.8" |sudo tee /etc/netns/vpn/resolv.conf #   8.8.8.8    sudo ip netns exec vpn /usr/sbin/openvpn --daemon --writepid /run/openvpn/vpn.pid --cd /etc/openvpn/ --config vpn.conf #  OpenVPN  - /etc/openvpn/vpn.conf  netns
      
      





このスクリプトを実行したら、次のコマンドを使用できます。



 $ sudo ip netns exec vpn curl http://ifconfig.me
      
      





OpenVPNがネット内で発生し、OpenVPNを介してネット内のネットワークを終了することを確認してください。 次のコマンドで:



 $ sudo ip netns exec vpn su - USER_NAME -c firefox
      
      





ブラウザを起動し、VPNを介してブラウザを動作させることができます。システムの残りの部分は以前と同様に機能し、残りは直接移動します(コマンドで、USER_NAMEをユーザー名に置き換えます)。 ブラウザを起動する例は、ユーザーがデスクトップにsudoを持っているという事実に基づいています。 誰かがsudoなしでip netns execを使用する方法を教えてくれたら、ありがたいです。



ブラウザと同様に、IMクライアント、トレントクライアント、その他すべてを実行できます。 firefoxが起動時にdbusに接続できないことを誓う場合、コマンドでsudoの前にdbus-launchを入れて起動します。



netnsを停止するスクリプト:

 #!/bin/bash sudo ip netns pids vpn | xargs -rd'\n' sudo kill sudo rm -rf /etc/netns/vpn sudo sysctl -q net.ipv4.ip_forward=0 sudo iptables -D INPUT ! -i vpn0 -s 10.10.10.0/24 -j DROP sudo iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o en+ -j MASQUERADE sudo ip link del vpn0 sudo ip netns delete vpn
      
      





起動時にマシンに示されたすべてを上げるsystemdの単位。 netnsの単位:



 [Unit] Description=Network namespace for VPN After=syslog.target network.target StopWhenUnneeded=true RefuseManualStart=true RefuseManualStop=true [Service] EnvironmentFile=/etc/netns/vpn.env Type=oneshot RemainAfterExit=true ExecStart=/bin/ip netns add vpn ExecStart=/bin/ip netns exec vpn ip addr add 127.0.0.1/8 dev lo ExecStart=/bin/ip netns exec vpn ip link set lo up ExecStart=/bin/ip link add vpn0 type veth peer name vpn1 ExecStart=/bin/ip link set vpn0 up ExecStart=/bin/ip link set vpn1 netns vpn up ExecStart=/bin/ip addr add ${NETWORK}.1/24 dev vpn0 ExecStart=/bin/ip netns exec vpn ip addr add ${NETWORK}.2/24 dev vpn1 ExecStart=/bin/ip netns exec vpn ip route add ${VPN_SERVER} via ${NETWORK}.1 dev vpn1 ExecStart=/bin/ip netns exec vpn ip route add default via ${NETWORK}.254 dev vpn1 ExecStart=/sbin/iptables -A INPUT ! -i vpn0 -s ${NETWORK}.0/24 -j DROP ExecStart=/sbin/iptables -t nat -A POSTROUTING -s ${NETWORK}.0/24 -o wl+ -j MASQUERADE ExecStart=/sbin/sysctl -q net.ipv4.ip_forward=1 ExecStart=/bin/mkdir -p /etc/netns/vpn ExecStart=/bin/sh -c "echo 'nameserver 8.8.8.8' > /etc/netns/vpn/resolv.conf" ExecStop=/bin/rm -rf /etc/netns/vpn ExecStop=/sbin/sysctl -q net.ipv4.ip_forward=0 ExecStop=/sbin/iptables -D INPUT ! -i vpn0 -s ${NETWORK}.0/24 -j DROP ExecStop=/sbin/iptables -t nat -D POSTROUTING -s ${NETWORK}.0/24 -o wl+ -j MASQUERADE ExecStop=/bin/ip link del vpn0 ExecStop=/bin/ip netns delete vpn [Install] WantedBy=multi-user.target
      
      





OpenVPNのユニット:



 [Unit] Description=OpenVPN inside network namespace Requires=vpnns.service After=syslog.target network.target vpn-ns.service [Service] PrivateTmp=true Type=forking PIDFile=/var/run/openvpn/%i.pid ExecStart=/bin/ip netns exec vpn /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf [Install] WantedBy=multi-user.target
      
      





そして、netnsが使用するVPNサーバーとネットワークのアドレスを設定する変数を含むファイル:



 VPN_SERVER=1.1.1.1 # Change IP to your OpenVPN-server IP NETWORK=10.10.10
      
      





次のコマンドを使用して、systemdのファイルをファイルシステム上の場所にコピーします。



 $ sudo systemctl enable openvpn-ns@NAME.service
      
      





ここで、NAMEはOpenVPN構成ファイルと同じ名前です。 その後、実行できます



 $ sudo systemctl start openvpn-ns@NAME.service
      
      





OpenVPNは、vpnという名前の専用ネットワーク名前空間で起動します。



チーム



 $ sudo ip netns exec vpn curl http://ifconfig.me
      
      





netns内にVPNがあり、サーバーのアドレスから歩いていることを確認できます。



» githubのシステム化されたユニット

» gist.gihub.comのvpnns_up.shおよびvpnns_down.shのスクリプト



記事の準備では、2つのリンクが役立ちました。

» Schnouki.net/posts/2014/12/12/openvpn-for-a-single-application-on-linux

» Www.linux.org.ru/forum/admin/11591881



Raistとして知られるSergey Voronovに特別な感謝を捧げます。



PS専用のネットワーク名前空間でVPNを起動することは、検閲の回避としてだけでなく、仕事の目的でも使用できます。OpenVPNのユニットを作成した後、クライアントのネットワークを引き上げてアクセスできるように、同様のVPNを作成しましたネットワークは、スタンドアロンアプリケーションのみです。



All Articles