[ot] 구글 클라우드 플랫폼에 사용자가 설치한 메일서버(mta)에서 메일을 정상적으로 수신하는 방법 -- 어마무시하게 빡셉니다

이제 구글 클라우드 플랫폼에서 가상이미지 우분투/데비안 내부에다
Postfix/Exim/qmail 같은 MTA 를 설치해서 메일을 보내고 받는거 _둘_다 실험이 가능합니다.
위의 문서 내용을 정확히 이해하고 소화하기가 쉽지 않습니다… 매우 빡셉니다. 하지만 그 누군가에겐 필요한 정보라 생각되어 여기에 링크 남깁니다.

참고로 보내는건 메일건/메일젯/센드그리드 같은 외부 서비스에 붙여서 2525 포트로 쏘아야 바깥 세상으로 메일을 보낼 수 있습니다.

[본 글은 크롬OS 에서 작성했습니다]

보내는 것. 좀 더 상세한 도움문서 링크 남깁니다.
*** 엄청 빡셉니다 이해하려면 머리 터져나갑니다 ***
구글 클라우드 플랫폼에서 우분투/데비안 내부에 MTA qmail/Exim/Postfix 등을 설치했다는 가정하에 필요한 정보입니다.
발신을 어떤 경로로 해야 하는가에 대한 방법입니다.

센드그리드 ===> smtp.sendgrid.net [2525]
메일건 ===> smtp.mailgun.org [2525]
메일젯 ===> in.mailjet.com [2525]
지-수트(구: 구글앱스) ===> smtp-relay.gmail.com [587]

[1] 구글 클라우드 플랫폼 내부에서 외부로 전자메일 발신방법 4가지 경로:

[2] 구글 클라우드 플랫폼 내부에서 외부로 전자메일 발신방법 4가지 경로중 지-수트[smtp-relay.gmail.com] 경유:
(구 구글앱스 무료판 사용자는 지-수트 베이직 또는 그 이상으로 판올림해야만 smtp-relay.gmail.com 을 쓸 수 있습니다)
G Suite SMTP Relay configuration for GCP Private Compute Instances. | by Mukesh Panigrahi | Searce

[우분투 18.04 파여폭스 나비로 작성했습니다]

구글앱스 무료판을 아직 쓰시는 분에게 희소식이 있습니다. 늘 사용하시던 smtp.gmail.com 을 쓸 수 있습니다.
아래의 참고문헌 [1] 이 도움이 됩니다. 구글앱스 무료판 사용자로써, 저도 직접 테스트 [2] 해봤습니다.
이로써 매달 계정당 미화 5달라를 지출하지 않아도 됩니다. ^구글앱스에 감사하고 또 감사드립니다_^))//

[1] http://dev.robbertvermeulen.com/postfix-google-apps-smtp-relay-google-compute-engine/
[2] ss/test-from-gcp.mail.txt · 8d87de5b083910195f8178600ef360521c84db91 · ^고맙습니다 _布德天下_ 감사합니다_^))// / Gnus · GitLab

[본 댓글은 우분투 18.04 파여폭스 나비에서 작성했습니다]

추가 정보 드립니다. Amazon SES 태워서 바깥으로 날릴 수도 있습니다.
첨부한 로그는 GCP 내부 우분투 18.04에 깔린 Postfix 의 메일시스템 로그입니다.

Mar 21 13:07:44 bionic190316003 postfix/smtpd[1685]: connect from localhost[127.0.0.1]
Mar 21 13:07:46 bionic190316003 postfix/smtpd[1685]: 0C7A93F623: client=localhost[127.0.0.1]
Mar 21 13:07:46 bionic190316003 postfix/cleanup[1698]: 0C7A93F623: message-id=<> 87ftrg9y01.fsf@delta.birch.chromebook> >
Mar 21 13:07:46 bionic190316003 postfix/qmgr[1178]: 0C7A93F623: from=<> soyeomul@red-october.yw.doraji.xyz> >, size=980, nrcpt=1 (queue active)
Mar 21 13:07:46 bionic190316003 postfix/smtpd[1685]: disconnect from localhost[127.0.0.1] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Mar 21 13:07:47 bionic190316003 postfix/smtp[1699]: 0C7A93F623: to=<> soyeomul@gmx.com> >, > relay=email-smtp.us-east-1.amazonaws.com[50.16.221.2]:2587> , delay=1.7, delays=0.62/0.01/0.64/0.43, dsn=2.0.0, status=sent (250 Ok 01000169a05d5e0d-4347ebe4-e5b7-4ff3-ace7-9ee471b52247-000000)
Mar 21 13:07:47 bionic190316003 postfix/qmgr[1178]: 0C7A93F623: removed

AWS-SES 2587 포트로 쏴야 정확히 꽂힙니다. 구글-클라우드와 AWS에 감사드립니다^^^

[우분투 18.04 파여폭스 나비에서 작성했습니다]

구글 클라우드 플랫폼 내부 우분투에 깔린 메일서버 MTA 를 사용하기위하야 수신 포트 25번을 개방합니다.
자세한건 아래 참고문헌을 훓어보시면 도움이 되실거라 생각해요^^^

참고문헌:
[0] php - How to receive email on Google Compute Engine - Stack Overflow
[1] http://ai.net.nz/wiki/index.php?title=HowTo:Google_VM
[2] https://it.i88.ca/2015/01/google-compute-engine-firewall-example.html
[3] ss/Screenshot_from_2019-03-25_01-30-18.png · f834dff71051e8037ce159ac2273b1ce75abb3bc · ^고맙습니다 _布德天下_ 감사합니다_^))// / Gnus · GitLab

[크롬북에 깔린 우분투 18.04 파여폭스 나비에서 작성했씁니다]

구글 클라우드 플랫폼 내부 우분투에 깔린 MTA Postfix.
포워드(forward) 동작을 이리저리 여러 문서를 보면서 구현에 성공했습니다.
https://gitlab.com/soyeomul/Gnus/tree/master/ss/20190325001 에다 제가 테스트한 결과물을 올렸습니다.

오픈소스 프로젝트에서 헌신적인 카르마가 가득찰때에
해당 프로젝트에선 그/그녀에게 소중한 계정을 선사합니다.
그럼 ssh 로 프로젝트 서버(예: people.freebsd.org)에 접속하여,
~/.forward 파일을 만들어 그곳에 실제 자신의 최종메일박스의 전자메일 주소를 기재합니다.
예 그런점을 역할모델로 해서 구글 클라우드 MTA 를 구성했습니다.

수신되는 모든 메일들을 포워드(forward)하기에 클라우드엔 메일관련 데이타가 쌓이지 않습니다.
이로써 무료로 계속 구글 클라우드를 쓸 수 있어서 좋구요.

포워드 동작이 정말 어렵습니다. 아웃본드(외부로 향하는) 포트 25번이 막혀있는 까닭입니다.
이건 사용자가 열지 못합니다. 구글의 정책입니다.
그래서 바깥에 있는 무료 중계호스트에 태워서 메일을 포워드 시킬수 밖에 없습니다.

거의 대부분의 아웃본드 서비스는 AUTH(인증)을 통해서만 중계(Relay)를 해주기에…
그걸 자연스럽게 처리하기위하야… 약간 닭질(헤더 재작성[1])이 필요했습니다.

닭질통해 깨달은건
돈이 있으면 그냥 지-수트(구: 구글앱스) 쓰는게 훨씬 안정적이며 정신건강상 좋다는거…^^^

^고맙습니다 감사합니다_^))//

[1] http://www.postfix.org/header_checks.5.html

[우분투 18.04 파여폭스 나비에서 작성했습니다]
[크롬OS 에서 오타 수정 및 주석 보완했씁니다]

관리 차원에서 클라우드 내부 우분투의 디스크 용량 사용현황을 매일 매일 관리자에게 전자메일로 보내게끔 크론과
루비 스크립트를 짜서 돌려봤습니다. 무료로 계속 클라우드를 쓰려면 어쩔 수 없는 선택같아요. 디스크 용량 점검요~
아래는 구글 클라우드 크론에서 저에게 보내온 메일 전체 헤더입니다.
https://gitlab.com/soyeomul/Gnus/raw/master/ss/gcp-cron-mail-20190327001.mbox.txt





soyeomul@bionic190316003:~/bin$ cat send.rb
#!/usr/bin/env ruby2.5
# -*- coding: utf-8 -*-

today = `date --iso-8601=date`.chop!
vm_name = "bionic190316003"
cmd_disk_stat = "/home/soyeomul/bin/disk-stat-bionic190316003.rb"
mailto = "soyeomul+gcp@gmail.com"
mail_send_action = "#{cmd_disk_stat} | mail -s 'Internal report #{today} - #{vm_name}' #{mailto}"  

system(mail_send_action)



soyeomul@bionic190316003:~/bin$ cat disk-stat-bionic190316003.rb
#!/usr/bin/env ruby2.5
# -*- coding: utf-8 -*-

ls_stat = `ls -lh /var/log`
df_stat = `df -h`

puts "# ls -lh /var/log"
puts ls_stat
puts "# df -h"
puts df_stat
puts "#" + "Updated: " + `date`

[우분투 18.04 파여폭스 나비에서 작성했습니다]
[ 크롬OS 에서 오타 수정했습니다]

간혹 필요한 상황이 생깁니다. loop 발생시나 기타 여러가지 상황에서…
~/.forward 파일에 /dev/null 을 기재하면 도착한 메일이 로컬 시스템의 /dev/null 로 사라집니다…

soyeomul@bionic190316003:~$ cat ~/.forward
/dev/null



그리고 나서 postfix 를 멈춘후에 loop 장애 처리를 합니다.
postqueue 와 postsuper 두 명령어가 유용합니다.
아래 명령어는 postfix 가 멈춘후에도 작동합니다.
**sudo postqueue -p**' 큐 현황을 출력해줍니다. sudo postsuper -d ALL’ 모든 큐를 삭제합니다.
기타 등등 매뉴얼 페이지를 참조하면 세상이 조용해집니다^^^

[우분투 18.04 파여폭스 나비에서 적었습니다]

포워드되는 메일을 최종메일함(Gmail) 쪽으로 넘겨줄때에 Amazon SES 를 중계(Relay) 호스트로 지정했을때에 어떤 결과가 나올지 궁금했네요. 좀 빡셌습니다. 다음 문서를 참조했씁니다:

아래는 그 결과물입니다. 메일로그와 최종메일함의 도착 모습.

^고맙습니다 감사합니다_^))//

ps. 본 테스트 끝나고 기본중계호스를 AWS-SES 에서 다시 Gmail[smtp.gmail.com] 으로 원상복구시켰습니다.
Gmail[smtp.gmail.com] 이 여러가지로 좀 안정적인 까닭입니다^^^

[우분투 18.04 파여폭스 나비에서 작성했씁니다]

포워드 메일만 처리하지만 그래도 명색이 메일서버인지라…
RFC2142 에 따라 시스템이 기본적으로 갖추어야 할 몇몇 mailbox 들을 정리했습니다.

~root/.forward 파일에 받고싶은 전자메일주소를 적어도 괜찮습니다.
개인적으로 postmaster 쪽으로 가는 메일들은 그냥 ssh 로 로그인해서 시스템 내부에서
mail 명령어로 읽습니다. 때론 `sudo cat ~root/Mailbox’ 라는 무식한 명령어를 쓸때도 있고요,

^고맙습니다 감사합니다_^))//

[우분투 18.04 파여폭스 나비에서 적었씁니다]

postfix 메일로그 살펴보다가 어디에서 알고 저렇게들 접근할까 이게 무척이나 궁금했어요. 하나씩 일일이 whois 정보 조회하는게 빡세서
파이썬으로 자동화 시켜봤습니다. 그리고 알림메일까지 보내는것도 소소하게 구현했어요~

다음 URL에서 소스코드(ip_info.py, send.py) 확인할 수 있어요~
https://gitlab.com/soyeomul/Gnus/tree/master/bionic190316003

^고맙습니다 감사합니다_^))//

[우분투 18.04 파여폭스 나비에서 작성했씁니다]
20190331001.mbox.png

구글 클라우드 플랫폼에서 VM 을 처음에 만들때에 f1-micro 를 선택을 할 수가 없습니다.
차후 `gcloud’ 명령어를 통해서 변경할 수 있습니다.
f1-micro 유형은 진정한 의미의 always free 입니다.

곁가지로 함께 알아두면 좋은 예시 명령문들입니다.
VM인스턴스 시작: gcloud compute instances start _bionic190316003_ --zone _us-west1-b_' VM인스턴스 정지: gcloud compute instances stop bionic190316003 --zone us-west1-b

참고문헌: (구글 클라우드 쉘 명령어 도움말)
https://cloud.google.com/sdk/gcloud/reference/compute/instances/set-machine-type

[우분투 18.04 파여폭스 나비에서 적었습니다]
[크롬OS 에서 오타 수정했습니다]

출처(한글): https://web.facebook.com/groups/googlecloudkorea/permalink/1562781313853126/ (구글 클라우드 플랫폼 한국 사용자 그룹)
출처(영문): https://www.techrepublic.com/article/google-cloud-charging-for-ipv4-but-proper-ipv6-support-is-still-missing-in-action/ (해외 기사)

2020년 1월 1일부터 가격 정책이 바뀐다고 합니다.

제가 이해한바에 의하면,
(IPv4에 한해서) 임시 IP 면 괜찮으나, 고정 IP 로 변경할 경우에 (쓰지않더라도) 비용이 발생한다라는 뜻 같았어요.

클라우드 관련 비용이 꽤 복잡합니다… 아래 참고문헌 구글 공식 문서도 차근히 함 살펴보심 도움이 될거에요 ;;;

놀라운점이 네트워크 서비스 계층 분류에서,
프리미엄 계층엔 “Always free” 적용이 가능하고,
표준 계층엔 “Always free” 적용이 불가하답니다.
이 부분을 이해하기가 참 어려웠는데… 왜 그랬는지 좀 더 배경을 찾아봤더니…

"프리미엄"은 구글망. "표준"은 타사 ISP망 이었던겁니다.

FAQ 에서 좀 더 읽어보니 사용 대역폭 단가는 프리미엄계층보다 표준계층이 좀 더 쌉니다.
표준계층이 단가가 좀 더 싼건 맞지만 “Always free” 는 프리미엄계층에만 적용된다는걸 다시 한번 강조합니다.
FAQ 도 아래 참고문헌속에 있습니다.

제가 이해한것중 틀린것이 있다면 관련 전문가분께서 지적해주심 미리 감사드립니다.

꾸벅,

참고문헌: 구글 공식 문서

(1) https://cloud.google.com/network-tiers/pricing (네트워크 서비스 계층 가격 책정 안내문서)
(2) https://cloud.google.com/network-tiers/docs/overview (네트워크 서비스 계층 머릿말)

[크롬OS 에서 작성했씁니다]
[크롬OS 에서 세부내용을 보강했습니다 – 20190925]
Screenshot 2019-09-23 at 11.25.36 PM.png
Screenshot 2019-09-23 at 11.12.48 PM.png

소스코드(파이썬3): https://github.com/tedder/aws_lambda_ses_forwarder_python3
소스코드(파이썬2): https://gist.github.com/skylander86/d75bf010c7685bd3f951d2b6c5a32e7b

뭐하는 물건인지는 Amazon SES 를 쓰는 사람들중에서 Amazon SES 를 MX 로 설정하신분들중에서 Work 메일 대신 Foward 통해서
도착하는 모든 메일들을 Gmail 로 넘기어서 메일을 쓰시는 분들중에서 람다기능을 NodeJS 대신 파이썬으로 구현된것을 찾는분들에게 필요한 자료입니다.

저 자료를 필요로 하는 분은 아마도 대한민국 인구의 0.00000000000000000000000000001% [**]
에 수렴할거라 생각합니다…
파이썬을 쓰는분은 많아도 전자메일을 쓰는분들중 개인도메인으로 Amazon SES 와 연동하시는분은 거의 없는 까닭입니다.

하여간 AWS 람다기능 언어중 하나인 NodeJS 8.10 의 EOL 이 올해 12월 31일자로 종료되니깐 알아서 하라는
AWS 의 친절 알람메일이 도착해서 이참에 대체제를 찾아봤더니 파이썬으로 구현된것이 있더라구요…

실험해보고서 다시 감상문 남길께요;;;

갱신: Amazon SES 파이썬3 람다 실험 실패했씁니다. 제 역량 부족입니다. 정말 어렵습니다… [10월 19일 저녁 9시경]
갱신: Amazon SES 람다 실험 파이썬 2.7 판으로 재시도해서 겨우 성공했습니다 [10월 21일 밤 10시경]
(skylander86님의 코드를 조금 고쳐서 AWS 에 올려서 성공했습니다 아래에 diff 첨부했습니다)

--- lambda-ses-forwarder.py	2019-10-21 23:07:38.567542832 +0900
+++ lambda_function.py	2019-10-21 23:21:54.443542883 +0900
@@ -12,12 +12,12 @@
 from botocore.exceptions import ClientError
 
 FORWARD_MAPPING = {
-    'source@example.com': ['email1@gmail.com', 'email2@gmail.com'],
+    'soyeomul@bullseye.yw.doraji.xyz': ['soyeomul+bullseye@doraji.xyz', 'soyeomul@gmail.com'],
 }
 
-VERIFIED_FROM_EMAIL = os.environ.get('VERIFIED_FROM_EMAIL', 'noreply@example.com')  # An email that is verified by SES to use as From address.
+VERIFIED_FROM_EMAIL = os.environ.get('VERIFIED_FROM_EMAIL', 'soyeomul@bullseye.yw.doraji.xyz')  # An email that is verified by SES to use as From address.
 
-SES_INCOMING_BUCKET = os.environ['SES_INCOMING_BUCKET']  # S3 bucket where SES stores incoming emails.
+SES_INCOMING_BUCKET = 'mbox-bullseye-2019030203' # S3 bucket where SES stores incoming emails.
 
 s3 = boto3.client('s3')
 ses = boto3.client('ses')
@@ -25,8 +25,7 @@
 logger = logging.getLogger(__name__)
 logger.setLevel(logging.INFO)
 
-
-def handle(event, context):
+def lambda_handler(event, context):
     record = event['Records'][0]
     assert record['eventSource'] == 'aws:ses'

(아 여기에 이 댓글이 올수 있는게 구글클라우드플랫폼에 설치된 Postifx와 Amazon SES 랑 전 연동하고 있거등요,)
(쉽게쉽게 가도 될텐데 왜 이리 어려운길을 가는가에 대하여… Gmane – 오픈소스 플젝 메일링리스트들의 NNTP 서비스 – 재건을 위한 공부를 하고있거등요,)

주석 및 참고문헌:

[] 아마존 SES + Gmail 설정하기 (한글): https://blog.rajephon.dev/2018/10/06/Amazon-SES-Setup-00/
[] 믿기힘들겠지만 저 확률은 대한민국에서 리눅스 데스크탑 (Gnome류) 사용자보다 더 적을거 같아요~
[
] 아마존 SES + Gmail 설정하기 (일본어): https://qiita.com/komakomako/items/a1ed84b58b46eb434cf2

[우분투 18.04 파여폭스 나비에서 작성했씁니다]
[크롬OS에서 파이썬 람다 실험 실패 내용을 첨언했습니다 – 20191019]
[우분투 18.04 파여폭스 나비에서 SES 기술문서 일본어판을 추가했습니다 – 20191021]
[우분투 18.04 파여폭스 나비에서 람다실험 파이썬2.7 성공한것을 정리후 기록했습니다] – 20191021]
스크린샷, 2019-10-21 23-42-33.png
스크린샷, 2019-10-21 22-52-27.png
Screenshot 2019-10-21 at 10.55.02 PM.jpg

위의 아마존 SES 람다 포워딩 (with Gmail) 참고문헌을 더 추가합니다.

갱신: 위에서 실패한 AWS 파이썬3 람다 성공했습니다. diff(py3-patch.txt) 첨부합니다. [10월 22일 밤 9시경] ;;;
갱신: 수정된 파이썬3 코드로 AWS 람다 실행환경 파이썬3.7 통과했습니다 [10월 22일 밤 10시경] ;;;

참고문헌:

[****] 아마존 SES + Gmail 기술문서 (영어): https://blog.techcompanyprofiles.org/index.php/2019/01/20/use-your-personal-gmail-for-free-with-your-custom-domain-name/
[*****] AWS 람다 파이썬3.6 + SES 활용 사례 (한글): https://github.com/0kim/myReceipts/blob/master/ch4.md

[우분투 18.04 파여폭스 나비에서 작성했씁니다]
[우분투 18.04 파여폭스 나비에서 파이썬3 람다 성공한것을 정리후 기록했습니다]
[크롬OS 에서 AWS 람다 파이썬 활용사례를 한건 추가했습니다]
스크린샷, 2019-10-22 21-08-49.png
스크린샷, 2019-10-22 21-07-48.png
py3-patch.txt (2.2 KB)
CustomDomainName-Flow-1.png

[갈무리]

본 글타래는 여기서 마무리 짓습니다.
구글 클라우드 플랫폼 (구글 콤푸타 엔진)이든 AWS 든 VM 을 하나 생성해두었으면 모든걸 알림메일로 자동화시켜두었더라도…
매일은 못해도 일주일에 한번씩은 반드시 ssh 로 접속을 해서 VM 상황을 한번씩 점검하심을 강력추천드립니다.

VM 은 살아서 움직이는 생명처럼 다루어야 합니다. 한번씩 [보안 판올림하세요]하는 메시지가 접속하면 첫 화면(MOTD)에 뜹니다.
우분투 VM 같은 경우엔… apt-get update 그리고 apt-get upgrade 정도만 알아도 꾸준히 VM 을 유지-보수 할 수 있을거라 생각하네요.

전 아직 9개월동안 무사고운전중입니다.

^고맙습니다 감사합니다_^))//

소여물 황병희 드림

[우분투 18.04 파여폭스 나비에서 작성했습니다]
Screenshot from 2019-12-04 10-54-32.jpg