
OpenVPN을 사용하여 두 개의 VPN을 터널링하고 싶습니다. 따라서 클라이언트는 첫 번째 VPN에 연결하고 두 번째 VPN으로 리디렉션됩니다. (이것들은 모두 VPS입니다. 나중에 중요해지기 때문에 물리적으로 접근할 수는 없습니다.)
그림은 다음과 같습니다.
Client VPN1 VPN2
10.8.0.2[tun0]------10.8.0.1[tun0]
[1.1.1.1][eth0] 10.8.100.2[tun1]----------10.8.100.1[tun0]
45.55.45.55[eth0] 186.186.186.186[eth0]------internet
서버 구성은 매우 표준적인 구성입니다.
port 1194
auth-user-pass-verify /etc/openvpn/script/login.py via-env
username-as-common-name
script-security 3
proto udp
dev tun
duplicate-cn
sndbuf 0
rcvbuf 0
vca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0 (or 10.8.100.0 in the VPN2)
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
클라이언트 구성도 꽤 표준적입니다.
client
dev tun
auth-user-pass login.txt
proto udp
sndbuf 0
rcvbuf 0
remote 45.55.45.55 1194 (or 186.186.186.186 for VPN2)
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
key-direction 1
verb 3
따라서 VPN 연결을 달성하기 위해 VPN1에 직접 연결합니다.
openvpn --config toOpenVPN1.ovpn
이렇게 VPN1에서 VPN2로 연결하면 모든 트래픽이 VPN2로 리디렉션되고 VPN1의 공용 IP가 VPN2로 설정되므로 VPN1 서버에서 잠깁니다. 따라서 --route-nopull 옵션을 사용하여 두 번째 VPN에서 오는 푸시 경로를 거부합니다.
openvpn --config toOpenVPN2.ovpn --route-nopull
그럼 이렇게 연결이 잘 됩니다. localhost에서 VPN1로 들어오는 트래픽이 있고 내 공용 IP는 VPN1입니다. 또한 tunX 인터페이스에 IP를 할당했습니다. 그러나 여전히 localhost(클라이언트)에서 VPN2로 들어오는 트래픽은 없습니다. 이 작업을 수행하려면 경로를 만들어야 합니다. 그리고 그것은 내가 실패하고 있는 것이었습니다.
클라이언트는 트래픽이 다른 위치로 리디렉션되는지 여부를 신경 쓸 필요가 없으므로 클라이언트 측(클라이언트)에서 수행해야 하는 구성이나 iptables 규칙이 없다고 가정합니다. VPN2 서버도 마찬가지이므로 VPN1 또는 다른 피어에서 오는지 알 필요가 없습니다. 따라서 제가 설정해야 할 것은 VPN1 구성뿐입니다.
먼저 iptables 규칙을 다음과 같이 설정하겠습니다. 이렇게 하면 트래픽이 지나갈 수 있습니다.
iptables -A INPUT -i tun1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m multiport --dports 6880:7000 -j DROP
iptables -A FORWARD -i tun1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -d 10.8.100.0/24 -i tun0 -o tun1 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -s 10.8.100.0/24 -d 10.8.0.0/24 -i tun1 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
이제 한 피어가 다른 피어를 볼 수 있는 경로를 생성해야 합니다.
route add 0.0.0.0/0 dev tun0
route add 0.0.0.0/0 dev tun1
### route from the the first tunnel, through the client's IP
route add -net 10.8.0.0/24 gw 10.8.0.2 dev tun0
### same for the 2nd
route add -net 10.8.100.0/24 gw 10.8.100.1 dev tun1
### route all the traffic to the 2nd VPN
### end server's IP and internet's gateway
route add 186.186.186.186 gw 45.55.45.1
route add default gw 10.8.100.1 dev tun1 <<<<<<<<<<<<<<<<<< got locked out of VPN1 server
따라서 잘못된 경로를 생성하고 있거나 iptables 규칙이 올바르게 설정되지 않았지만 한 클라이언트에서 두 번째 VPN으로 트래픽이 들어올 수 없습니다. 그리고 여러 번 시도한 후에도 항상 VPN1에서 계속 차단됩니다.
VPN1에 대한 올바른 경로 세트는 어떻게 됩니까?
답변1
그래서 알아 냈습니다. 그렇게 하려면 사용자 정의 라우팅 테이블과 iptables 규칙을 사용하여 전달하려는 모든 패키지를 표시해야 합니다.
예를 들어 TCP에서 하나의 포트를 전달하려면 다음과 같이 사용할 수 있습니다.
iptables -t mangle -I PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
/etc/iproute2/rt_tables
그런 다음 표시된 패킷에 대해 라우팅 테이블을 만듭니다 9999 tableToForward
.
마지막으로 인터페이스를 통해 해당 테이블에 표시된 모든 패킷을 전달하는 두 가지 규칙을 추가합니다 tun1
.
ip route add 0.0.0.0/0 dev tun1 table tableToForward
ip rule add from all fwmark 1 table tableToForward
답변2
openvpn --config toOpenVPN2.ovpn --route-nopull
잘 됐어
두 개의 VPN 서버 중 하나는 위 명령으로 다시 openvpn을 통해 다른 서버에 연결됩니다.
인터넷 액세스가 작동했지만 --route-nopull 인터넷 액세스가 작동하지 않습니다.