활성 OpenVPN 클라이언트가있는 서버에서 SSH 허용


15

SSH로 연결하는 CentOS 7을 실행하는 VPS가 있습니다. 인터넷 트래픽이 VPN을 통해 라우팅되도록 SSH를 통해 서버에 연결할 수 있도록 VPS에서 OpenVPN 클라이언트를 실행하고 싶습니다. OpenVPN을 시작하면 SSH 세션 연결이 끊어지고 더 이상 VPS에 연결할 수 없습니다. 들어오는 SSH (포트 22) 연결을 VPS의 실제 IP (104.167.102.77)에서 열 수 있지만 VPN을 통해 나가는 트래픽 (예 : VPS의 웹 브라우저에서)을 라우팅하도록 VPS를 구성하려면 어떻게해야합니까?

내가 사용하는 OpenVPN 서비스는 PrivateInternetAccess이며 예제 config.ovpn 파일은 다음과 같습니다.

고객
데브 툰
프로토 udp
원격 nl.privateinternetaccess.com 1194
재시도 무한 재시도
노 바인드
지속 키
지속 율
ca ca.crt
tls 클라이언트
remote-cert-tls 서버
인증 사용자 패스
comp-lzo
동사 1
레네 그 -sec 0
crl 검증 crl.pem

VPS의 IP 주소 :

1 : lo : mtu 65536 qdisc noqueue state 알 수 없음
    링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
    inet 127.0.0.1/8 범위 호스트 lo
       valid_lft 영원히
    inet6 :: 1/128 범위 호스트
       valid_lft 영원히
2 : ens33 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000
    링크 / 에테르 00 : 50 : 56 : be : 16 : f7 brd ff : ff : ff : ff : ff : ff
    inet 104.167.102.77/24 brd 104.167.102.255 스코프 글로벌 ens33
       valid_lft 영원히
    inet6 fe80 :: 250 : 56ff : febe : 16f7 / 64 범위 링크
       valid_lft 영원히
4 : tun0 : mtu 1500 qdisc pfifo_fast 상태 UNKNOWN qlen 100
    링크 / 없음
    inet 10.172.1.6 피어 10.172.1.5/32 범위 글로벌 tun0
       valid_lft 영원히

VPS의 IP 경로 :

10.172.1.5 dev tun0을 통해 0.0.0.0/1
104.167.102.1 dev ens33 프로토 정적 메트릭 1024를 통한 기본값
10.172.1.1 ~ 10.172.1.5 dev tun0
10.172.1.5 dev tun0 프로토 커널 범위 링크 src 10.172.1.6
104.167.102.0/24 dev ens33 프로토 커널 범위 링크 src 104.167.102.77
109.201.154.177 통해 104.167.102.1 dev ens33
10.172.1.5 dev tun0을 통한 128.0.0.0/1

답변:


15

나는 이것과 비슷한 문제를 겪고 있으며이 포럼 게시물에 설명 된 수정 프로그램을 시도하고 있습니다.

아이디어는 현재 공용 IP 주소에 연결할 때 반환 패킷이 VPN을 통해 라우팅되고 있다는 것입니다. 이러한 패킷을 공용 인터페이스를 통해 라우팅해야합니다.

이 경로 명령은 다음과 같은 트릭을 수행합니다.

xxxx 표 128에서 ip 규칙 추가

ip 라우트 테이블 128을 yyyy / y dev ethX에 추가

zzzz를 통한 ip route add table 128 기본값

xxxx는 공용 IP 인 경우 yyyy / y는 공용 IP 주소의 서브넷이어야하고 ethX는 공용 이더넷 인터페이스 여야하며 zzzz는 기본 게이트웨이 여야합니다.

이것은 데비안과 PrivateInternetAccess를 사용하여 저에게 효과가 없었지만 도움이 될 수 있습니다.


1
솔루션에 연결하는 대신 여기에 솔루션을 명시하거나 요약하십시오. 이렇게하면 나중에 연결 한 게시물이 사라지면 게시물이 여전히 유용 할 수 있습니다.
Andrew Schulman

이 명령을 사용하지 않으려면 ...이 표를 어떻게 나열합니까 ( route또는 추가 한 새 규칙을 볼 수 없음 ip route show) 어떻게 삭제합니까?
Hussain Khalil

집 서버에 openvpn을 일으켰을 때 공개 IP에서 ssh를 잃어 버렸습니다. 위에 나열된 첫 번째 명령을 실행하면 홈 LAN에 있지 않을 때 서버에 ssh 액세스 권한을 다시 얻을 수있었습니다. PIA + OpenVPN + 우분투 16.04 사용.
boredcoding

실제로 SSH 포트를 내 공용 IP로만 라우팅합니까? 이것이 정확히 무엇에 대해 더 자세히 설명해 주시겠습니까? 특정 포트 나 프로토콜을 설정 한 곳은 없습니다
Freedo

포트를 기반으로 라우팅되지 않습니다 (128은 포트가 아니라 테이블 번호 임). 기본적으로 패킷이 퍼블릭 IP 주소를 통해 도착하면 VPN을 사용하지 않고 동일한 인터페이스에서 응답을 보내야합니다.
MrK

17

조금 늦을 수도 있지만 ...

문제는 기본 게이트웨이가 OpenVPN에 의해 ​​변경되고 OpenVPN을 시작하기 전에 적절한 경로를 설정하지 않으면 현재 SSH 연결이 끊어진다는 것입니다.

다음은 저에게 효과적입니다. iptables와 ip (iproute2)를 사용합니다. 아래에서는 OpenVPN이 시작되기 전의 기본 게이트웨이 인터페이스가 "eth0"이라고 가정합니다. eth0이 더 이상 기본 게이트웨이 인터페이스가 아니더라도 eth0에 연결할 때 연결에 대한 응답 패킷이 eth0에서 다시 되돌아 오도록하는 것입니다.

연결 표시, 방화벽 표시 및 라우팅 테이블에 동일한 번호를 사용할 수 있습니다. 나는 서로 다른 숫자를 사용하여 그 사이의 차이점을 더 분명하게 만들었습니다.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

최신 정보:

위의 내용은 데비안 제시에서 잘 작동합니다. 그러나 이전 Wheezy 시스템에서는 라우팅 테이블 항목에 "via"를 추가해야한다는 것을 알았습니다.

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

"12.345.67.89"는 원래 비 VPN 게이트웨이 여야합니다.


1
감사합니다! 며칠 동안이 문제에 대한 해결책을 찾고 있었고 귀하의 답변으로 해결되었습니다. 이것이 정답입니다.
Mike Turley

이 솔루션은 저에게도 효과적이었습니다. 이것을 공유해 주셔서 감사합니다.
alecov

라우팅 테이블에 목적지 ( ip route add default) 가 동일한 경로가 두 개있을 수 있습니까? "RTNETLINK 답변 : 파일이 있습니다"라는 메시지가 나타납니다. Ubuntu Xenial을 실행 중입니다. "via"는 도움이되지 않습니다. 방금 아치 리눅스에서 시도했지만 처음 ip route add default에는 성공한 것처럼 보이지만 ip route출력은 변경되지 않습니다. 이후에 실행하면 "파일이 있습니다"라는 메시지가 나타납니다.
x-yuri

경로가 3412 라우팅 테이블에 추가됩니다. 그리고 그것을 얻기 위해 당신은해야합니다 : ip route show table all | grep 3412. 그리고 "통해"가 없으면 (잘못되지 않은 경우) 연결이 작동하지 않습니다 (Ubuntu Xenial). 적어도 라우팅 테이블을 수정할 수 있습니다. 그러나 그럼에도 불구하고 실행 한 후에 서버에 액세스 할 수 없습니다 openvpn.
x-yuri

반대로, 어떤 이유로 나를 위해 작동하지 않았다 , 또는 , 또는 . 기본적으로 동일합니다.
x-yuri

14

@MrK 답변을 기반으로 인터페이스 / IP를 확인할 필요가 없으므로 작업을보다 빠르게 수행 할 수 있도록 간단한 코드를 작성했습니다.

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

VPS 4에서이 스크립트를 사용해 보았으며 완벽하게 작동합니다.


정말 고맙습니다!
Jordi Goyanes

0

nh.privateinternetaccess.com과 같은 VPN 종료를위한 공용 IP 이외의 IP 체계에 대해 더 많이 알지 못하면 IP 서브넷 겹침 ...과 같은 소리가 확실하지 않습니다.

예를 들어 nl.privateinternetaccess.com의 다른쪽에있는 원격 서브넷이 10.32.43.0/24이고 인스턴스가 서브넷이 10.32.44.0/24 인 aws vpc에있는 경우입니다. 그러나 소스 ssh 클라이언트는 10.32.43.0/24 (AWS vpc의 측면)에 살고 있으며 반환 ssh 트래픽이 VPN을 통해 네덜란드로 잘못 푸시되므로 작동하지 않습니다.

이에 대한 자세한 도움말을 보려면 전체 IP / 서브넷 정보를 제공하십시오.

...

nl에 연결 한 후 기본 경로가 터널에있는 것처럼 보입니다.

10.172.1.5 dev tun0을 통해 0.0.0.0/1

연결 후 변경할 수 있습니다. VPN 서버는 종종 가짜 경로를 제공합니다. 특히 조잡한 군단에서. 이 경우 기본 경로를 푸시하여 vps 상자의 모든 트래픽이 nl이되도록합니다. 기본 경로를 104.167.102.x 또는 ur 서브넷 게이트웨이가 ur vps 공급자 인 모든 것으로 변경합니다.


어떤 명령의 출력으로 충분합니까?
odie5533

1
ssh 클라이언트, ssh 서버 / vpn 클라이언트 및 nl vpn 서버에서 "ip addr"및 "ip route"의 출력. 출력 할 때 VPN이 작동하는지 확인하십시오.
nandoP

기본적으로 트래픽이 VPN을 통과하기를 원합니다. 그러나 104.167.102.77:22의 들어오는 트래픽을 허용하여 VPS에 SSH로 연결할 수 있기를 원합니다.
odie5533

tcpdump로이를 확인하지만 연결 한 후 들리는 것처럼 들리고 기본 경로는 터널이되고 인터넷의 다른 곳에서 인바운드 된 새 ssh 트래픽은 허용되지만 기본 경로는 터널을 통해 ssh 응답을 보내므로 반환되지 않습니다. 다시 당신 대신. "[vps 게이트웨이]를 통해 ip route add [your-ip-addr] / 32"로이 문제를 해결할 수 있습니다. VPN 게이트웨이를 찾고 터널에서 연결을 끊고 기본 경로를 확인하십시오
nandoP

0

VPN을 켜면 기본 게이트웨이가 교체됩니다. 이는 귀하의 박스에서 생성되거나 귀하를 통해 라우팅 된 모든 트래픽이 VPN 게이트웨이로 전달됨을 의미합니다.

간단한 해결책은 VPN을 통해 라우팅하고 싶지 않은 모든 트래픽을 필터링하여 다른 작업을 수행하는 것입니다. 상자에서 생성 된 트래픽을 로컬 소스 주소로 가져와 로컬 게이트웨이를 통해 라우팅 할 수 있습니다. 이를 통해 SSH와 같은 서비스가 제대로 작동 할 수 있습니다.

우리는 여기서 할 것입니다. 먼저 새 라우팅 테이블을 만들고 로컬 게이트웨이를 통해 모든 것을 라우팅하는 기본 경로를 추가하십시오.

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

다음으로, 특정 소스 주소에서 박스를 떠나는 모든 트래픽에 식별자가있는 새 패킷 필터 규칙을 만듭니다.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

마지막으로 위에서 언급 한 모든 표시된 트래픽을 선택하고 위의 생성 된 테이블을 사용하여 라우팅하는 라우팅 정책을 만듭니다.

ip rule add fwmark <mark> table <table>

다시 한번,의 값 <mark><table>자신의 선택의 임의의 식별자입니다.


0

pfSense에서 OpenVPN 서버를 직접 실행하는 경우 "터널을 통해 모든 클라이언트 생성 IPv4 트래픽을 강제로 설정"설정을 해제해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.