해결책

해결책

CentOS 6.10의 최소 설치를 실행하는 헤드리스 서버에서 OpenVPN을 사용하여 전송을 설정하려고 합니다. 이상적으로는 시스템을 부팅할 때 시작됩니다.

다음 단계를 수행하여 모든 것을 실행할 수 있었습니다.여기그리고여기— 그러나 이는 vpn.sh스크립트를 수동으로 실행할 때만 작동합니다(두 튜토리얼에 따르면). 스크립트는 다음과 같습니다.

#!/bin/sh

sudo openvpn --cd /etc/openvpn --config /etc/openvpn/conf.ovpn --script-security 2 --up /etc/openvpn/up.sh

OpenVPN 및 전송 외에도 다음을 추가하고 싶습니다.이 텔레그램 봇이 작업은 다른 모든 작업이 완료된 후에 시작되어야 하므로 up.sh파일 끝에 다음과 같은 줄도 있습니다.

#!/bin/sh

/etc/init.d/transmission-daemon stop
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start

이상적으로는 다음과 같은 일을 더 많이 할 수 있을 것입니다.이 게시물개요: 모든 트래픽이 VPN을 통과하는지 아니면 토렌트 트래픽만 통과하는지 특별히 까다롭지는 않지만:

  1. 부팅 시(인터넷에 연결한 후) OpenVPN을 시작합니다.
  2. VPN 연결이 연결된 경우 이를 전달하도록 전송을 구성합니다.
  3. 성공하면 Transmission(및 Telegram 봇)을 실행합니다.
  4. 언제든지 VPN이 실패하면 전송(및 텔레그램 봇)을 정상적으로 종료하세요.

해당 게시물에 설명된 단계를 따르려고 했지만 어떤 이유로 이벤트가 발생하도록 할 수 없으며 transmission-vpn-up( route-up.sh튜토리얼의 스크립트에 의해 트리거됨) 항상 initctl: Event failed명령줄로 이동하여 이벤트를 생성합니다. route-up.shAsk Ubuntu의 게시물에 따르면 다음과 같습니다.

#! /bin/bash

/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local

down.sh그러나 콘텐츠를 명령줄에 전달하면 다음과 같은 오류가 발생하지 않습니다.

/sbin/initctl emit transmission-vpn-down

그것의 유무에 관계없이 시도했습니다 sudo.

이 작업을 수행할 수 있는 쉬운 방법이 있습니까? 이것은 CentOS가 아닌 Ubuntu에 대한 튜토리얼이기 때문에 뭔가, 특히 AU의 다른 튜토리얼에 지정된 emit내용이 누락된 것인가요 ?transmission-vpn-up

아니면 vpn.sh시작 시 (이 문서의 첫 번째 코드 블록) 실행하는 것이 더 쉬울까요? VPN이 다운되면 이는 똑같이 깔끔하고 우아하지만 작업은 수행됩니다.


빠른 업데이트:

위에서 언급한 Ask Ubuntu 튜토리얼, 특히 CentOS에는 없었던 /etc/init/transmission-up.conf사용하려고 할 때 원래 오류 메시지가 표시됩니다. 일시적으로 이 비트를 주석 처리했는데 이제는 오류 메시지가 없습니다./usr/sbin/ufwEvent failed

하지만 오류 메시지도 없고 VPN이 작동 중임에도 불구하고 전송이 시작되지 않아 다른 문제가 발생하고 있는 것 같습니다. 어디서 확인할 수 있는지에 대한 팁이 있나요?

답변1

해결책

다음은 이 문제에 대한 몇 가지 자세한 측면과 해결 방법입니다(centos 6은 systemd를 사용하지 않으며 centos는 v7에서 systemd로 전환되었습니다).

센토스 7 솔루션

시작 시 OpenVPN 설정:

systemd(서비스 구현)를 사용하여 부팅 시 openvpn을 시작할 수 있으며, 서비스를 생성하고 활성화한 다음 시작해야 합니다. (서비스를 활성화한 후부팅 시 자동으로 시작됩니다)

1 - 서비스 생성: (루트 사용)

cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service

2 - 서비스 파일 열기: (루트 사용)

/etc/systemd/system/openvpn-custom.service사용하는 텍스트 편집기로 예제를 엽니다.nano openvpn-custom.service

3 - 서비스 파일 편집 및 설정: (루트 사용)

다음 코드를 붙여넣고 수정하세요./etc/systemd/system/openvpn-custom.service

[Unit]
Description=OpenVPN Custom Setup Script 
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/vpn-script/vpn.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh

[Install]
WantedBy=multi-user.target

4 - 서비스 활성화 및 시작: (루트 사용)

systemctl enable openvpn-custom.service
systemctl start openvpn-custom.service

다음 명령을 사용하여 서비스 상태를 확인할 수 있습니다.systemctl status openvpn-custom.service

시작 시 전송 및 텔레그램 설정(openvpn 상태에 따라):

openvpn 솔루션과 동일하게 다음 코드를 사용하여 새 서비스를 생성한 다음 활성화하고 시작합니다.

[Unit]
Description=Application Depending on OpenVPN 
After=network.target network-online.target openvpn-custom.service
Wants=network-online.target openvpn-custom.service

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/ovpn-applications.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-apps/ovpn-applications-stop.sh

[Install]
WantedBy=multi-user.target

귀하의 ovpn-applications.sh는 다음과 같습니다

#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start

After=openvpn-custom.service서비스를 openvpn에 종속 시키므로 Wants=openvpn-custom.serviceopenvpn 서비스가 시작되지 않거나 실패하면 다른 서비스도 시작되지 않습니다.

센토스 6 솔루션

시작 시 OpenVPN 설정:

1 - 서비스 생성: (루트 사용)

cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom

2 - 서비스 파일 열기: (루트 사용)

/etc/rc.d/init.d/openvpn-custom사용하는 텍스트 편집기로 예제를 엽니다.nano openvpn-custom

3 - 서비스 파일 편집 및 설정: (루트 사용)

#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn script
# processname: openvpn
#
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn daemon
# Description: The openvpn daemon custom script
### END INIT INFO

#/etc/rc.d/init.d/openvpn-custom
# Source function library.
. /etc/init.d/functions


start() {
        echo -n "Starting custom openvpn... "
        /full-path-to/your/vpn-script/vpn.sh
        return 0
}

stop() {
        echo -n "Shutting down custom openvpn... "
        /full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        ;;
    restart)
        stop
        start
        ;;
    reload)
        ;;
    *)
        echo "Usage: openvpn-custom {start|stop|status|reload|restart}"
 exit 1
        ;;
esac
exit $?

4 - 서비스 활성화 및 시작: (루트 사용)

chkconfig openvpn-custom on
service openvpn-custom start

다음 명령을 사용하여 서비스 상태를 확인할 수 있습니다.service openvpn-custom status

네트워크가 준비되었을 때만 openvpn이 시작되도록 하는 방법

초기화 스크립트 시작 부분의 chkconfig 정의는 가져오는 S/K 번호를 결정합니다.

각 "런레벨"은 실제로는 단순한 디렉토리입니다(/etc/rc*.d/)는 초기화 스크립트(/etc/init.d/) 이러한 심볼릭 링크의 이름은 번호가 매겨진 S 및 K 항목으로 지정됩니다.

S는 시작, K는 중지를 의미합니다. init가 런레벨에 들어가면 S01부터 S99까지 각 init 스크립트를 실행하여 해당 스크립트에 의해 제어되는 서비스를 시작합니다. init가 런레벨을 벗어나면 K01부터 K99까지 각 스크립트를 실행하여 해당 스크립트에 의해 제어되는 서비스를 중지합니다.

수동으로 구성 확인chkconfig 스타일 서비스 정의 및 LSB(Linux Standard Library) 스타일 서비스 정의의 예가 제공됩니다.

initscript가 두 유형을 모두 정의하는 경우 LSB 정의가 chkconfig 정의보다 우선해야 합니다.

네트워크 연결에 의존하는 서비스가 있는 경우 10 이후의 시작 번호를 제공하여 /etc/rc*.d/S10network 이후에 서비스가 시작되는지 확인할 수 있습니다. 또는 /etc/init .d/network가 LSB 정의제공자: $network이므로 LSB 정의를 사용할 수 있습니다.시작하는 데 필요함: $network초기화 스크립트에서.

시작 시 전송 및 텔레그램 설정(openvpn 상태에 따라):

openvpn 솔루션과 동일하게 다음 코드(/etc/rc.d/init.d/openvpn-apps)를 사용하여 새 서비스를 생성한 다음 활성화하고 시작합니다.

#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn-apps script
# processname: openvpn-apps
#
### BEGIN INIT INFO
# Provides: openvpn-apps
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn-apps daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-apps

# Source function library.
. /etc/init.d/functions


start() {
        echo -n "Starting custom openvpn... "
        /full-path-to/your/apps.sh
        return 0
}

stop() {
        echo -n "Shutting down custom openvpn... "
        /full-path-to/your/stop-apps.sh
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        ;;
    restart)
        stop
        start
        ;;
    reload)
        ;;
    *)
        echo "Usage: openvpn-apps {start|stop|status|reload|restart}"
 exit 1
        ;;
esac
exit $?

귀하의 apps.sh는 다음과 같습니다

#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start

apps.sh가 openvpn 상태에 종속되도록 하려면 먼저 apps.sh의 시작을 지연시킬 수 있습니다.sleep 또는ps로 openvpn을 확인하는 bash 루프 작성또는openvn 게이트웨이(apps.sh)의 핑 결과를 확인하세요.또는service openvpn-custom status(apps.sh에서) 결과를 확인할 수 있습니다.

솔루션에 대한 참고 사항(6 및 7):

오류 방지 openvpn:

openvpn이 작동하지 않는 경우 네트워크를 종료하도록 "안전 장치"를 설정하여 VPN이 작동하지 않는 경우 연결 누출을 방지할 수 있습니다.이것또는저것해결책

애플리케이션이 특정 인터페이스를 사용하도록 강제합니다.

openvpn 설정이 전체 시스템을 터널링/라우팅하는 것이라면 이렇게 할 필요가 없지만, openvpn 인터페이스를 통해 모든 트래픽을 라우팅하지 않으면 애플리케이션(전송/텔레그램)을 프록시/바인딩/강제할 수 있습니다. VPN을 사용하십시오. Linux에는 애플리케이션을 특정 인터페이스에 바인딩하기 위한 여러 솔루션이 있으며 각 솔루션에는 장점과 단점이 있습니다.유닉스 스택교환 답변가장 사용 가능한 가능성에 대한 자세한 설명

답변2

귀하의 경우에도 가능한 한 표준 절차를 고수할 것이라고 생각합니다.

하나로 시작하다원래의센트OS 6.10가장 작은ISO 설치는 다음과 같이 진행하겠습니다.

첫 번째,~할 수 있게 하다무제한 OpenVPN: CentoOS 6에는 기본적으로 제한된 모드에서 바이너리를 실행하는 기본 SELinux 정책이 함께 제공됩니다 /usr/sbin/openvpn. 기본적으로 네트워크 설정만 허용하여 도우미 스크립트가 유용한 작업을 수행하지 못하게 합니다. 그러나 CentOS 6은 무제한 OpenVPN을 활성화하는 간단한 설정도 제공합니다. ~처럼뿌리달리기:

setsebool -P openvpn_run_unconfined on

다소 시간이 걸릴 수 있으니 잠시만 기다려주세요.

가능한모든 것이 제대로 작동하면 다시 제한 모드로 전환하고 싶습니다. 나중에 몇 가지 가능한 접근 방식으로 다시 돌아오겠습니다.

그다음 기본설정을 진행하려면,설치하다시스템의 yum에 EPEL 저장소를 추가합니다.

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

이는 시스템의 yum에 CentOS 6 패키지 openvpn 및 전송용 RPM을 제공하는 저장소를 제공합니다.

나중에는 할 수 있습니다하다:

yum install openvpn transmission-daemon

그 다음에설치하다transmission-telegram이미 그랬던 것처럼 봇입니다 . 에 지정된 디렉토리에 배치했는지 확인하세요 $PATH. CentOS 6의 SELinux 정책을 고려하면 /usr/local/bin좋은 선택이 될 수도 있습니다.

(참고하세요저는 텔레그램 봇에 대해 아무것도 모르기 때문에 자세히 설명할 수 없고 텔레그램을 전혀 사용하지 않기 때문에 테스트조차 할 수 없습니다. )

그 다음에만들다다음과 같은 스크립트는 다음과 같습니다 openvpn-transmission-up.sh.

#!/bin/bash

PATH+=":/sbin:/usr/sbin"
service transmission-daemon start
service transmission-daemon status && telegram-bot-start.sh

이는 telegram-bot-start.sh텔레그램 봇을 시작하는 실제 명령을 실행하기 위한 가상의 래퍼일 뿐이며 전송 데몬이 성공적으로 시작된 경우에만 실행됩니다. 직접 명령을 한 줄 명령으로 넣을 수 있는 경우 &&.

그리고 거기에는만들다다음과 같은 스크립트는 다음과 같습니다 openvpn-transmission-down.sh.

#!/bin/bash

PATH+=":/sbin:/usr/sbin"
telegram-bot-stop.sh
service transmission-daemon stop || true

telegram-bot-stop.sh여기에서는 래퍼 대신 직접 명령을 사용하여 Telegram 봇을 중지할 수도 있습니다. 이 경우 실제로 명령 시퀀스인 경우에도 마찬가지입니다.

그 다음에만들다위의 두 스크립트를 실행할 수 있습니다.

chmod +x openvpn-transmission-up.sh openvpn-transmission-down.sh

그리고장소/etc/openvpn/scripts이는 디렉터리에 있습니다 (CentoOS SELinux 정책에 다시 적용됨). 아직 디렉토리가 없다면 디렉토리를 생성하십시오.

그 다음에놓다자신만의 OpenVPN 구성을 에 넣으세요 /etc/openvpn. 이 파일의 이름은 원하는 대로 지정할 수 있지만 .conf접미사가 있어야 합니다.

확실하게 하다.conf파일에는 다음 줄이 있습니다.

script-security 2
route-up scripts/openvpn-transmission-up.sh
route-pre-down scripts/openvpn-transmission-down.sh

route-up또는 스크립트가 이미 있는 경우 route-pre-down기존 스크립트를 위 스크립트와 개별적으로 병합하되 /etc/openvpn/scripts.

위의 설정은 전송 및 텔레그램 봇이 항상 VPN 터널의 운명을 따르도록 보장합니다.

마침내놓다openvpn은 시작 시 실행됩니다.

chkconfig openvpn on

이 마지막 설정은 OpenVPN의 RPM 패키지와 함께 제공되는 설정에 의존하므로 일반 네트워크가 성공적으로 시작된 후에만 실행됩니다.

RPM 패키지와 함께 제공되는 기본 구성이면 충분하므로 실제로 Transmission을 구성할 필요는 없다고 생각합니다. 그러나 IP_ADDRESS를 설정하기 위해 명령을 재사용하려면 sed Transmission-daemon을 시작하기 전에 sed명령을 스크립트에 넣으십시오. 그럼에도 불구하고 일반적 으로 대신 openvpn-transmission-up.sh사용하는 것이 좋습니다 .$ifconfig_local$4

이 시점에서는 준비가 되어 있어야 합니다. 간단히 service openvpn다음 start 등 stop을 통해 restart 이를 테스트할 수 있습니다. 아니면 헤드리스 서버를 다시 시작하세요.

노트VPN 공급자가 사용자 이름과 비밀번호를 통한 인증을 요구하는 경우 파일에 두 줄에 입력해야 합니다. 이 파일은 /etc/openvpnSELinux 정책을 준수하는 위치 에 있어야 합니다 . 그런 다음 auth-user-pass /etc/openvpn/credentials-fileopenvpn 파일에 포함하십시오 .conf. 이렇게 하지 않으면 CentOS가 부팅 중에 정지되어 자격 증명이 대화식으로 입력될 때까지 기다리거나 OpenVPN 시작이 거부될 수 있습니다.


위 설정을 (재)강화하는 것과 관련하여 귀하의 선호도에 따라 만족스러울 수도 있습니다. 지금까지 설정은 기본적으로 Helper를 허용하는 OpenVPN을 더 적은 제한으로 실행할 수 있는 설정을 포함하여 사전 설치된 CentOS 허용 설정을 활용합니다. 스크립트는 시스템에서 사용 가능한 바이너리를 자유롭게 실행합니다. 이는 허용적인 것처럼 들리지만 SELinux가 전혀 없는 것보다 여전히 더 제한적이며 이러한 방식으로 Transmission 및 Telegram 봇 모두 기본(또는 수동) 설치가 허용하는 것보다 조금 더 제한적으로 실행됩니다.

/sbin/initOpenVPN을 다시 제한된 작업으로 되돌리려는 경우 CentOS 6이 부팅 작업의 대부분을 이전 SysVinit 스타일 스크립트에 의존하지만 실제로 Upstart를 사용한다는 사실을 활용하는 것은 여전히 ​​매우 쉽습니다 . 하지만 몇 가지 추가 단계가 필요합니다.

  1. 최소한 OpenVPN이 Upstart와 통신하여 전송 및 텔레그램 봇 실행을 요청하도록 허용하는 (다행히 간단한) 사용자 정의 SELinux 정책
  2. 레거시 스크립트를 통해 전송 및 텔레그램 봇을 시작하기 위한 여러 (간단한) Upstart 작업

시작,놓다OpenVPN이 제한 모드로 돌아갑니다:

setsebool -P openvpn_run_unconfined off

이제 OpenVPN을 시작하면 도우미 스크립트가 전송 및 텔레그램 봇을 시작하지 않습니다.

따라서 사용자 정의 SELinux 정책은 다음과 같습니다.

만들다이름이 사람openvpn-talk-upstart.te 정확히다음과 같이:

module openvpn-talk-upstart.mod 1.0;

require {
        type openvpn_t;
        type init_t;
        class unix_stream_socket connectto;
}

allow openvpn_t init_t:unix_stream_socket connectto;

그 다음에달리기다음 명령:

checkmodule -m -M -o openvpn-talk-upstart.mod openvpn-talk-upstart.te
semodule_package -o openvpn-talk-upstart.pp -m openvpn-talk-upstart.mod
semodule -i openvpn-talk-upstart.pp

마지막 명령에는 시간이 걸릴 수 있습니다.

그리고 신생 위치가 있습니다.

만들다/etc/init/transmission-up.conf다음 파일:

task

exec service transmission-daemon start

그리고/etc/init/transmission-down.conf다음 파일:

task

exec service transmission-daemon stop

그럼 당신은필요텔레그램 봇에도 신생 게시물이 있습니다.

내 예와 일관성을 유지하기 위해 가상의 스크립트 접근 방식을 고수하므로 ed 명령이 각각 및 로 변환된 것만으로 /etc/init/telegram-bot-up.conf이름이 및 인 작업 파일이 /etc/init/telegram-bot-down.conf전송 파일과 유사합니다 .exec/usr/local/bin/telegram-bot-start.sh/usr/local/bin/telegram-bot-stop.sh

여기서는 Upstart에 얼마나 자신감이 있는지에 따라 관련 명령을 작업 파일에 직접 넣고 script ... end-script키워드를 키워드로 대체 exec하거나 Upstart 작업 파일 프로세스에서 완전히 Upstart 제어 데몬을 생성할 수도 있습니다( 하지만 task입력하지 마세요).

금후,만들다OpenVPN 도우미 openvpn-transmission-up.sh스크립트 /etc/openvpn/scripts는 다음과 같습니다:

#!/bin/sh

/sbin/start transmission-up && /sbin/start telegram-bot-up

그리고스크립트 openvpn-transmission-down.sh:

#!/bin/sh

/sbin/start telegram-bot-down
/sbin/start transmission-down || true

노트/sbin/start실제로 "다운" 작업인 경우에도 이 명령을 사용하십시오.

이제 OpenVPN은 원래의 제한된(즉, 더 안전한) 모드로 작동하지만 Transmission과 Telegram 봇은 모두 표준 "무료"(즉, 덜 안전한) 모드로 모든 것이 잘 작동할 것입니다.


후자의 두 가지를 더욱 강화하려면 OpenVPN과 같은 제한된 SELinux 환경에서 이를 실행한 다음 파일을 주의 깊게 분석하여 /var/log/audit/audit.logSELinux 정책을 미세 조정해야 합니다. 도움이 되는 몇 가지 도구, 즉 패키지 audit2allow에 제공된 명령이 있습니다 policycoreutils-python.

audit.logSELinux의 명령에 대해 허용 모드에서 이 명령을 실행할 수 있지만( /etc/sysconfig/selinux문서 참조) 너무 많은 것을 허용하게 될 수 있습니다. 그렇지 않으면 audit.log일반 SELinux 구현을 통해 시스템에서 실행하여 최종적으로 작업 설정을 얻을 때까지 작업할 수 있습니다. 후자의 접근 방식을 사용하면 실제로 필요한 것 이상만 허용하지 않도록 할 수 있습니다.

의 출력은 audit2allow -a -m ...에 공급되어야 checkmodule -m -M -o ...하고 후자의 출력은 에 공급되어야 하며 semodule_package -o ... -m ...마지막으로 semodule -i생성된 파일의 a에 공급되어야 합니다 semodule_package. 분석의 각 단계를 반복합니다.

그것은 될 수 있습니다매우이는 시간이 많이 걸리는 작업이며 작동 설정이 있더라도 초기에만 그럴 수 있습니다. 어느 시점에서는 나중에 예상치 못한 "권한 거부" 문제가 발생할 수 있습니다(예: 전송 또는 텔레그램 봇이 처음 시도할 때). 이전에 시도한 적이 없는 것에 액세스하는 것입니다.

관련 정보