GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxネットワークの名前空間間でトラフィックを転送する方法は?

ネットワーク名前空間を設定し、名前空間内で127.0.0.1をリッスンするサーバーを起動できました:

# ip netns add vpn
# ip netns exec vpn ip link set dev lo up
# ip netns exec vpn nc -l -s 127.0.0.1 -p 80 &

# ip netns exec vpn netstat -tlpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      5598/nc

その後、名前空間内のサーバーに接続できます:

# ip netns exec vpn nc 127.0.0.1 80 -zv
localhost [127.0.0.1] 80 (http) open

しかし、名前空間の外部のサーバーに接続できません:

# nc 127.0.0.1 80
(UNKNOWN) [127.0.0.1] 80 (http) : Connection refused

グローバル名前空間からVPN名前空間にトラフィックを転送するようにiptablesまたは名前空間を構成するにはどうすればよいですか?

承認された回答:

まず、127.0.0.0 / 8やループバックインターフェイス(loなど)を使用してこれを実現することはできないと思います。 127.0.0.0/8とループバックには特定のものが配線されているため、他のIPとインターフェイスを使用する必要があります。

次に、確かに複数の方法がありますが、ここに例があります:

# ip netns add vpn
# ip link add name vethhost0 type veth peer name vethvpn0
# ip link set vethvpn0 netns vpn
# ip addr add 10.0.0.1/24 dev vethhost0
# ip netns exec vpn ip addr add 10.0.0.2/24 dev vethvpn0
# ip link set vethhost0 up
# ip netns exec vpn ip link set vethvpn0 up
# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.100 ms

最初のコマンドは、仮想イーサネットケーブルで接続された仮想イーサネットインターフェイスのペアを薄い空気から作成します。 2番目のコマンドは、これらのインターフェイスの1つをnetnsvpnに移動します。これは、socketpair(2)やpipe(2)のようなものと同等であると考えてください。プロセスはペアを作成してからフォークし、各プロセスはペアの一方の端のみを保持し、通信できます。

通常(LXC、virt-managerなど)多くのネットがある場合、すべてを同じLANに配置するためのブリッジもあります。

これが設定されると、ホストにとっては他のルーターと同じようになります。
ip転送を有効にします(可能な場合はさらに制限します。少なくともvethhost0とメインインターフェイスには必要です):

# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

次のようなDNATルールを追加します:

# iptables -t nat -A PREROUTING ! -s 10.0.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

これで、VPN内にデフォルトルートを追加できます:

# ip netns exec vpn ip route add default via 10.0.0.1

または、代わりに、SNATルールを追加して、すべてがvpn内の10.0.0.1からのものであると見なされるようにします。

# iptables -t nat -A POSTROUTING -d 10.0.0.2/24 -j SNAT --to-source 10.0.0.1

これを設定すると、他のホストからテストできますが、ホスト自体からはテストできません。これを行うには、前のDNATと同様のDNATルールも追加しますが、OUTPUTに変更し(そうでない場合は、発信http接続も変更されます)、独自のIPに変更します。 IPが192.168.1.2であるとしましょう:

# iptables -t nat -A OUTPUT -d 192.168.1.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

これで、ホストからそれ自体に接続した場合でも機能します if ループバックIPは使用しませんが、上記のnatルールを持つホストに属する他のIPを使用します。 IPが192.168.1.2であるとしましょう:

# ip netns exec vpn nc -l -s 10.0.0.2 -p 80 &
[1] 10639
# nc -vz 192.168.1.2 80
nc: myhost (192.168.1.2) 80 [http] open
#
[1]+  Done                    ip netns exec vpn nc -l -s 10.0.0.2 -p 80

Linux
  1. Linux名前空間でChrootを実行する方法は?

  2. Linux –現在のプロセスでネットワークの共有を解除する方法は?

  3. Linux – Linuxで名前空間を一覧表示する方法は?

  1. Linuxmtrコマンドの使用方法

  2. vnStat を使用して Linux でネットワーク トラフィックを監視およびログに記録する方法

  3. Linux で 2 つのマイクロを区別する方法

  1. LinuxでSambaを介してネットワーク共有を作成する方法

  2. vnStat を使用して Linux でネットワーク トラフィックを監視する方法

  3. Linux:日次/月次のネットワーク トラフィックを測定する方法は?