Ubuntu 16.04에 즉시 libvirt를 설치했는데, 이는 해당 범위를 제공하는 dnsmasq 인스턴스인 192.168.122.0/24에 virbr0 가상 브리지를 생성하고 기본 NAT 위장을 설정했습니다.
가상화 소프트웨어에서 사용할 수 있도록 그 아래에 포인트 앤 클릭 인터페이스를 만들었습니다. 소프트웨어 자체는 인터넷과 나머지 네트워크에 완벽하게 액세스할 수 있으므로 위장이 제대로 작동합니다. 또한 소프트웨어에서 요청한 IP 주소를 사용하여 호스트에서 가상화 소프트웨어 SSH 포트에 액세스할 수도 있습니다. 그래서 나는 "즉시 사용 가능한" 라우팅 테이블이 일반적으로 정확하다고 생각합니다.
내가 원하는 것은 외부 포트에서 소프트웨어 및 전체 호스트 시스템으로 인바운드 SSH 연결을 전달하는 것입니다. 물론 이제 호스트 시스템에는 SSH가 있으며 작동하려면 SSH가 필요합니다. 그래서 다른 포트(예: 포트 2022)를 사용해 보았습니다.
포트 2022의 인바운드 트래픽을 포트 22의 소프트웨어 IP 주소로 전달하는 iptables에 DNAT 규칙을 만들었습니다. 외부(예: 아래 컴퓨터 A)에서 로그인하려고 하면 대상에 액세스할 수 없습니다. 주소 변환이 제대로 작동하는 것 같지만 iptables의 "FORWARD" 단계로 이동한 직후에 연결할 수 없는 아웃바운드 ICMP 패킷을 받기 시작합니다.
어떻게 진행해야 할지 혼란스럽습니다. 몇 가지 SNAT 규칙을 시도했지만 실수했거나 이것이 문제가 아닙니다. 누구든지 이것에 대해 어떤 생각을 가지고 있습니까?
업데이트: tap0의 Wireshark는 전달된 패킷이 수신되었음을 표시하지 않습니다. 반환된 패킷의 내용은 가상화 소프트웨어와 관련이 없습니다.
내 네트워크 사진은 다음과 같습니다.
----------
| Internet |
----------
|
|
--------
| Router | 10.211.255.1
--------
|
|
____________|_______________
| |
---------- ---------
| | | enp0s5 | 10.211.255.4
| Computer | 10.211.255.2 | Host | 192.168.122.1
| A | | virbr0 |
---------- ---------
|
| LAN NAT 192.168.122.0/24
|
----------
| tap0 |
| Guest OS | 192.168.122.118
| |
----------
내 IP 테이블 규칙은 다음과 같습니다.
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "INTRACE: "
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "FORTRACE: "
ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "OUTTRACE: "
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
NAT tables:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere tcp dpt:2022 LOG level debug prefix "NATPTRACE: "
DNAT tcp -- anywhere anywhere tcp dpt:2022 to:192.168.122.118:22
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "NATITRACE: "
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "NATOTRACE: "
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere LOG level debug prefix "NATQTRACE: "
SNAT tcp -- anywhere anywhere tcp spt:ssh to::2022
RETURN all -- 192.168.122.0/24 base-address.mcast.net/24
RETURN all -- 192.168.122.0/24 broadcasthost.localdomain
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
마지막으로 위의 규칙을 사용하여 syslog에서 본 내용의 예는 다음과 같습니다.
Oct 20 09:49:15 ubuntu kernel: [85149.812291] RAWPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812318] MGPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812326] NATPTRACE: IN=enp0s5 OUT= MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=10.211.55.4 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=40132 DF PROTO=TCP SPT=53245 DPT=2022 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812336] MGFTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812340] FORTRACE: IN=enp0s5 OUT=virbr0 MAC=00:1c:42:3a:00:df:00:1c:42:00:00:08:08:00 SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 20 09:49:15 ubuntu kernel: [85149.812354] RAWOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812357] MGOTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812361] OUTTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
Oct 20 09:49:15 ubuntu kernel: [85149.812364] MGQTRACE: IN= OUT=enp0s5 SRC=10.211.55.4 DST=10.211.55.2 LEN=92 TOS=0x00 PREC=0xC0 TTL=64 ID=50608 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.211.55.2 DST=192.168.122.118 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=40132 DF PROTO=TCP SPT=53245 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 ]
답변1
문제는 FORWARD 규칙에 있습니다. 내가 설정하지 않았기 때문에 출력을 잘못 해석했습니다 iptables --list
.
이 목록의 규칙 4는 다음과 같습니다.
ACCEPT all -- anywhere anywhere
이는 어디에서나 어디로든 바인딩되어 들어오는 모든 패킷을 받아들이는 것 같습니다.
iptables -S
그러나 규칙 4를 살펴보면 실제로는 다음과 같습니다.
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
이는 enp0s5에서 들어오고 vibr0으로 향하는 패킷과 일치하지 않습니다. 따라서 vibr0으로 향하는 모든 패킷을 효과적으로 거부하는 REJECT 규칙 5가 발생합니다.
내가 배운 교훈은 출력을 신뢰하는 것이 아니라 문제가 발생했을 때 출력을 확인하는 것입니다 iptables --list
.iptables -S