저는 Raspberry Pi에서 다음을 사용하여 WireGuard 서버를 실행하고 있습니다.https://github.com/linuxserver/docker-wireguard영상. 나는 동료들이 두 가지 일을 하도록 허용하고 싶습니다:
- SMB를 통해 단일 NAS에 연결
- 동일한 NAS에 핑(Ping)
나는 이것을 보관하기 위해 다음과 같은 iptables 규칙을 작성했습니다( 내 네트워크를 "향하는" 인터페이스인 wg0
WireGuard 인터페이스입니다 ).eth0
# Reset (flush) rules
iptables -t nat -F
iptables -F
# Allow WireGuard traffic
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
# Deny any forward traffic by default
iptables --policy FORWARD DROP
# Allow SAMBA traffic to NAS
NAS="192.168.178.23/32"
iptables -A FORWARD -i wg0 -p tcp --dport 445 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow ICMP echo request
iptables -A FORWARD -i wg0 -p icmp --icmp-type 8 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# NAT tunnel IP to internal IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
이러한 작업은 작동하므로 WireGuard를 통해 연결하면 SMB를 통해 NAS를 핑하고 마운트할 수 있지만 네트워크의 다른 서비스를 핑하거나 NAS의 HTTP 인터페이스에 액세스할 수 없습니다.
그러나 내가 한 일을 정확히 이해하기 위해 몇 가지 질문이 있습니다.
INPUT
/OUTPUT
정책을 로 설정하면DROP
아무 것도 작동하지 않습니다. 내 가정은 수신된 WireGuard UDP 패킷이wg0
정책에 의해 삭제되었기 때문이라고 가정합니다.- 어쨌든 정책을 설정하고
ALLOW
에서/으로 트래픽 에 규칙을 추가하면 컨테이너가 ? 를 통해 어떤 것에도 연결할wg0
수 없고 ?eth0
FORWARD
wg0
RELATED,ESTABLISHED
트래픽을 허용하는 규칙은wg0
TCP:445 또는 ICMP:echo-request에 응답하는 트래픽만 일치해야 합니다. 거기에서 더 구체적으로 설명할 필요는 없습니다(예: 포트/프로토콜 일치). 그렇죠?- 그 위의 트래픽을 허용하는 덜 구체적인 규칙이 그보다 먼저 일치하기 때문에 규칙
ALLOW
반향 응답은 필요하지 않습니다 . 그렇죠?RELATED,ESTABLISHED
- 체인 의 모든 필터링을 사용하면 TCP:445 또는 ICM:echo-request에서 NAS용이 아닌 모든 트래픽이 필터링되지 않기 때문에 테이블 체인
FORWARD
에서 필터링할 필요가 없다고 가정합니다. 어쨌든 "여기까지". 이 올바른지?nat
POSTROUTING
답변1
귀하의 질문에 간략하게 답변하려면:
- 예
INPUT
/ 체인OUTPUT
은 로컬 소켓과의 연결에 사용됩니다.모두인터페이스(lo
,eth0
,wg0
등). 일반적으로 일반적으로 당연하게 여기는 문제(DNS, DHCP, NTP, 루프백 연결을 사용하는 기타 프로세스 등)를 해결하는 데 시간을 소비하게 되므로 기본적으로 모든 아웃바운드를 차단하고 싶지는 않습니다.- 예. 일반적으로 추가 조건 없이 모두 허용하는 것이 좋습니다
RELATED,ESTABLISHED
. (이미 한 방향을 통한 연결을 허용한 경우 반대 방향으로 돌아가는 대칭 응답도 괜찮습니다.) - 예
- 예
나는 이것을 생각 해요iptables 처리 흐름도또한 이것이 어떻게 작동하는지 더 잘 이해하는 데 도움이 될 것입니다.
이것이 제가 귀하의 규칙을 작성하는 방법입니다:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# INPUT chain of filter table:
# drop known bad packets
iptables -A INPUT -m state --state INVALID -j DROP
# accept responses to established connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept ICMP packets
iptables -A INPUT -p icmp -J ACCEPT
# accept loopback connections
iptables -A INPUT -i lo -J ACCEPT
# accept connections to WireGuard listen port
iptables -A INPUT -p udp --dport 51820 -J ACCEPT
# FORWARD chain of filter table:
# drop known bad packets
iptables -A FORWARD -m state --state INVALID -j DROP
# forward responses to established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# forward ICMP packets from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p icmp -J ACCEPT
# forward SMB connections from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p tcp --dport 445 -J ACCEPT
# POSTROUTING chain of nat table:
# masquerade all packets forwarded to LAN
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE