it-swarm-ko.tech

OpenVPN + iptables / NAT 라우팅

OpenVPN 서버를 통해 클라이언트에서 인터넷으로 일부 (전부는 아님) 트래픽을 전달하는 OpenVPN VPN을 설정하려고합니다.

내 OpenVPN 서버는 eth0에 공용 IP가 있으며 tap0을 사용하여 로컬 네트워크 192.168.2.x를 생성하고 있습니다. 로컬 IP 192.168.1.101에서 연결하고 VPN IP 192.168.2.3을 얻는 클라이언트가 있습니다.

서버에서 다음을 실행했습니다.

iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

클라이언트에서 기본값은 192.168.1.1을 통한 라우팅으로 유지됩니다. HTTP에 대해 192.168.2.1을 가리 키기 위해 다음을 실행했습니다.

ip rule add fwmark 0x50 table 200
ip route add table 200 default via 192.168.2.1
iptables -t mangle -A OUTPUT -j MARK -p tcp --dport 80 --set-mark 80

이제 클라이언트에서 웹 사이트 (예 : wget google.com)에 액세스하려고하면 거기에 멈 춥니 다. 서버에서 볼 수 있습니다.

$ Sudo tcpdump -n -i tap0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
05:39:07.928358 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 558838 0,nop,wscale 5>
05:39:10.751921 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 559588 0,nop,wscale 5>

74.125.67.100은 google.com에 대해 가져 오는 IP입니다.

MASQUERADE가 작동하지 않는 이유는 무엇입니까? 더 정확하게는 소스가 192.168.1.101로 표시되는 것을 볼 수 있습니다. VPN에서 온 것임을 나타내는 무언가가 있어야하지 않나요?

편집 : 일부 경로 [클라이언트에서]

$ ip route show table main
192.168.2.0/24 dev tap0  proto kernel  scope link  src 192.168.2.4
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.101  metric 2
169.254.0.0/16 dev wlan0  scope link  metric 1000
default via 192.168.1.1 dev wlan0  proto static

$ ip route show table 200
default via 192.168.2.1 dev tap0
5
Mikeage

두 가지가 잘못되었습니다.

첫째, 클라이언트에서 실제 IP에 대한 소스 인 SNAT가 필요했습니다.

둘째, 역방향 경로 필터는 스푸핑 된 것으로 간주되어 반환 패킷을 차단했습니다. echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter 수정

1
Mikeage

ip route show table mainip route show table 2의 출력을 게시 할 수 있습니까? '200'테이블에 몇 개의 경로가 누락 된 것 같습니다. '200'라우팅 테이블은 'main'테이블과 거의 동일한 경로를 가져야하지만 유일한 차이점은 기본 경로입니다.


업데이트 된 것을 확인했으며 원래 제안이 정확하다고 생각합니다. 메인 테이블에 로컬 네트워크와 VPN 링크 모두에 대한 '범위 링크'경로가 있는지 확인하십시오. 이러한 경로는 '200'테이블에도 추가되어야합니다.

사용하는 다른 명령과 함께 이러한 명령을 실행 해보십시오.

ip route add 192.168.2.0/24 dev tap0  proto kernel  scope link  src 192.168.2.4 table 200
ip route add 192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.101  metric 2 table 200
ip route flush cache

이러한 경로 생성을 스크립팅하려면 이것을 사용할 수 있습니다. 기본 라우팅 테이블에서 다른 테이블로 모든 '범위 링크'경로를 복사합니다.

#!/bin/bash
IFACE=wlan0
RT=200
/sbin/ip route list scope link table main proto kernel dev ${IFACE} \
| while read ROUTE ; do
    # and add that route to all the tables mentioned in the rrtables option
    # in the interfaces file
    /sbin/ip route add table ${RT} scope link proto kernel dev ${IFACE} ${ROUTE}
done

또 다른 업데이트. 방금 전에 분명한 것을 놓쳤다는 것을 깨달았습니다.

MASQ 문이 eth0에서 작동하는 것 같습니다. 게시 한 라우팅 테이블에서 출력 장치는 eth0이 아닙니다. 이 대신.

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

아마도 이와 같은 문장을 사용해야 할 것입니다.

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
3
Zoredache

서버에서 시도하십시오.

echo 1 > /proc/sys/net/ipv4/ip_forward

그것은 일시적으로 그것을 가능하게 할 것이라고 생각합니다. 작동하면 다음을 추가하십시오.

net.ipv4.conf.default.forwarding=1 

/etc/sysctl.conf에 추가하여 영구적으로 만듭니다.

0
Neobyte