VPN 분할 터널링에 네트워크 네임스페이스를 사용하는 방법

VPN 분할 터널링에 네트워크 네임스페이스를 사용하는 방법

내 목표는 VPN을 통해 기본 네임스페이스를 라우팅하고, VPN을 통해 라우팅되지 않는 새 네임스페이스를 생성하는 것입니다. 이를 통해 원격 VPN 네트워크에 액세스할 수 없는 프로그램을 선택적으로 시작할 수 있습니다.

LAN 주소: enp0s3의 10.0.2.15/24
VPN 주소: tun1의 10.111.0.10/24

# enable forwarding
sysctl -w net.ipv4.ip_forward=1
# create the network namespace
ip netns add sample_ns
# create the virtual nic and it's peer
ip link add virt_out type veth peer name virt_in

# assign the peer to the network namespace
ip link set virt_in netns sample_ns
# bring up interface
ip link set virt_out up

#Create a new bridge and change its state to up:
ip link add name bridge_name type bridge
#To add an interface (e.g. eth0) into the bridge, its state must be up:
ip link set enp0s3 up
#Adding the interface into the bridge is done by setting its master to bridge_name:
ip link set enp0s3 master bridge_name
ip link set virt_out master bridge_name
#To show the existing bridges and associated interfaces, use the bridge utility (also part of iproute2). See bridge(8) for details.
bridge link
# assign an ip address
ip addr add 10.0.3.1/24 dev virt_out


#network setup for network namespace
ip netns exec sample_ns ip link set lo up
ip netns exec sample_ns ip addr add 10.0.3.2/24 dev virt_in
ip netns exec sample_ns ip link set virt_in up
ip netns exec sample_ns ip route add default via 10.0.3.2 dev virt_in

# allow forwarding and add enable NAT
iptables -I FORWARD -s 10.0.3.0/24 -j ACCEPT
iptables -t nat -I POSTROUTING -s 10.0.3.0/24 -o enp0s3 -j MASQUERADE

# pop a shell in the namespace
ip netns exec sample_ns bash

# check that you're in the namespace
ip netns identify

# run the browser as your local user
runuser -u $USER google-chrome


#to access snap packages in ns run in the ns: (“error: cannot find tracking cgroup”)
sudo mount -t cgroup2 cgroup2 /sys/fs/cgroup
sudo mount -t securityfs securityfs /sys/kernel/security/

그 목표는 기본적으로 네임스페이스드-openvpn(https://github.com/slingamn/namespaced-openvpn) 따라서 VPN으로 보호되는 네임스페이스가 기본 네임스페이스이고, 연결되지 않은 VPN에 연결된 네임스페이스가 새 네임스페이스입니다.

현재 하고 있는 작업이 작동하지 않습니다. 어떻게든 브리지/가상 NIC 또는 enp0s3에 IP 주소를 추가해야 할까요?

도와주셔서 감사합니다!

다른 출처:
https://forums.openvpn.net/viewtopic.php?f=15&t=25690
https://github.com/ausbin/nsdo

답변1

이를 위해서는 브리지 대신 다른 가상화 네트워크를 사용하는 것이 더 쉬울 것입니다.
"veth+bridge를 사용하지 마세요! macvlan을 사용하세요!
"https://unix.stackexchange.com/a/546090/568691)

네임스페이스 추가

ip netns add sample_ns

macvlan 링크를 생성하고 이를 상위 호스트 enp0s3(https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking/#macvlan)

ip link add mv1 link enp0s3 address 00:11:22:33:44:55 type macvlan mode bridge

주소 중 00:11:22:33:44:55 부분이 생략되면 임의의 MAC 주소가 생성됩니다. 물리적 enp0s3 또는 eth0 등과 동일한 Mac을 사용하려면 레이어 2 모드에서 macvlan 대신 ipvlan을 사용할 수 있습니다(https://www.kernel.org/doc/Documentation/networking/ipvlan.txt).

새 인터페이스 mv1을 새 네임스페이스로 이동합니다.

ip link set mv1 netns sample_ns

인터페이스 호출

ip netns exec sample_ns ip link set dev lo up
ip netns exec sample_ns ip link set dev mv1 up

dhclient를 사용하여 IP 주소를 설정하세요. 일반적으로 이렇게 하면 라우팅도 설정됩니다.

ip netns exec sample_ns dhclient mv1

#dhclient가 작동하지 않으면 수동으로 IP와 경로를 추가하세요.

#ip netns exec sample_ns ip addr add $your_ip/24 dev mv1
#ip netns exec sample_ns ip route add default via $your_gateway dev mv1

새 네임스페이스에 필요한 연결이 있는지 테스트합니다. 핑이 성공했는지(fping이 설치되었는지) 확인하기 위해 fping을 사용한다는 점에 유의하세요.

ip netns exec sample_ns sudo fping 1.1.1.1 &>/dev/null && echo "Internet connectivity okay"
ip netns exec sample_ns sudo fping 1.1.1.1 &>/dev/null || echo "No internet"
ip netns exec sample_ns sudo fping google.com &>/dev/null || echo "No DNS service"

이제 새 네트워크 네임스페이스에서 xserver에 액세스할 수 있도록 설정하세요. 이는 새 네임스페이스에서 프로그램을 열 수 없는 경우에만 필요합니다.
기본 네임스페이스에서:

sudo -u $USER xhost +local:$USER
ip netns exec sample_ns bash export DISPLAY=:0

그러면 DISPLAY 환경 변수가 내보내집니다. 예를 들어 :1 또는 :99와 같이 다를 수 있습니다. 다음 명령을 사용하여 기본 네임스페이스를 확인할 수 있습니다.

echo $DISPLAY

이제 새 네임스페이스에서 일부 프로그램을 실행하세요.

 sudo ip netns exec sample_ns sudo -u $USER bash
 /usr/bin/chromium-browser %U

또는 이 작업을 즉시 수행하려는 경우:

sudo ip netns exec sample_ns sudo -u $USER /usr/bin/chromium-browser %U

이 새 네임스페이스에서 열린 bash를 계속 사용하려면 다음과 같이 명령 끝에 &를 추가하여 이 상위 bash와 독립적으로 만들 수 있습니다.

 /usr/bin/chromium-browser %U &

이렇게 하면 CTRL+C를 누르면 프로그램이 계속 실행되지만 bash를 다시 시작하여 다른 프로그램을 실행할 수 있습니다. 또는 여러 터미널을 열 수도 있습니다.

문제 해결:
#전달 활성화

 sysctl -w net.ipv4.ip_forward=1

#ns에서 스냅 패키지에 액세스하고 ns에서 실행: ("오류: 추적 cgroup을 찾을 수 없음")

sudo mount -t cgroup2 cgroup2 /sys/fs/cgroup
sudo mount -t securityfs securityfs /sys/kernel/security/

다른 출처:
네트워크 네임스페이스에서 OpenVPN을 실행해 보세요.
리눅스 네임스페이스, 네트워크 네임스페이스에서 인터넷에 연결하는 방법은 무엇입니까?
Unix 프로그램을 특정 네트워크 인터페이스에 바인딩
https://networkstatic.net/configuring-macvlan-ipvlan-linux-networking/

답변2

여기에 다리를 건설할 필요는 없을 것 같아요. 라우팅 만 있으면됩니다.

저 할 수 있어요제거하다다음은 (enp0s3이 이미 시작되었다고 가정합니다):

#Create a new bridge and change its state to up:
ip link add name bridge_name type bridge
#To add an interface (e.g. eth0) into the bridge, its state must be up:
ip link set enp0s3 up
#Adding the interface into the bridge is done by setting its master to bridge_name:
ip link set enp0s3 master bridge_name
ip link set virt_out master bridge_name
#To show the existing bridges and associated interfaces, use the bridge utility (also part of iproute2). See bridge(8) for details.
bridge link

나는 바꿀 것이다:

ip netns exec sample_ns ip route add default via 10.0.3.2 dev virt_in

도착하다:

ip netns exec sample_ns ip route add default via 10.0.3.1 dev virt_in

이렇게 하면 새 네트워크 네임스페이스가 로컬 LAN 10.0.2.0/24와 통신할 수 있지만(예: 서비스 공급자 라우터에 대한 핑) 현재 인터넷 액세스가 작동하지 않을 수 있습니다. "ip Route show", "ip Route Show Table All", "ip Rule Show", "iptables-save", "cat /etc/resolv.conf" 및 기타 명령의 출력을 기본 네임스페이스에 제공해야 합니다. 그리고 새로운 네트워크 네임스페이스 bash 세션의 "cat /etc/resolv.conf"입니다. 이러한 출력에는 민감한 정보가 없다고 가정됩니다.

관련 정보