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을 통과하는지 아니면 토렌트 트래픽만 통과하는지 특별히 까다롭지는 않지만:
- 부팅 시(인터넷에 연결한 후) OpenVPN을 시작합니다.
- VPN 연결이 연결된 경우 이를 전달하도록 전송을 구성합니다.
- 성공하면 Transmission(및 Telegram 봇)을 실행합니다.
- 언제든지 VPN이 실패하면 전송(및 텔레그램 봇)을 정상적으로 종료하세요.
해당 게시물에 설명된 단계를 따르려고 했지만 어떤 이유로 이벤트가 발생하도록 할 수 없으며 transmission-vpn-up
( route-up.sh
튜토리얼의 스크립트에 의해 트리거됨) 항상 initctl: Event failed
명령줄로 이동하여 이벤트를 생성합니다. route-up.sh
Ask 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/ufw
Event 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.service
openvpn 서비스가 시작되지 않거나 실패하면 다른 서비스도 시작되지 않습니다.
센토스 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) 스타일 서비스 정의의 예가 제공됩니다.
- http://linux.die.net/man/8/chkconfig
- http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html
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/openvpn
SELinux 정책을 준수하는 위치 에 있어야 합니다 . 그런 다음 auth-user-pass /etc/openvpn/credentials-file
openvpn 파일에 포함하십시오 .conf
. 이렇게 하지 않으면 CentOS가 부팅 중에 정지되어 자격 증명이 대화식으로 입력될 때까지 기다리거나 OpenVPN 시작이 거부될 수 있습니다.
위 설정을 (재)강화하는 것과 관련하여 귀하의 선호도에 따라 만족스러울 수도 있습니다. 지금까지 설정은 기본적으로 Helper를 허용하는 OpenVPN을 더 적은 제한으로 실행할 수 있는 설정을 포함하여 사전 설치된 CentOS 허용 설정을 활용합니다. 스크립트는 시스템에서 사용 가능한 바이너리를 자유롭게 실행합니다. 이는 허용적인 것처럼 들리지만 SELinux가 전혀 없는 것보다 여전히 더 제한적이며 이러한 방식으로 Transmission 및 Telegram 봇 모두 기본(또는 수동) 설치가 허용하는 것보다 조금 더 제한적으로 실행됩니다.
/sbin/init
OpenVPN을 다시 제한된 작업으로 되돌리려는 경우 CentOS 6이 부팅 작업의 대부분을 이전 SysVinit 스타일 스크립트에 의존하지만 실제로 Upstart를 사용한다는 사실을 활용하는 것은 여전히 매우 쉽습니다 . 하지만 몇 가지 추가 단계가 필요합니다.
- 최소한 OpenVPN이 Upstart와 통신하여 전송 및 텔레그램 봇 실행을 요청하도록 허용하는 (다행히 간단한) 사용자 정의 SELinux 정책
- 레거시 스크립트를 통해 전송 및 텔레그램 봇을 시작하기 위한 여러 (간단한) 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.log
SELinux 정책을 미세 조정해야 합니다. 도움이 되는 몇 가지 도구, 즉 패키지 audit2allow
에 제공된 명령이 있습니다 policycoreutils-python
.
audit.log
SELinux의 명령에 대해 허용 모드에서 이 명령을 실행할 수 있지만( /etc/sysconfig/selinux
문서 참조) 너무 많은 것을 허용하게 될 수 있습니다. 그렇지 않으면 audit.log
일반 SELinux 구현을 통해 시스템에서 실행하여 최종적으로 작업 설정을 얻을 때까지 작업할 수 있습니다. 후자의 접근 방식을 사용하면 실제로 필요한 것 이상만 허용하지 않도록 할 수 있습니다.
의 출력은 audit2allow -a -m ...
에 공급되어야 checkmodule -m -M -o ...
하고 후자의 출력은 에 공급되어야 하며 semodule_package -o ... -m ...
마지막으로 semodule -i
생성된 파일의 a에 공급되어야 합니다 semodule_package
. 분석의 각 단계를 반복합니다.
그것은 될 수 있습니다매우이는 시간이 많이 걸리는 작업이며 작동 설정이 있더라도 초기에만 그럴 수 있습니다. 어느 시점에서는 나중에 예상치 못한 "권한 거부" 문제가 발생할 수 있습니다(예: 전송 또는 텔레그램 봇이 처음 시도할 때). 이전에 시도한 적이 없는 것에 액세스하는 것입니다.