iptables 및 Firejail 샌드박스를 사용한 포트 전달

iptables 및 Firejail 샌드박스를 사용한 포트 전달

Firejail 샌드박스의 포트 8000에서 HTTP 서버를 실행하고 포트 8888에서 호스트의 모든 인터페이스에 액세스할 수 있도록 했습니다.

전체 시스템은 다음과 같이 표현될 수 있습니다.

+----------------------------------------------------+                                       +-------------+
|                      host-112                      |                                       |  host-238   |
|                                                    |               +-------+               |             |
| +--------------------------+              +-----+  | 192.168.1.112 |       | 192.168.1.238 |   +----+    |
| |       firejail           |              |wlan0+------------------+  NAT  +-------------------+eth0|    |
| |                          |              +-----+  |               |       |               |   +----+    |
| |                          |                       |               +-------+               |             |
| |        +----+   10.0.1.2 |   10.0.1.1  +------+  |                                       |             |
| |        |eth0+--------------------------+my_br0|  |                                       |             |
| |        +----+            |             +------+  |                                       |             |
| |                          |                       |                                       |             |
| |                          |                       |                                       |             |
| |      HTTP server <---------------------------<-------------------------------------------+             |
| |      0.0.0.0:8000        |   HTTP request        |             HTTP request              +-------------+
| |                          |   10.0.1.2:8000       |          192.168.1.112:8888
| |                          |                       |
| +--------------------------+                       |
+----------------------------------------------------+

my_br0다음 명령을 사용하여 브리지 인터페이스 와 iptables 규칙을 만듭니다 host-112.

# Create interface
sysctl -w net.ipv4.ip_forward=1
brctl addbr my_br0
ip addr add 10.0.1.1/24 dev my_br0
ip link set my_br0 up
sysctl -w net.ipv4.conf.my_br0.route_localnet=1

# Add iptables rules
iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -A OUTPUT -p tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -A POSTROUTING -p tcp -o my_br0 -j MASQUERADE
iptables -A FORWARD -i my_br0 -p tcp --dport 8000 -j ACCEPT
iptables -A INPUT -i my_br0 -p tcp --sport 8000 -j ACCEPT

다음과 같이 Firejail 샌드박스에서 HTTP 서버를 실행하고 있습니다.

firejail --noprofile --net=my_br0 --ip=10.0.1.2 python3 -m http.server 8000

localhost에서 요청을 수행하려고 하면 정상적으로 작동합니다.

myself@host-112 $ curl 192.168.1.112:8888
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
...

스크린샷 와이어샤크

그러나 동일한 네트워크의 원격 호스트에서는 작동하지 않습니다.

myself@host-238 $ curl 192.168.1.112:8888
curl: (7) Failed to connect to 192.168.1.112 port 8888: Connection timed out

스크린샷 와이어샤크

브릿지 인터페이스로 요청이 잘 전달되지 않는 것 같습니다.

다음은 Host-112에 대한 iptables 규칙의 전체 목록입니다.

# iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -i my_br0 -p tcp -m tcp --sport 8000 -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i my_br0 -p tcp -m tcp --dport 8000 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A PREROUTING -p tcp -m tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
-A POSTROUTING -s 172.19.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -o my_br0 -p tcp -j MASQUERADE
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -p tcp -m tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
-A DOCKER -i docker0 -j RETURNo

# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT

# iptables -S -t raw
-P PREROUTING ACCEPT
-P OUTPUT ACCEPT

# iptables -S -t security
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

그 일이 이루어지려면 내가 무엇을 해야 하는지 아시나요?

답변1

규칙을 변경하여 작동하게 만들었습니다 FORWARD.

iptables -A FORWARD -o my_br0 -j ACCEPT
iptables -A FORWARD -i my_br0 -j ACCEPT

이제 전체 명령 목록은 다음과 같습니다.

# Create interface
sysctl -w net.ipv4.ip_forward=1
brctl addbr my_br0
ip addr add 10.0.1.1/24 dev my_br0
ip link set my_br0 up
sysctl -w net.ipv4.conf.my_br0.route_localnet=1

# Add iptables rules
iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -A OUTPUT -p tcp --dport 8888 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -A POSTROUTING -p tcp -o my_br0 -j MASQUERADE
iptables -A FORWARD -o my_br0 -j ACCEPT
iptables -A FORWARD -i my_br0 -j ACCEPT
iptables -A INPUT -i my_br0 -p tcp --sport 8000 -j ACCEPT

관련 정보