VPN 터널 외부의 cgroup에서 트래픽 라우팅

VPN 터널 외부의 cgroup에서 트래픽 라우팅

일부 트래픽은 VPN을 통과하도록 하고 다른 트래픽은 VPN을 통과하지 않도록 하려고 합니다.

특정 fwmark가 있는 패킷은 기본 인터페이스( wlo1)로 이동하고 기타 모든 트래픽은 tun0기본 테이블의 터널 인터페이스( OpenVPN 사용)로 이동해야 합니다. nftables에 이 규칙을 추가했습니다.

table ip test {
    chain test {
        type route hook output priority mangle; policy accept;
        meta cgroup 1234 meta mark set 1
    }
}

기본 라우팅 테이블에는 다음 항목이 있습니다.

default via 10.11.0.1 dev tun0 
10.11.0.0/16 dev tun0 proto kernel scope link src 10.11.0.20 
[WANIP.0]/24 dev wlo1 proto kernel scope link src [WANIP] 
128.0.0.0/1 via 10.11.0.1 dev tun0 
[VPNIP] via [WANGATEWAY] dev wlo1

fwmark가 있는 패킷은 1대신 자체 라우팅 테이블로 연결됩니다 ip rule add from all fwmark 1 lookup test. 표 에 test다음 경로를 추가했습니다.

default via [WANGATEWAY] dev wlo1

이 cgroup에서 실행하면 ping 8.8.8.8멈춥니다. 보낼 수는 있지만 패킷을 받을 수는 없는 것 같습니다.

VPN 트래픽이 예상대로 작동합니다.

정확히 무슨 일이 일어나고 있는 걸까요?

답변1

패킷이 방출되면 라우팅 결정이 내려집니다. 이 결정은 나가는 인터페이스를 선택합니다.그리고사용할 일치하는 소스 IP 주소입니다.

경로/출력체인이 표시를 설정하면경로 재지정 확인, 이것에서 볼 수 있듯이개략도(이것은iptables염두에 두고 있지만 완전히 사용할 수 있습니다.nftables). 재라우팅 확인은 경로를 변경하지만 소스 IP 주소는 변경하지 않습니다. 그래서 더 많은 일을 해야 합니다.

  • 소스 IP 주소를 변경하려면 NAT 규칙을 추가하세요.

이건 꼭 해야 해~ 후에경로 재지정 확인이 끝났습니다.nat/포스트라우팅. 동일한 테이블이 다른 체인 유형을 가질 수 있다는 점에 유의하십시오.iptables여기서 테이블 <=> 유형).

    nft add chain ip test testnat '{ type nat hook postrouting priority srcnat; policy accept; }'
    nft add rule ip test testnat meta mark 1 masquerade

이제 올바른 패킷이 실제로 떠납니다.

  • 기본 경로를 통해 도착하지 않더라도 응답 흐름이 허용되도록 허용합니다.
  1. 휴식을 취하거나역방향 경로 전달변경하여 느슨한 모드로rp_filter:

        sysctl -w net.ipv4.conf.wlo1.rp_filter=2
    
  2. 또는 나가는 흐름과 동일한 라우팅 테이블을 사용하도록 응답 흐름을 표시합니다. 실제로 보안이 향상되지는 않지만 어쨌든 다음과 같습니다.

        nft add chain ip test testpre '{ type filter hook prerouting priority mangle; policy accept; }'
        nft add rule ip test testpre iif "wlo1" meta mark set 1
    

아아, 이것은 새로운 이후로 필요한 또 다른 조정 없이는 작동하지 않습니다.문서화되지 않은 기능2010년에 등장:

        sysctl -w net.ipv4.conf.wlo1.src_valid_mark=1

노트:

  • conntrack's에 마크를 저장하면 보안 측면에서 더 나은 결과를 얻을 수 있습니다.콘마크( ct mark) 올바른 응답 흐름만 허용하고 엄격한 역방향 경로 전달을 우회하는 다른 어떤 것도 허용하지 않습니다. 엄격 모드에서는 아무것도 도달하지 않습니다.wlo1나가는 트래픽의 응답이 아닌 한 더 이상. 이에 해당하는 전체 nftables 규칙 파일은 다음과 같습니다(nftables 규칙을 대체하는 동안 위의 옵션 2와 함께 사용됨).

      table ip test {
              chain test {
                      type route hook output priority mangle; policy accept;
                      meta cgroup 1234 meta mark set 1 ct mark set meta mark
              }
    
              chain testnat {
                      type nat hook postrouting priority srcnat; policy accept;
                      meta mark 1 masquerade
              }
    
              chain testpre {
                      type filter hook prerouting priority mangle; policy accept;
                      ct mark 1 meta mark set ct mark
              }
      }
    
  • 또한 마크 재라우팅 확인은 경우에 따라 올바른 PMTU/TCP MSS를 방해할 수 있습니다.범위기입:https://kernelnewbies.org/Linux_4.10#네트워킹

  • 대신 cgroups 사용을 제한된 uid 세트로 변환할 수 있는 경우 ip rule add ... uidrange ...위에 설명된 대로 netfilter나 nftables 없이 라우팅 스택만 사용하여 이 작업을 올바르게 수행할 수 있습니다. 그것에 대한 내 대답을 참조하십시오.특정 인터페이스(tum1)를 통해 사용자에 대한 트래픽 라우팅.

관련 정보