FORWARD
원하는 대로 작동하지 않는 정책 으로 인해 어려움을 겪고 있는데 세션 실패의 원인이 무엇인지 알 수 없습니다. 누군가가 도울 수 있기를 바랍니다.
내 목표는 포트 3000을 eth0에서 내부 Windows 시스템 포트 3389 out eth2로 전달하여 Windows 상자에 RDP할 수 있도록 하는 것입니다. 아래 구성 스크립트는 에서만 작동 iptables -P FORWARD ACCEPT
하지만 나는 그것을 원하지 않습니다. 을 사용하면 기분이 좋아지지만 iptables -P FORWARD DROP
이것은 나에게 효과가 없습니다.
다음은 제가 작업한 스크립트의 마지막 버전입니다. 이것은 내가 주석을 단 모든 내용이 포함된 전체 스크립트이므로 여기서 일어나는 모든 내용을 확인할 수 있지만 이 부분은 FORWARD
제가 도움이 필요한 부분 이라는 점을 명심하세요 .
echo "Flush firewall and setting default chain policies..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#iptables --append FORWARD -p tcp --dport 3000 -d 192.168.1.2 -j ACCEPT
echo "Enabling firewall with new ruleset..."
# allow ssh to eth0
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# allow http-https traffic
iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# allow ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -t raw -A OUTPUT -p icmp -j TRACE
# full loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# minimize http-https DOS attack by limiting burst connections
# may need to adjust this later once web traffic is coming in
iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
# all rdp 3000 to jump box
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 3000 -j LOG --log-prefix "iptables-prerouting: " --log-level 7
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 3000 -j DNAT --to 192.168.1.2:3389
#iptables -A FORWARD -i eth0 -p tcp --dport 3389 -d 192.168.1.2 -j ACCEPT
#iptables -t raw -A PREROUTING -p tcp --dport 3389 -j TRACE
#iptables -t raw -A OUTPUT -p tcp --dport 3389 -j TRACE
iptables -A FORWARD -t filter -o eth0 -m state --state NEW,ESTABLISHED -d 192.168.1.2 -p tcp --dport 3389 -j LOG --log-prefix "iptables-forward: " --log-level 7
iptables -A FORWARD -t filter -o eth0 -m state --state NEW,ESTABLISHED -d 192.168.1.2 -p tcp --dport 3389 -j ACCEPT
# nat internal network to public interface
iptables -A POSTROUTING -o eth0 -t nat -j LOG --log-prefix "iptables-postrouting: " --log-level 7
iptables -A POSTROUTING -o eth0 -t nat -j MASQUERADE
# logging
#iptables -A INPUT -m limit --limit 2/min -j LOG --log-prefix "iptables-input: " --log-level 7
iptables -A FORWARD -j LOG --log-prefix "iptables-forward: " --log-level 7
#iptables -A OUTPUT -j LOG --log-prefix "iptables-output: " --log-level 7
# enable ipv4 forwardning for the system
echo 1 > /proc/sys/net/ipv4/ip_forward
# add route for private network internet access
ip route add 192.168.1.0/24 proto kernel scope link dev eth2
#List iptables ruleset
echo "-----------------------------------------------------------------------------"
echo "Listing iptables..."
iptables -L
echo "-----------------------------------------------------------------------------"
echo "Listing ip routes..."
ip route
연결을 추적하고 로깅 규칙을 활성화했지만 제공된 정보를 기반으로 문제가 무엇인지 확인할 수 없습니다. 기본 작업 간의 추적에서 차이점을 발견할 수 있지만 iptables -P FORWARD
여전히 건초 더미에서 바늘을 찾을 수 없습니다.
내가 얻을 수 있는 어떤 조언이라도 감사하겠습니다. 감사해요!
@HaukeLaging 덕분에 잘 작동하고 있습니다. 다음은 최종 스크립트입니다.
echo "Flush firewall and setting default chain policies..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables --append INPUT -t filter -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables --append FORWARD -t filter -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables --append OUTPUT -t filter -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
echo "Enabling firewall with new ruleset..."
# allow ssh to eth0
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# allow http-https traffic
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# ----from private network
iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 443 -j ACCEPT
# allow ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# ----from private network
iptables -A FORWARD -i eth2 -o eth0 -p icmp --icmp-type echo-request -j ACCEPT
# full loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# minimize http-https DOS attack by limiting burst connections
# may need to adjust this later once web traffic is coming in
iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
# rdp 3000 to jump box
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 3000 -j DNAT --to 192.168.1.2:3389
iptables -A FORWARD -i eth0 -p tcp --dport 3389 -d 192.168.1.2 -j ACCEPT
# nat on public interface
iptables -A POSTROUTING -o eth0 -t nat -j MASQUERADE
# logging
#iptables -A INPUT -m limit --limit 2/min -j LOG --log-prefix "iptables-input: " --log-level 7
#iptables -A FORWARD -j LOG --log-prefix "iptables-forward: " --log-level 7
#iptables -A OUTPUT -j LOG --log-prefix "iptables-output: " --log-level 7
# enable ipv4 forwardning for the system
echo 1 > /proc/sys/net/ipv4/ip_forward
# add route for private > public access
ip route add 192.168.1.0/24 proto kernel scope link dev eth2
#List iptables ruleset
echo "-----------------------------------------------------------------------------"
echo "Listing iptables..."
iptables -L
echo "-----------------------------------------------------------------------------"
echo "Listing ip routes..."
ip route
답변1
주석 처리된 규칙을 활성화해야 합니다.
iptables -A FORWARD -i eth0 -p tcp --dport 3389 -d 192.168.1.2 -j ACCEPT
그리고 이 항목(물론 위의 로깅 규칙도)을 수정해야 합니다.
iptables -A FORWARD -t filter -o eth0 -m state --state NEW,ESTABLISHED -d 192.168.1.2 -p tcp --dport 3389 -j ACCEPT
그것은 잘못된 것입니다. 만약 eth0
에산출인터페이스는 192.168.1.2
소스이지 목적지가 아닙니다. 그런데 왜 state 를 허용합니까 NEW
? 가장 쉬운 방법은 다음과 같습니다.
iptables -A FORWARD -t filter -m state --state ESTABLISHED,RELATED -j ACCEPT
그것은 일반적인 규칙입니다. 연결 정의에 더 가깝게 유지하려면 다음을 수행하십시오.
iptables -A FORWARD -t filter -o eth0 -m state --state ESTABLISHED -s 192.168.1.2 -p tcp --sport 3389 -j ACCEPT
편집 1:
그리고 다른 시스템에서 발생하는 모든(?) 연결을 허용하는 규칙이 필요할 수도 있습니다.
iptables -A FORWARD -t filter -o eth0 -m state --state NEW -s 192.168.1.2 -j ACCEPT
그런데 매뉴얼 페이지를 인용하면 다음과 같습니다.
"state" 모듈은 "conntrack"의 오래된 버전입니다.
설정된 모든 트래픽을 허용하는 간단한 규칙을 사용하지 않는 경우 다음과 같은 것도 필요합니다.
iptables -A FORWARD -t filter -i eth0 -m conntrack --ctstate ESTABLISHED -d 192.168.1.2 -j ACCEPT