Linuxのネットワーク名前空間とは何かについて多くのことが書かれていますが、知らない人のために、 手に入れたロシア語の説明を簡単に引用します。
「Linuxでは、名前空間のような素晴らしいものが比較的昔に登場しました。 このテクノロジーの主なアプリケーションはコンテナ仮想化ですが、名前空間には「ネットワーク名前空間」があるため、ルーターにはさまざまなアプリケーションが考えられます。 ネットワーク名前空間を使用すると、各名前空間の1台のマシン内で次のことが可能になります。
- ルーティングテーブルの独自のセット(およびそれらの2 ^ 31-1があります)
- あなたのARPテーブル
- 独自のiptablesルール
- 独自のデバイス(したがってqdisc + tcクラス) ''
それでは、記事のトピックに移りましょう。
手動でネットワーク名前空間を上げて、コメント付きで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を作成しましたネットワークは、スタンドアロンアプリケーションのみです。