
나는 꽤 혼란스럽고 전혀 이해하지 못합니다 iptables
.
nginx 서버가 수신 대기 중이고 localhost:80
내 NIC의 ip 로 액세스하고 싶습니다 192.168.29.167:80
. 나는 팔로우하고 있었다디지털 오션규칙 설정에 대한 튜토리얼입니다.
나의:
유형 | 상호 작용 | 주소 |
---|---|---|
local |
lo |
127.0.0.1 |
NIC lan |
enp7s0 |
192.168.29.167 |
내가 그랬어,
iptables -A FORWARD -i lo -o enp7s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i lo -o enp7s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp7s0 -o lo -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 127.0.0.1 -j SNAT --to-desitnation 127.0.0.1
PREROUTING
, POSTROUTING
및 규칙을 설정해도 FORWARD
아무런 작업이 수행되지 않았습니다. 을(를 localhost:80
) 통해 액세스할 수 없습니다 enp7s0
.
(참고: 나는 가지고 있다 sudo sysctl -w net.ipv4.ip_forward=1
)
답변1
- 규칙 에 오류가 있습니다
nat
. 인터페이스 이름이 잘못된 것 같습니다.DNAT
입력 인터페이스 이름이 아닌 대상 주소를 기반으로 사용하는 것이 좋습니다 . 따라서 원하는 것을 달성하려면 단일 규칙만 필요합니다.
iptables -t nat -A PREROUTING --dst 192.168.29.167 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
- 이러한 패킷은 전달(전송)되지 않지만 입력됩니다.
filter/INPUT
가 아닌 체인 에서 이 트래픽을 허용해야 합니다filter/FORWARD
. 작업 후에도DNAT
입력 인터페이스는 변경되지 않습니다(따라서enp7s0
가 아닌 인터페이스를 지정해야 함lo
). 그러나DNAT
단일 규칙을 사용하면 모든 연결을 허용할 수 있습니다.
iptables -t filter -A INPUT -m conntrack --ctstate DNAT -j ACCEPT
- 외부 패킷 수신을 허용하려면 를 실행하세요 .
sysctl -w net.ipv4.conf.enp7s0.route_localnet=1
해당 패킷은 .127.0.0.1
iptables-save -c
카운터와 함께 전체 규칙 세트를 나열하려면 명령을 사용하는 것이 좋습니다 .nat/PREROUTING
최소한 규칙 카운터 가 늘어나는 것을 확인해야 합니다 . 또한iptables-apply
새로운 규칙을 적용하려면 를 사용하세요. 이러한 유틸리티에 대한 설명서를 확인하세요.tcpdump -ni enp7s0 'tcp port 80'
외부 트래픽 문제를 해결하려면 를 사용하세요 .- 로컬에서 발생한 트래픽을 리디렉션하려면 다음 규칙을 사용해야 합니다.
iptables -t nat -A OUTPUT -p tcp --dport 80 --dst 192.168.29.167 -j DNAT --to 127.0.0.1
그렇지 않으면 서버 자체에서 192.168.29.167 주소를 통해 nginx에 연결할 수 없습니다.