podman과 ufw, iptables

내 일본 VPN, proxy 서버 역할을 해주던 Ubuntu 18.04 VPS가 사양이 딸리는지 docker로 올려둔 proxy 서버가 뻑하면 죽어대어서, 22.04부터 메이저 저장소에 도입된 podman으로 갈아타볼까 싶어서 삽질을 시작.

22.04 업그레이드

일단 Ubuntu 18.04를 22.04로 올리기 위해 두번의 do-release-upgrade를 수행했는데 20.04에서 22.04로 올릴 때 문제가 발생했다.

기존 18.04에선 docker로 하고 있다보니, 20.04까진 잘 되었지만 podman과의 호환 문제인지 20.04에서 22.04로 올릴 때 다음과 같은 에러가 발생한 것이다. 웃기게도 업그레이드는 완료되었는데 에러가 발생했다.

Sorry, this storage driver is not supported in kernels for newer
releases

There will not be any further Ubuntu releases that provide kernel
support for the aufs storage driver.

Please ensure that none of your containers are using the aufs storage
driver, remove the directory /var/lib/docker/aufs and try again.

솔직히 너무 당황스러워서 제대로 에러문도 못 읽었는데, 에러문에 어떻게 하면 되는지 다 적혀 있었다. /var/lib/dpcker/aufs 그냥 지우면 되는 거였다.
ref: https://askubuntu.com/a/1423194

이후 apt autoremove 등을 수행해서 마무리 지었다.

ufw 오동작

어째서인지 업그레이드를 통해 22.04를 깔고난 뒤 ufw가 동작을 하지 않더라. 일단 default deny부터 동작을 하지 않고 있었다. 사실 이건 바로 알아채질 못했는데 podman의 port expose가 동작하지 않아 ufw를 재설정하다가 알게 되었다.

난 업그레이드 후 SSH가 정상 접속 되길래 ufw 설정이 그대로 잘 전달된 줄 알았지.. 그런데 막상 ufw reset 후 다시 포트들 다 풀어주고 ufw default deny를 하는 순간 SSH가 끊어져 버렸다. 이게 대체 무슨 일인건지 알 수가 없었다. iptables 싹 다 백업하고 날리고 다시 다 설정해봤지만 매한가지였다.

결국 다른 내 VPN의 올바른 iptables 설정을 살펴보다보니 알 수 있었다.

왜인지 이유는 알 수 없지만 아래 설정들이 싹 다 날아갔고, 재설정 후 다시 설정을 해도 이 설정들은 살아나질 않았다. 따라서 수동으로 직접 추가했다.. ㅠㅠ

아래 내용을 iptables*filter 항목에 추가하면 된다.

-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output

이제 SSH는 잘 되네.

podman port 안 열림

SSH는 잘 열리는데 podman에서 expose한 port들은 죽어도 열리질 않더라.. 내 다른 VPS를 뒤져봐도 관련된 정보를 찾을 수 없었고..

이것도 분명 iptables 문제라는건 알겠고 cni-podman0 인터페이스에 뭔 짓거리를 해야한다는 거까진 알겠었는데.. 하.. iptables를 내가 그렇게 잘 다루는 것도 아니다보니..

그래서 podman 컨테이너들을 rootless로 올려봤는데, 엥 proxy는 접속이 된다. 동작도 되고.. 그런데 VPN은.. Windows에선 접속이 안 되고, iOS에선 접속은 되는데 통신이 안 된다.. ㅋㅋㅋ 즉, 안 된다. (어차피 500번 포트 때문에 rootless에서는 sysctl 옵션도 만지고 해야하긴 한데 아무튼 안 되더라.)

VPN이 rootless라서 그런가 싶어 root로 올리면 아예 어디에서도 안 되고, rootless로 올리고 컨테이너 로그 확인해보니 /dev/ppp 장치가 없어서 L2TP는 아예 동작도 안 되더만. -v /dev/ppp:/dev/ppp 넣어두고 올려보니 IPSec VPN이랑 IKEv2는 열리더라. privileged 없이 컨테이너 올려보려고도 해봤는데 이건 아예 sysctl 때문에 컨테이너 올리기부터 안 되더라.

그래서 일단 rootless로 다 올려두고 방치하고 있었는데, 결국 방법을 찾았다.

그래 결국 iptables 설정 문제였다.

ref: https://stackoverflow.com/a/71526980
ref: https://access.redhat.com/solutions/5885821

두번째 레드햇 링크의 내용처럼, iptables*filter 항목에 다음 내용이 추가되면 된다.

:CNI-FORWARD - [0:0]
-A CNI-FORWARD  -o cni-podman0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A CNI-FORWARD  -o cni-podman0 -j ACCEPT
-A CNI-FORWARD -i cni-podman0 ! -o cni-podman0 -j ACCEPT
-A CNI-FORWARD -i cni-podman0 -o cni-podman0 -j ACCEPT

나 같은 경우 :CNI-FORWARD - [0:0]는 이미 들어있길래 적당한 곳에 나머지 애들을 넣어줬다.

그리고 VPN 컨테이너는 root로 올려줬더니 아무 문제없이 다 잘 되더라..

하..

대체 뭐가 문제길래 ufwiptables가 이러는건지 모르겠네..