Linux에서 모든 트래픽이 하나의 인터페이스를 통과하도록 만드는 방법

Linux에서 모든 트래픽이 하나의 인터페이스를 통과하도록 만드는 방법

나는자체 작성 인터페이스 tun0(턴/탭를 기준으로) 수신한 내용을 출력합니다.
이 인터페이스를 통해 흐르려면 시스템의 모든 트래픽이 필요합니다.
이 인터페이스의 기능은 다음과 같습니다.

  1. 잠재적으로 검열된 패킷을 식별하고 터널링합니다.
  2. 다른 모든 차량은 방해받지 않고 통과하십시오.

짐작하실 수 있듯이 저는 검열 방지 도구를 구축하려고 합니다.
터널에 대한 결정은 tun0 프로세스 내에서 이루어져야 합니다.
왜냐하면 그곳에서만 신뢰할 수 있는 DNS를 사용할 수 있기 때문입니다.

자체 작성된 인터페이스 tun0을 통해 모든 트래픽 흐름을 만드는 방법을 알려주려면 귀하의 도움이 필요합니다. tun0을 변경해야 하는 경우 해당 변경 사항을 제공하도록 요청합니다.

다음은 tun0을 통해 모든 트래픽을 가져오려고 시도했지만 실패(핑 실패)한 방법입니다.

엮다

  1. gcc tun0.c
  2. sudo ./a.out

구성

  1. sudo ip addr add 10.0.0.1/24 dev tun0
  2. John 테이블 생성

    $ cat /etc/iproute2/rt_tables 
    #
    # reserved values
    #
    255     local
    254     main
    253     default
    0       unspec
    #
    # local
    #
    #1      inr.ruhep
    
    200 John
    

순서가 중요합니다:

  1. sudo ip rule add from all lookup John
  2. sudo ip route add default dev tun0 table John
  3. sudo ip rule add iif tun0 lookup main priority 500

    $ ip rule
    0:      from all lookup local 
    500:    from all iif tun0 lookup main 
    32765:  from all lookup John 
    32766:  from all lookup main 
    35000:  from all lookup default 
    

문제 해결

  1. sudo tcpdump -i wlp2s0 -qtln icmp그러면 ping -I tun0 8.8.8.8패킷이 캡처되지 않았음을 알 수 있습니다. 이는 규칙을 통해 tun0에서 wlp2s0으로 패킷이 전송되지 않았음을 의미합니다 iif tun0 lookup main.

  2. tun0모든 곳 에서 교체하면 lo저에게 효과적입니다 .

또한 시도

  1. 역방향 경로 필터링을 끄십시오 rp_filter=0./etc/sysctl.conf

문제 해결

iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD " 
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT " 
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING " 
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog

답변의 수정된 소스는 다음과 같습니다.여기.

답변1

따라서 구성에서 네트워크로 보내려는 모든 패킷은 원래부터 시작됩니다 ( 인터페이스를 10.0.0.1통과하고 로컬 주소가 이기 때문 입니다 ). 패킷을 캡처했는데 지금까지는 훌륭했습니다. 이제 패킷을 더 보내십시오.tun010.0.0.1
tun0소스 주소10.0.0.1, 패킷이 다른 인터페이스를 통해 나가기를 원합니다( wlp2s0귀하의 경우). 그건라우팅먼저 라우팅을 활성화해 보겠습니다.

sysctl -w net.ipv4.ip_forward=1

나중에 살펴보면 패킷에 wlan 인터페이스의 소스 주소가 아닌 소스 주소가 있음을 알 수 있습니다 tcpdump( 예상했던 것 같습니다). 따라서 소스 주소를 변경해야 합니다.wlp2s010.0.0.1소스 NAT. Linux에서는 다음 명령을 사용하면 쉽습니다.네트워크 필터/iptables:

iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.1 -j MASQUERADE

또한 FORWARD체인에 정책이 있는지 확인하세요 ACCEPT. 그렇지 않으면 다음을 수행해야 합니다.전달 허용다음과 같은 것 :

iptables -A FORWARD -i tun0 -o wlp2s0 -s 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i wlp2s0 -o tun0 -d 10.0.0.1 -j ACCEPT

이제 모든 것이 잘 작동할 것입니다.리눅스 커널라우팅을 위해 패킷을 tun0인터페이스 에서 wlp2s0.웹 필터소스 IP는 인터페이스에서 나가는 패킷의 할당된 주소 10.0.0.1로 변경되어야 합니다. wlp2s0이는 모든 연결을 기억하고 응답 패킷이 돌아올 때(있는 경우) wlp2s0인터페이스에서 할당된 주소의 대상 주소를 변경합니다 10.0.0.1("conntrack" 기능).
글쎄요, 그래야 하는데 그렇지 않습니다. 것 같다,웹 필터OUTPUT사람들은 이 복잡한 라우팅 구성과 동일한 패킷이 먼저 체인을 통과한 다음 라우팅되어 체인에 도달한다는 사실로 인해 혼란스러워합니다 PREROUTING. 적어도 Debian 8 상자에서는 작동하지 않습니다.
문제를 해결하는 가장 좋은 방법웹 필터그 특성은 다음과 같습니다 TRACE.

modprobe ipt_LOG
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

ICMP 패킷 추적만 활성화했습니다. 다른 필터를 사용하여 디버깅할 수 있습니다.
패킷이 통과하는 테이블과 체인이 표시됩니다. 패킷이 체인을 통해 더 이상 이동하지 않는다는 것을 알 수 있습니다 ( 실제로 패킷을 캡처하는 체인에 의해 캡처 FORWARD되지 않습니다 ). 이 작업을 수행하는 몇 가지 방법은 다음과 같습니다.nat/POSTROUTINGSNAT

방법 1

혼란을 해결하는 가장 좋은 방법웹 필터즉, 애플리케이션에서 메시지의 소스 IP 주소를 변경하는 것입니다 tun0.c. 이는 가장 자연스러운 방법이기도 합니다. 우리는해야합니다10.0.0.1을 10.0.0.2로 변경나가는 길과10.0.0.2~10.0.0.1돌아 오는 길에. 소스 주소 변경 코드로 수정했습니다
.tun0.c새 파일입니다.그리고패치 파일입니다당신을 위한 tun0.c. IP 헤더 변경에는 다음도 포함됩니다.체크섬 수정, 그래서 다음에서 코드를 가져왔습니다.OpenVPN 프로젝트. 다음은 클린 재부팅 및 부팅 후에 실행한 명령의 전체 목록입니다 tun0_changeip.c.

ifconfig tun0 inet 10.0.0.1/30 up
sysctl -w net.ipv4.ip_forward=1
ip route add default dev tun0 table John
ip rule add from all lookup John
ip rule add from 10.0.0.2 lookup main priority 500
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.2 -j MASQUERADE

닫을 필요는 없습니다.역방향 경로 필터링이 경우 모든 것이 합법적이므로 tun0해당 서브넷에 속한 패킷만 수신 및 전송됩니다. 인터페이스 기반 라우팅 대신 소스 기반 라우팅을 수행할 수도 있습니다.

방법 #2

이는 SNAT패킷이 인터페이스에 도달하기 전에 수행 될 수 있습니다 . tun0그러나 그것은 옳지 않습니다. 꼭 닫아야 해역방향 경로 필터링이 경우:

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

이제 다음을 수행하십시오 SNAT. iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source ip.address.of.your.wlan.interface

여기서는 소스 주소를 변경합니다.앞으로패킷이 tun0장치에 도착합니다. tun0.c코드는 이러한 패킷을 "있는 그대로"(변경된 소스 주소로) 재전송하고 WLAN 인터페이스를 통해 성공적으로 라우팅됩니다. 그러나 wlan 인터페이스에 동적 IP가 있고 이를 사용하려고 할 수 있습니다 MASQUERADE(인터페이스 주소를 명시적으로 지정하지 않기 위해). 사용할 수 있는 방법은 다음과 같습니다 MASQUERADE.

iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source 10.0.55.1
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.55.1 -j MASQUERADE

" " IP 주소를 참고하십시오 10.0.55.1. 이는 다릅니다. 여기서는 어떤 IP든 사용할 수 있습니다. 상관없습니다. 이전에 소스 IP를 변경했다면 패킷이 nat/POSTROUTING인터페이스의 체인에 도달했을 것입니다. wlp2s0이제 WLAN 인터페이스의 고정 IP에 의존하지 않습니다.

방법 #3

을 사용할 수도 있습니다 fwmark. 이 방법은 필요하지 않지만 SNAT나가는 패킷만 캡처합니다.
먼저 비활성화해야 합니다.역방향 경로 필터링tun0다른 네트워크에 속한 패킷을 전달하기 때문에 :

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

Now let's alter the routing rules a bit:
# Delete old rules
ip rule del iif tun0 lookup main
ip rule del from all lookup John

# Packets will start going from wlan interface so they will have source address of it
iptables -t mangle -A OUTPUT -o wlp2s0 -j MARK --set-mark 1
ip rule add fwmark 0x1 lookup John

이것은 또 다른 "해커"입니다라우팅그리고웹 필터이것은 내 데비안 8 컴퓨터에서 작동하지만 더 자연스럽고 해킹을 사용하지 않기 때문에 여전히 첫 번째 접근 방식을 권장합니다.


다음과 같이 애플리케이션 구축을 고려할 수도 있습니다.투명 프록시. 나는 이것이 tun 장치에서 오는 패킷을 분석하는 것보다 훨씬 쉽다고 생각합니다.

관련 정보