라우팅 테이블 트래픽 표시를 위한 IPTable mangle 규칙

라우팅 테이블 트래픽 표시를 위한 IPTable mangle 규칙

Ubuntu Server 16.04를 사용하여 VPN 라우터를 설정하려고 합니다.

트래픽이 누출되지 않거나 VPN이 다운되더라도 종료될 수 없도록 라우터를 안전하게 구성했습니다.

라우터에는 인터넷 연결을 위해 무선 네트워크에 연결하는 무선 인터페이스(wlp2s0)와 랩톱을 연결하는 이더넷 인터페이스(enp1s0)가 있습니다.

이상적으로는 openvpn이 부팅 시 실행되고 wlp2s0을 사용하여 tun0 인터페이스를 생성한 다음 일부 iptable 규칙이 enp1s0 트래픽을 tun0으로 전달합니다.

트래픽 누출을 방지하려는 목표를 달성하기 위해 모든 경로를 플러시한 다음 wlp2s0의 로컬 서브넷 경로를 MAIN 테이블에 추가하는 시작 스크립트를 만들었습니다. 또한 테이블 100에 대한 기본 경로 wlp2s0을 추가합니다.

openvpn 트래픽을 표시하기 위해 iptables mangle 규칙을 추가한 다음 표시된 트래픽이 테이블 100을 사용하도록 fw 규칙을 추가했습니다.

그래서 기본적으로 저는 openvpn 트래픽이 무선 기본 경로(표 100)를 사용하여 터널을 생성할 수 있기를 원합니다. 다른 모든 트래픽은 로컬이거나 터널을 통과합니다.

내 시작 스크립트는 제대로 작동하며 시작 시 올바른 경로를 생성합니다. 내 iptable 규칙과 fw 규칙도 올바른 것 같습니다.

문제는 openvpn 트래픽이 iptables mangle 규칙을 준수하지 않는 것 같다는 것입니다.

openvpn 트래픽을 표시하는 iptable 규칙.

iptables -t mangle -A OUTPUT -p tcp --dport 501 -j MARK --set-mark 2

스크립트를 시작합니다.

ip route add table 100 default via 192.168.0.1 dev wlp2s0
ip rule add fwmark 0x2 table 100
ip route flush table main
ip route add 192.168.0.0/24 dev wlp2s0

대부분의 사람들이 요구하는 다양한 명령의 출력

administrator@ubuntu-svr:~$ sudo iptables -t mangle -L -v
Chain PREROUTING (policy ACCEPT 6153 packets, 1859K bytes)
 pkts bytes target     prot opt in     out     source               destination                  

Chain INPUT (policy ACCEPT 1961 packets, 297K bytes)
 pkts bytes target     prot opt in     out     source               destination       

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 1348 packets, 128K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:501 MARK set 0x2                  

Chain POSTROUTING (policy ACCEPT 1348 packets, 128K bytes)
 pkts bytes target     prot opt in     out     source               destination         

administrator@ubuntu-svr:~$ ip rule
0:  from all lookup local 
32765:  from all fwmark 0x2 lookup 100 
32766:  from all lookup main 
32767:  from all lookup default 

administrator@ubuntu-svr:~$ ip route show table main
192.168.0.0/24 dev wlp2s0  scope link 

administrator@ubuntu-svr:~$ ip route show table 100
default via 192.168.0.1 dev wlp2s0 

administrator@ubuntu-svr:~$ ip route get 8.8.8.8 mark 0x2
8.8.8.8 via 192.168.0.1 dev wlp2s0  src 192.168.0.209  mark 2

따라서 위 출력에서 ​​올바른 라우팅, iptable mangle 규칙 및 fw 규칙이 모두 제자리에 있음을 확인할 수 있습니다.

"ip Route get" get 명령을 실행하면 태그가 지정된 트래픽에 대해 올바른 경로가 선택되었음을 확인할 수 있습니다.

그러나 iptables mangle 규칙은 영향을 받지 않습니다. "telnet 8.8.8.8 501"을 실행했지만 규칙이 여전히 적용되지 않았습니다! 이는 트래픽이 로컬에서 생성되어 TCP 501에 도달하더라도 규칙과 일치해야 합니다.

openvpn 트래픽은 라우터 자체에서 생성됩니다. iptables 매뉴얼 페이지에 따르면 mangle의 OUTPUT 체인은 로컬에서 생성된 트래픽에 대한 PREROUTE 결정을 수정하는 데 사용됩니다.

나는 여기서 완전히 헤매고 있습니다. 비슷한 문제가 있는 다른 사람들의 게시물을 읽었지만 해결책을 찾을 수 없는 것 같습니다.

답변1

문제는 기본 경로가 테이블에 없다는 것입니다 main. 이는 검사 시 감지할 수 없습니다. ip route get ... mark ...왜냐하면 직접 통과된 "솔루션"이 전체 경로를 단락시키기 때문입니다.

기본 경로가 없기 때문에 패킷이 맹글 OUTPUT 체인에 도달하기 전에 "Network Unreachable"로 인해 8.8.8.8에 대한 경로 조회가 실패합니다.

다음에 추가어느테이블의 기본 경로 main(유효한 구문이라면 존재하지 않는 라우터를 사용하더라도)는 예상되는 흐름을 허용합니다.

  • 패킷 생성,
  • 처음으로 경로 ip rule가 존재한다고 생각하고 테이블에서 확인하면,
  • 맹글 OUTPUT 체인을 탐색하고 태그를 상속하며,
  • 경로 변경(체크인 경로 변경일반 네트워크의 Netfilter 및 패킷 흐름), 따라서 테이블에서 두 번째 조회가 트리거됩니다 ip rule.
  • 테이블 100에 대한 초기 조회를 수행하고 최종 경로 " via 192.168.0.1 dev wlp2s0"를 얻습니다.

따라서 LAN에서 IP를 선택하십시오.어떤 호스트에도 속하지 않습니다., 192.168.0.250을 가정하고 이를 스크립트에 추가하면 다음이 제공됩니다.

ip route add table 100 default via 192.168.0.1 dev wlp2s0
ip rule add fwmark 0x2 table 100
ip route flush table main
ip route add 192.168.0.0/24 dev wlp2s0
ip route add default via 192.168.0.250 dev wlp2s0

질문에서 수행된 테스트를 해결합니다.

  • 대상 TCP 포트 501에 설정되지 않은 연결은 192.168.0.250에 대한 ARP 요청을 트리거하며, 3초 후에 "호스트에 대한 경로 없음"("네트워크 연결 불가" 대신) 메시지와 함께 시간 초과되어야 합니다.
  • 대상 TCP 포트 501에 설정된 모든 연결은 (ARP 요청을 구문 분석하고) 192.168.0.1을 통과합니다.

관련 정보