일부 트래픽은 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여기서 table<=> 유형).
nft add chain ip test testnat '{ type nat hook postrouting priority srcnat; policy accept; }'
nft add rule ip test testnat meta mark 1 masquerade
이제 올바른 패킷이 떠납니다.
- 기본 경로를 통해 도착하지 않더라도 응답 스트림이 허용되도록 허용합니다.
넌 긴장을 풀 수 있어역방향 경로 전달느슨한 모드로 변경하여
rp_filter
:sysctl -w net.ipv4.conf.wlo1.rp_filter=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에 태그를 저장하면 보안 측면에서 더 나은 결과를 얻을 수 있습니다.코맥(
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 } }
게다가 내 말에 따르면udd 범위입구:https://kernelnewbies.org/Linux_4.10#네트워킹
cgroups 사용을 제한된 uid 세트로 변환할 수 있는 경우
ip rule add ... uidrange ...
위에서 설명한 대로 라우팅 스택(netfilter 또는 nftables 없이)만 사용하여 올바르게 수행할 수 있습니다. 이에 대한 내 답변을 참조하십시오.특정 인터페이스(tum1)를 통해 사용자 트래픽 라우팅.