br0VPN 없이 설정 중

br0VPN 없이 설정 중

게스트(Windows 또는 Linux)의 모든 트래픽이 호스트(Linux)의 VPN을 통과하도록 강제하려고 합니다. 게스트가 VPN 외부의 인터넷에 액세스할 수 없도록 하기 위해 호스트 시스템에 연결을 설정하고 새 인터페이스를 생성합니다 tun0. VPN 터널은 호스트에서 제대로 작동합니다.

br0VPN 없이 설정 중

게스트에서 VPN 없이 인터넷을 이용하려면 브리지 장치를 만들어 br0연결합니다 enp7s0. 이렇게 하면 게스트에서 인터넷이 작동합니다.

ip link add name br0 type bridge
ip link set br0 up
ip link set enp7s0 master br0

호스트에 vnet5장치가 추가되어 에 브리지되었습니다 br0. 그러나 동시에 호스트에서 원격지로의 ping은 더 이상 작동하지 않습니다.

## On the Host
sudo ip a
# ...
# 14: vnet5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
# link/ether ab:ab:ab:ab:ab:ab brd ff:ff:ff:ff:ff:ff
# inet6 fe80::fc54:ff:fe92:5aa9/64 scope link
# valid_lft forever preferred_lft forever
ping www.google.com
# ping: www.google.com: Temporary failure in name resolution
ping 8.8.8.8
# From 192.168.1.100 icmp_seq=1 Destination Host Unreachable

그런 다음 VM을 시작 virt-manager하고 연결을 확인합니다. 게스트는 인터넷을 사용할 수 있습니다:

## On the Guest
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
# ...
# 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
#     link/ether 52:54:00:92:5a:a9 brd ff:ff:ff:ff:ff:ff
#     inet 192.168.1.221/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0
#        valid_lft 67432sec preferred_lft 67432sec
ping www.google.ch
# PING www.google.ch (172.217.168.35) 56(84) bytes of data.
# 64 bytes from zrh04s14-in-f3.1e100.net (172.217.168.35): icmp_seq=1 ttl=117 time=2.47 ms

설정하는 대신 및 ip link set enp7s0 master br0사이에 라우팅 규칙을 만들 수도 있을 것 같습니다 .br0enp7s0

VPN 및 tun0인터페이스 사용

VPN 연결을 설정하면 tun0브리지에 할당할 수 없는 인터페이스가 생성됩니다. 따라서 어쨌든 라우팅 규칙을 만들어야 합니다. 그래서 상황은 위의 경우와 비슷하다고 생각합니다. 먼저 enp7s0에서 다시 제거합니다 br0.

ip link set enp7s0 nomaster
sudo openvpn my_vpn_tcp.ovpn
# ...
# Initialization Sequence Completed
sudo ip a
# ...
# 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
# link/ether ab:ab:ab:ab:ab:ab brd ff:ff:ff:ff:ff:ff permaddr ab:ab:ab:ab:ab:ab
# inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute enp7s0
# valid_lft 82702sec preferred_lft 82702sec
# ...
# 10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
# link/none
# inet 10.7.7.5/24 scope global tun0
# valid_lft forever preferred_lft forever
# ...
# 12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
# link/ether 72:eb:06:e5:1e:5a brd ff:ff:ff:ff:ff:ff
# inet6 fe80::70eb:6ff:fee5:1e5a/64 scope link
# valid_lft forever preferred_lft forever

추가 작업 없이 호스트에서 VPN 연결이 사용되며 이는 괜찮습니다.

ping www.google.com
# PING www.google.com (172.217.168.3) 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=1 ttl=117 time=9.64 ms
# ...
ping www.google.com -I tun0
# PING www.google.com (172.217.168.3) from 10.7.7.5 tun0: 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=2 ttl=117 time=10.0 ms
# ...
ping www.google.com -I enp7s0
# PING www.google.com (172.217.168.3) from 192.168.1.100 enp7s0: 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=1 ttl=115 time=4.59 ms
# ...

하지만 이미 말했듯 tun0br0. 그 때문에 게스트도 인터넷을 사용할 수 없습니다.

sudo ip link set tun0 master br0
# RTNETLINK answers: Invalid argument

솔루션을 검색했지만 제대로 된 것을 찾을 수 없거나 제 경우가 약간 다르기 때문에 제가 가지고 있지 않은 네트워킹에 대한 더 많은 통찰력이 필요합니다. 예:이것(작업을 수행하지 않은) 또는이것(내 경우에는 정확히 맞지 않습니다).

답변1

같은 질문에 두 가지 질문이 있으며 실제로는 서로 의존하지 않습니다. 나는 여전히 두 가지 모두에 대답할 것이다.

또한 noprefixroute주소 옵션은 네트워크 구성의 일부가 경로를 추가하기 위해 일부 추가 도구(예: NetworkManager)에 의해 관리된다는 것을 암시합니다. 이 답변은 네트워킹 도구의 통합을 다루려고 시도하지 않습니다. 여기에는 적절하게 재구성되지 않을 경우 나중에 변경 사항을 무시할 수 있는 DHCP 구성 처리가 포함됩니다. 인터페이스가 다운되거나 삭제되면 많은 설정이 사라지고 다시 수행해야 하므로 이를 담당하는 다양한 네트워크 도구의 다양한 후크에서 수행하는 것이 가장 좋습니다.

br0VPN 없이 설정 중

브리지 포트로 설정된 인터페이스는 라우팅에 참여할 수 없습니다.

브리지 포트로 설정되면 인터페이스와 연결된 경로가 무시됩니다. 주소를 남길 때 여전히 해로운 부작용이 있을 수 있습니다. 자세한 내용은 블로그에서 확인하실 수 있습니다Linux 브리지의 적절한 격리:

  1. 특정 장치에 프레임을 넘겨줍니다.핸들러 수신, 만약에 어떠한,
  2. 프레임을 전역 또는 특정 장치에 넘겨줍니다.프로토콜 핸들러(예: IPv4, ARP, IPv6).

브리지 인터페이스의 경우커널이 장치별 수신 핸들러를 구성했습니다.br_handle_frame() . 이 기능은 STP 및 LLDP 프레임을 제외하고 또는 "브라우팅"이 활성화된 경우 수신 인터페이스의 컨텍스트에서 추가 처리를 허용하지 않습니다. 그러므로,그만큼 프로토콜 핸들러는 실행되지 않습니다.이 경우.

브리지 포트가 된 인터페이스에 설정된 IP 주소는 br0라우팅에 참여할 수 있는 유일한 브리지인 특수 브리지의 자체 인터페이스( : 브리지 자체)로 이동해야 합니다(다른 옵션도 있지만 간단하게 유지하겠습니다). 관련 노선도 마찬가지다.

OP의 기본 게이트웨이가 192.168.1.1/24라고 가정해 보겠습니다. 첫 번째 경우에 대해 이것을 다시 작성해 보겠습니다.

ip link add name br0 up type bridge
ip link set dev enp7s0 master br0

ip address flush dev enp7s0
# previous command will also have removed all associated routes as a side effect
ip address add 192.168.1.100/24 dev br0
# previous command added the LAN route too as a side effect (no noprefixroute here)
ip route add default via 192.168.1.1

이를 통해 호스트와 VM 모두 인터넷에 액세스할 수 있습니다.

VM 부분의 경우 vnet5브리지 포트이기도 하며 라우팅에 참여하지 않습니다. 호스트는 VM과 라우터(192.168.1.1) 사이에서 프레임을 전환할 뿐입니다. 라우팅은 포함되지 않습니다.

VPN 및 tun0인터페이스 사용

OpenVPN은 TUN/TAP 드라이버(Linux의 커널 모듈에서 제공)를 사용합니다.tun). 운전자는 다음을 제공할 수 있습니다.

  • 레이어 2 TAP 인터페이스

    이는 이더넷 장치처럼 작동하며 vnet5VM 하이퍼바이저에 의해 생성되는 이더넷 브리지 포트로 설정될 수 있습니다.

  • 또는 레이어 3 TUN 인터페이스

    프레임 정보(이더넷 MAC 주소)를 포함하거나 프레임을 처리하지 않지만 레이어 3 이상의 프로토콜인 IPv4 또는 IPv6만 처리합니다. 따라서 이더넷 브리지 포트로 설정할 수 없습니다. 이는 tun0TUN 모드에서 OpenVPN에 의해 ​​생성된 OP입니다.

OpenVPN은 브리지할 수 있는 TAP 모드도 사용할 수 있지만 이를 위해서는 원격 구성을 재구성해야 합니다.섬기는 사람측면과 모든 네트워크 레이아웃: 원격 서버도 192.168.1.0/24 LAN의 일부가 됩니다. OP는 그것을 통제할 수 없는 것 같습니다.

따라서 OP의 TUN 인터페이스로 수행할 수 있는 작업을 고려해 보겠습니다. 이는 계층 2가 아닌 계층 3(라우팅)에서 수행됩니다.

신뢰할 수 있는 VM에 대해서만 이전 설정 재사용

호스트에 방화벽 제한 및/또는 브리지 경로 변경을 포함하여 고급 방화벽 기능이 포함되어 있지 않으면 VM이 자신을 게이트웨이로 사용하도록 강제할 수 없습니다. 이전과 같이 브리지된 VM은 단순히 호스트를 무시하고 192.168.1.1을 유지할 수 있습니다. 게이트웨이로 사용하고 트래픽이 tun0결국 호스트의 인터페이스를 사용하지 않도록 합니다.

VM을 신뢰할 수 있고 재구성할 수 있는 경우 br0위와 같이 유지하고 OpenVPN 설정을 기반으로 적용하고 br0( enp7s0참조는 로 대체 br0) VM이 실행되고(주소 192.168.1.221) VPN이 작동되면 이 작업을 수행할 수 있습니다.

  • 호스트에서

    사용정책/소스 기반 라우팅이 특정 소스에 대해 다른 경로 결과를 선택하려면 다음을 수행하세요.

    ip rule add from 192.168.1.221 lookup 1000
    ip rule add iif tun0 lookup 1000
    ip route add 192.168.1.0/24 dev br0 table 1000
    ip route add default dev tun0 table 1000
    

    라우터로 설정:

    sysctl -w net.ipv4.ip_forward=1
    

그리고 유사한 NAT 규칙이 이미 이 경우를 처리하지 않는 경우:

  iptables -t nat -A POSTROUTING -s 192.168.1.221 -o tun0 -j MASQUERADE
  • (Linux) VM에서는 호스트 라우터 대신 호스트를 게이트웨이로 사용합니다.

    ip route flush to default
    ip route add default via 192.168.1.100
    

신뢰할 수 없는 VM에 권장: 호스트 기본 인터페이스를 브리지 포트로 설정하지 마세요.

tun0이렇게 하면 VM이 조작해서는 안 되는 네트워크 부분을 볼 수 없기 때문에 VM의 트래픽을 더 쉽게 적용할 수 있습니다 .

  • 자체 IP 네트워크를 사용하도록 VM 설정 변경

    예: 192.168.100.0/24 및 고정 IP 192.168.100.2/24(호스트 네트워크 DHCP 대신), 기본 게이트웨이 192.168.100.1. Linux VM의 경우:

    ip address add 192.168.100.2/24 dev enp1s0
    ip route add default via 192.168.100.1
    
  • 호스트에서 초기 구성부터 시작합니다(브리징 없음 enp7s0).

    아래의 제로 브리지를 사용하여 수행할 수도 있지만(즉, 브리지 포트로 설정하지 ip address add 192.168.100.1/24 dev vnet5않고 직접 vnet5)libvirt이것을 더 어렵게 만들 수도 있습니다.

    VM 전용 브리지만 있으면 됩니다(여기서는 일반적으로 주소 192.168.100.1/24 사용).libvirt192.168.122.1/24의 기본 브리지를 제공합니다 virbr0.

    ip link add name br0 up type bridge
    ip address add 192.168.100.1/24 dev br0
    ip link set dev vnet5 master br0
    

    그리고 또한 사용정책 라우팅관련된 두 인터페이스의 VM과 관련된 트래픽 동작을 변경합니다 br0. tun0평소와 같이 대체 라우팅 테이블에서 기존 경로를 몇 가지 복제하고 변경하는 작업이 포함됩니다. 여기서는 tun0호스트와 해당 VM만 서비스한다고 가정합니다. 최종 목표는 VM 측에서 오는 모든 것이 tun 측으로 라우팅되고, TUN 측에서 오는 모든 것이 필요하지 않은 측을 무시하고 VM 측으로 라우팅되는 것입니다.

    ip rule add iif br0 lookup 2000
    ip rule add iif tun0 lookup 2000
    ip route add 192.168.100.0/24 dev br0 table 2000
    ip route add default dev tun0 table 2000 # layer 3 interfaces don't need a gateway
    

    tun0참고: 호스트(예: 라우팅되지 않음)를 대상으로 하는 수신 패킷 은 이미현지의라우팅 테이블이 필요하며 테이블 2000에는 추가 경로가 필요하지 않습니다.

    라우터로 설정:

    sysctl -w net.ipv4.ip_forward=1
    

    그런 다음 원격 OpenVPN 서버가 192.168.100.0/24에 대해 알지 못하므로 NAT를 완료합니다.

    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun0 -j MASQUERADE
    

VM이 여전히 192.168.1.0/24 LAN에 연결할 수 있어야 하는 경우:

  • 이를 수용하기 위해 테이블 ​​2000을 다시 업데이트하십시오.

    기본 테이블에서 테이블 2000으로 LAN 경로를 복제합니다.

    ip route add 192.168.1.0/24 dev enp7s0 table 2000
    
  • 그리고 적절한 MASQUERADE 규칙을 다시 추가하세요.

    ... 이제 VM은 다른 시스템이 알지 못하는 다른 LAN에 있으므로:

    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp7s0 -j MASQUERADE
    

    (일부 iptables 규칙 인수분해가 수행될 수 있습니다).

관련 정보