firewalld 및 iproute2로 포트 포워딩

소개



특정 포트의 통신을 특정 게이트웨이를 통해 수행하려고합니다.

이전에 "nginx를 minecraft의 프록시로 사용"이라는 기사를 썼습니다.
테이블에있는 서버와 응용 프로그램을 실행하는 서버를 분리하는 이야기이지만 TCP 레이어의 프록시를 사용하기 때문에 응용 프로그램에서 볼 때 연결의 IP 주소가 프록시의 주소가됩니다. .
이번에는 IP 패킷을 포워딩하여이 문제를 피해 보겠습니다.

네트워크 구성



1

minecraft: VM(VirtualBox), Minecraft(25565번 포트)를 움직이는 예상 서버
gateway: VM(VirtualBox), client로부터의 패킷을 직접 받는 서버
client: 호스트 머신, Minecraft 클라이언트 이동

gateway의 네트워크 어댑터는 브리지 어댑터를 사용하여 호스트 시스템과 동일한 네트워크에 배치합니다 (DHCP이므로 라우터 구성에서 게이트웨이 IP를 192.168.0.101에 고정합니다).
minecraft-gateway 사이는 내부 네트워크를 통해 연결됩니다.

설정 내용



내부 네트워크 설정



게이트웨이


nmcli c add type ethernet ifname enp0s8 con-name enp0s8
nmcli c m enp0s8 ipv4.method manual ipv4.addresses 10.0.0.101/24 connection.autoconnect true

minecraft


nmcli c add type ethernet ifname enp0s8 con-name enp0s8
nmcli c m enp0s8 ipv4.method manual ipv4.addresses 10.0.0.102/24 connection.autoconnect true

포트 포워딩 설정



게이트웨이


# ip_forwardを有効化
echo 1 > /proc/sys/net/ipv4/ip_forward

firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -p tcp --dport 25565 -j DNAT --to 10.0.0.102
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -p tcp --sport 25565 -j SNAT --to 192.168.0.101
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -p tcp --dport 25565 -j ACCEPT

기본적으로 커널 설정에서 ip_forward를 사용하지 않도록 설정합니다.

(firewalld) PREROUTING 체인에서 25565번 포트로 향하는 패킷의 목적지를 10.0.0.102로 재기록합니다.
(firewalld) FORWARD 체인에서 25565번 포트로 향하는 패킷이 다른 호스트로 통과하는 허가 설정을 넣습니다.
(firewalld) POSTROUTING 체인에서 소스가 25565번 포트의 패킷의 소스를 10.0.0.102로 재기록합니다.

minecraft


# 経路フィルタの設定
echo 2 > /proc/sys/net/ipv4/conf/enp0s8/rp_filter

firewall-cmd --direct --add-rule ipv4 mangle OUTPUT 0 -p tcp --sport 25565 -j MARK --set-mark 1

ip rule add fwmark 1 table 1
ip route add default via 10.0.0.101 dev enp0s8 table 1

경로 필터에 걸리게 되므로 느슨한 필터 "2"로 변경합니다.

(firewalld) OUTPUT 체인에서, 소스가 25565번 포트의 패킷에 마크 "1"을 붙입니다.
(iproute2) 마크 "1"을 붙인 패킷에 적용하는 루트 테이블을 테이블 "1"로 변경하고 테이블 "1"에 gateway(10.0.0.101)를 통과하는 규칙을 더합니다.

이상의 설정을 넣는 것으로, minecraft 서버로부터 본 client의 IP 주소가 gateway의 것이 아니고, 본래의 것으로 통신할 수 있게 되었습니다.

요약



...
  • 리눅스에서 라우터를 만들 수 있습니다
  • 디버그로 tcpdump 라든지 netcat 잡을 수 있게 되었다
  • BungeeCord를 사용합시다

  • 이런 일을 하려고 하는 사람이 다른 곳인지 모르겠지만, 일단 정리했습니다.
    Minecraft에 국한된 이야기라면 BungeeCord를 사용하는 것이 가장 좋습니다.



    Minecraft의 경우 BungeeCord(Minecraft의 프록시 애플리케이션)가 독자적인 IP Forwarding으로 이를 해결하고 있습니다.

    좋은 웹페이지 즐겨찾기