안녕하세요? 도정진입니다.
음.. 4G 환경은 NAT 환경이라 이것을 극복하기 위해 OpenVPN 의 TAP 모드를 사용하거나 PPTP VPN 을 도입하는 방법이 있습니다. 그런데 드론 송출 관련으로 Gender Changer 라는 개념이 있어서 소개드립니다.
소개와 실측 테스트를 진행할 예정입니다.
기본적으로 리눅스 명령에 socat 이라는 명령이 있습니다. 기본적으로 xmltv.sock 에 epg 를 쏠때 사용한다고 알고 계실 텐데요. 저도 물론 그렇습니다. 이게 정확하게 무엇을 하는 것인지? 정확하게 지금도 모릅니다.
특정 TCP 포트와 UDP 포트에 대해서 socat 명령으로 릴레이를 할 수 있습니다. 이전에는 pwnat 이나 turnserver (coturn) 의 솔루션을 도입하려고 했습니다만, 이게 음.. 그렇게 만만하지가 않더라구요. pwnat 의 경우 이미 지금의 NAT 에서는 작동을 하지 않는 솔루션입니다.
일단 간단하게 socat 으로 TCP 릴레이를 해보겠습니다.
이와 관련하여 많은 외국 자료들을 서칭하였고 아래의 만족스러운 글을 찾아볼 수 있었습니다.
http://www.dest-unreach.org/socat/doc/socat-gender.txt
원리는 이렇습니다.
1. socat 명령으로 릴레이 하기
기본적으로 아래와 같이 릴레이를 하시면 됩니다.
공인아이피를 받는 서버에서 40000번 40001번 포트 2개를 열어줍니다. 40000번은 NAT 상태에 있는 서버랑 통신하는 용도, 40001번은 클라이언트가 연결할 포트입니다.
1. 서버측 (100.100.100.100)
socat tcp-listen:40000 tcp-listen:40001
2. NAT 상태의 서버 (TVHeadend TCP 포트)
socat 100.100.100.100:40000 localhost:9981
3. NAT 상태의 서버로 접근하려는 클라이언트
http://100.100.100.100:40001/
이런식으로 가능합니다.
socat 옵션에 fork 옵션과 reuseaddr 옵션이 있습니다. fork 옵션을 주게 되면 클라이언트가 연결을 끝더라도 연결이 지속됩니다. 계속 Child 프로세스를 만들기 때문입니다.
reuseaddr 의 경우 특정 프로그램들을 실행하고 종료할 때, 종료를 했음에도 불구하고 Address Already in use 라는 에러가 발생할 때가 있습니다. 이런 경우 TCP 컨넥션 단계중에 TIME_WAIT 에 걸려서 그렇습니다.
이 부분을 완화 하기 위해서 reuseaddr 옵션을 사용하는 것입니다.
이 옵션을 반영하면 아래와 같이 명령을 작성하면 됩니다.
socat tcp-listen:40000,fork,reuseaddr tcp-listen:4001
이외 관련하여 retry 옵션이 부여되어야 하고 udp 의 경우 tcp 가 아닌 udp 로 수행이 가능합니다.
한편으로는 프로그램 실행시 나오는 stdout 을 socat 으로 열어둘 수도 있습니다. 프로세스 실행 상태를 telnet 으로 확인이 가능합니다.
(이러한 용도까지 사용되는 것인지 이제 알았네요.)
2. TCP Gender Changer (tgcd)
상기 명령 입력이 귀찮아 다른 분이 만들어 둔 소스가 있습니다.
https://github.com/kirgene/tgcd
상기 소스를 다운받아 컴파일 하여 실행해 보겠습니다. 두 곳 모두 있어야 합니다.
# 소스 받기
root@AOL-Debian:~# git clone https://github.com/kirgene/tgcd.git
Cloning into 'tgcd'...
remote: Enumerating objects: 46, done.
remote: Total 46 (delta 0), reused 0 (delta 0), pack-reused 46
Unpacking objects: 100% (46/46), done.
Checking connectivity... done.
# 소스 폴더로 이동
root@AOL-Debian:~# cd tgcd/
# 빌드 의존성 설치
root@AOL-Debian:~/tgcd# apt install autoconf build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
g++-4.9 libstdc++-4.9-dev python-colorama python-distlib python-wheel
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
cpp cpp-8 g++ g++-8 gcc gcc-8 gcc-8-base libasan5 libatomic1 libcc1-0 libgcc-8-dev
libgcc1 libgomp1 libisl19 libmpc3 libmpfr6 libstdc++-8-dev libstdc++6 libubsan1
Suggested packages:
autoconf-archive gnu-standards autoconf-doc cpp-doc gcc-8-locales gcc-8-doc
libstdc++6-8-dbg gcc-multilib flex bison gdb gcc-doc libgcc1-dbg libgomp1-dbg libitm1-dbg
libatomic1-dbg libasan5-dbg liblsan0-dbg libtsan0-dbg libubsan1-dbg libmpx2-dbg
libquadmath0-dbg libstdc++-8-doc
The following NEW packages will be installed:
cpp-8 g++-8 gcc-8 libasan5 libcc1-0 libgcc-8-dev libisl19 libmpfr6 libstdc++-8-dev
libubsan1
The following packages will be upgraded:
autoconf build-essential cpp g++ gcc gcc-8-base libatomic1 libgcc1 libgomp1 libmpc3
libstdc++6
11 upgraded, 10 newly installed, 0 to remove and 608 not upgraded.
Need to get 25.6 MB/26.4 MB of archives.
After this operation, 72.7 MB of additional disk space will be used.
Do you want to continue? [Y/n]
# autoreconf 실행
3. tgcd 테스트
1. 서버측
root@debian-4350:~/tgcd# tgcd -L -p 40000 -q 40001
root@debian-4350:~/tgcd# netstat -nlp | grep tgcd
tcp 0 0 0.0.0.0:40000 0.0.0.0:* LISTEN 97416/tgcd
tcp 0 0 0.0.0.0:40001 0.0.0.0:* LISTEN 97416/tgcd
2. NAT 환경 서버측
'서버 > 리눅스 서버' 카테고리의 다른 글
리눅스 네트워크 사용량 모니터링 하기 (U5MINI / U5PVR) (0) | 2019.04.08 |
---|---|
구글 드라이브 마운트 (rclone, cache, api) (7) | 2019.03.18 |
Subsonic + Google Drive 스캔 문제 해결하기 (0) | 2019.02.03 |
트랜스미션 다운로드 완료 후 자동 구글 드라이브 업로드 스크립트 (7) | 2019.01.15 |
Seafile Server 설치하기 (init.d / Apache2 proxy / Debian 9 Stretch) (9) | 2018.12.19 |
댓글