TIL - port forwarding 윈도우 10 작업 스케줄러에 저장하기

solee·2022년 2월 28일
0

TIL

목록 보기
5/20

맥과 아이와 연관이 없는고로, 익숙하고 사랑하는 윈도우와 함께하고 있는데 난관이 자꾸 생겼다. 꽤 오래 (멘토님이)고생해서 (멘토님이)해결해주신 후에 꼬박꼬박 port forwarding을 해 주었다. 그러던 중 작업 스케줄러를 이용해 이 지겨운(자꾸 까먹어서 서버 다시 끄고 port forwarding해주고를 반복하는) 일을 그만하고 싶어졌다.




port forwarding

포트 포워딩이란 포트 매핑과 같은 말로, ip주소와 포트넘버를 연결해주는 것이다. 윈도우로 리눅스를 사용하기 위해 가상 환경인 WSL2를 설치하고 우분투를 설치해 사용하는 터라, 요청이 들어오는 ip주소가 WSL2의 리눅스까지 닿지 않은 게 원인이었다.

그래서 포트넘버와 아이피를 연결하는 세팅을 해 주고, 방화벽을 내리도록

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80, 1000,2000,3000,5000,8000,8080,8002);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

이런 파일ports_wsl.ps1을 만들어 실행시켜 주는 것이다.

실행 전에 powershell을 열어 해 줘야 하는 것도 있는데, 아래에서 마저 설명하겠다.




작업 스케줄러에 등록하기

정보처리기사를 공부할 때 열심히 외웠던 cron....은 사용하지 않는다(당연함 배치가 아니라 그냥 스케줄러임).

그냥 제어판-관리 도구에서 찾거나, 바로 작업 스케줄러를 검색한다.

작업 스케줄러를 열어 보자.

뭐가 많다! 우리가 평소에 알아서 업데이트되던 녀석들이 사실 여기서 벌어지고 있었다. 나는 사용하지도 않는 onenote관련 스케줄러가 두 개나 있길래 사용안함 처리도 해 버렸다.(친구가 쓰지도 않는 onenote가 자꾸 용량이 부족하다고 난리를 피워서 onenote에서 파일을 삭제했다가 로컬에서도 삭제돼서 파일을 싹 날린 적이 있어서 특히 비호감이다...)

아무튼, 나는 새로운 설정을 넣어 주고 싶었다.

🚩목표

  1. 매일 컴퓨터를 켜면 작업한다.
  2. powershell을 열어 명령어를 입력한다.
  3. C드라이브의 port forwarding 파일을 실행한다.

그럼 오른쪽에서 작업 만들기를 선택해 보자.

먼저 맨 위의 탭들을 보면 대략의 구성을 확인할 수 있다.
일반 - 트리거 - 동작 - 조건 - 설정.

이름과 설명은 적절히 작성해 준다. 아래의 보안 옵션에서 사용자의 로그온 여부는 따로 선택하지 않고 기본 설정으로 두었다.

트리거

말 그대로 작업이 실행되도록 할 방아쇠다. 이 경우는 확실한 트리거가 있다. 새로 만들기를 눌러 보면 다음과 같다:

바로 시작할 때를 찾을 수 있다! 아래의 고급 설정들은 시작할 때가 선택되면 비활성되므로 신경쓰지 않는다.
확인을 누르면 설정한 트리거가 추가된다.

작고 귀여운 트리거로구나!




동작

트리거를 선택해 시작할 조건을 설정해 주었으면, 이제 어떤 것을 실행할 것인지에 대해 설정해 줄 차례다.

동작의 첫 번째 화면은 트리거와 비슷하게 비어 있으므로, 굳이 스크린샷을 찍지 않고 바로 새로 만들기를 선택해 진행한다.

어떤 일이 일어나야 하는가? 라고 한다면 아까의 목표를 다시 읽어보자.

powershell을 열어 명령어를 입력한다.

찾아보기(R)를 선택하면 실행할 파일을 선택할 수 있다. powershell을 열어야 하는데 항상 시작 프로그램에서 검색해 실행했으므로, 파일을 선택하기가 어렵다. 시작 프로그램에서 우클릭해 경로를 검색하고 해당 경로를 복사해 스케줄러에서 찾는다.

파일을 선택해 주면 다음과 같다.

목표에서 powershell을 여는 것까지는 이걸로 해결되지만, 명령어를 입력하는 것은 어떻게 해야 할까? 인수 추가 부분에 Set-ExecutionPolicy RemoteSigned 을 입력해 주면 된다.

이 방식으로 예를 들어 크롬을 선택하고 인수에 링크(http://naver.com 등)를 입력하면 컴퓨터가 켜질 때마다 네이버가 켜진다.


아무튼 이렇게 되면 컴퓨터가 켜질 때마다 명령어를 실행한다. Set-ExecutionPolicy는 실행 규칙을 변화시키는 명령어로 RemoteSigned는 컴퓨터가 신뢰하지 않는 스크립트를 실행할 수 있게 된다. 안드로이드 핸드폰으로 치면 신뢰할 수 없는 어플리케이션을 설치할 때 뜨는 경고문 같은 거다.

여기까지 했으면 다 된 것일까? 아니다. 아직 해야 하는 동작이 남아 있다.



C드라이브의 port forwarding 파일을 실행한다.

내가 작성한 스크립트 파일을 실행하기 위해 규칙을 변경했으니, 이번에는 실행할 차례인 것이다.

다시 동작을 추가한다. 무난하게 실행할 파일을 선택하고, 혹시 모르니 시작 위치를 동일하게 C드라이브로 설정한다.

완성하면, 아래처럼 2개의 동작이 추가되어 있다. 순서도 오른쪽 버튼으로 지정할 수 있다.

남은 조건과 설정에는 특별히 설정해줄 것이 없다.




마치며

재부팅을 세 번쯤 해 가며 실험해 보았는데, 이제 파워쉘을 열지 않아도 알아서 실행되니 이렇게 편할 수가 없다. 다른 작업들도 매일 하는 게 있다면 추가해주고 싶다. 재미있네~

profile
DA DA DA

0개의 댓글