다음 인터페이스를 갖춘 Linux 상자가 있습니다.
eth0 Link encap:Ethernet HWaddr 14:da:e9:ef:75:7d
inet addr:176.9.85.182 Bcast:176.9.85.191 Mask:255.255.255.224
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.170.1.6 P-t-P:10.170.1.5 Mask:255.255.255.255
eth0
그것은 내 인터넷 연결입니다. tun0
분명히 VPN입니다. 이제 특정 사용자가 생성한 모든 트래픽을 VPN을 통해 라우팅하고 싶습니다. 이것이 제가 해결해야 했던 첫 번째 실제 라우팅 문제였기 때문에 저는 구글링을 많이 해서 다음 내용을 읽었습니다.사용자 기반 라우팅,포트 기반 라우팅,기본 VPN 라우팅 그리고 일부라크. 지금까지 나는 이것에 대해 혼란스러워합니다.
# Mark all traffic from user
iptables -t mangle -A OUTPUT -o eth0 -m owner --uid-owner 1002 -j MARK --set-mark 10
# Translate source address to VPN address
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# And just to be sure allow forwarding on tun0
-P FORWARD ACCEPT
-A FORWARD -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# Route based on mark
ip rule add fwmark 10 priority 1000 table 10
# Route
ip route add default via 10.170.1.5 tun0 table 10
ip rule from 10.170.1.6/32 priority 1200 table 10
ip rule to 10.170.1.5/32 priority 1200 table 10
문제는 tcpdump
작업 에 따라 SNAT
응답이 올바른 소스 주소를 가지고 있는 것처럼 보이더라도 프로세스로 올바르게 다시 라우팅되지 않는다는 것입니다. 활성화했습니다 ip_forwarding
. echo 1 > /proc/sys/net/ipv4/ip_forward
무엇을 놓치고 있나요?
편집하다:
설정을 통해 sysctl -w net.ipv4.conf.tap0.rp_filter=2
사용자는 인터넷에 연결할 수 있지만 wget http://wtfismyip.com/text
IP 주소를 기반으로 하면 VPN이 아니라 일반 공개 주소입니다.
고마워요, 스티브
15:22:17.713602 IP 10.170.1.6.42225 > google-public-dns-a.google.com.domain: 63046+ A? wtfismyip.com. (31)
15:22:17.713623 IP 10.170.1.6.42225 > google-public-dns-a.google.com.domain: 35494+ AAAA? wtfismyip.com. (31)
15:22:17.747989 IP google-public-dns-a.google.com.domain > 10.170.1.6.42225: 63046 1/0/0 A 54.200.182.206 (47)
15:22:17.854532 IP google-public-dns-a.google.com.domain > 10.170.1.6.42225: 35494 1/0/0 AAAA 2001:470:e8f8:1::1 (59)