iptables
배경: 저는 몇 년 동안 아무것도 하지 않았습니다... 저는 VMWare의 가상 머신에서 Fedora 16을 실행하고 방화벽(TomatoUSB) 포트를 가상 머신으로 전달하고 있습니다.
가상 머신이 있습니다 192.168.1.155
. 패킷이 가상 머신으로 전송되고 있는 것으로 알고 있습니다.
기반으로이 그림패킷이 어떻게 전송되어야 하는지 확인하기 위해 커널이 다른 이유로 패킷을 삭제하지 않는 한 패킷이 nat-PREROUTING
들어 오고 mangle-INPUT
나가기를 원합니다 .mangle-FORWARD
그래서 일부 로깅을 활성화했습니다.
iptables -t mangle -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-PREROUTING '
iptables -t nat -v -A PREROUTING -j LOG -p tcp --destination-port 80 --log-prefix 'nat-PREROUTING '
iptables -t filter -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-INPUT '
iptables -t filter -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'filter-FORWARD '
iptables -t mangle -v -I INPUT 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-INPUT '
iptables -t mangle -v -I FORWARD 1 -j LOG -p tcp --destination-port 80 --log-prefix 'mangle-FORWARD '
그런 다음 나는외부 테스트 서비스패킷이 체인을 통과 PREROUTING
하지만 무시되는 것을 볼 수 있습니다.
Apr 23 19:11:52 webmail64 kernel: [ 351.116042] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:52 webmail64 kernel: [ 351.121701] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20466 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:55 webmail64 kernel: [ 354.113372] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:11:55 webmail64 kernel: [ 354.114834] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20467 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:12:01 webmail64 kernel: [ 360.109534] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Apr 23 19:12:01 webmail64 kernel: [ 360.111023] nat-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:bc:ae:c5:c3:68:f9:08:00 SRC=66.249.67.195 DST=192.168.1.155 LEN=60 TOS=0x00 PREC=0x20 TTL=48 ID=20468 DF PROTO=TCP SPT=64135 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
TTL
이것이 좋다고 볼 수 있습니다 . VM의 IP가 192.168.1.155
이렇기 때문에 INPUT
다음으로 넘어가야 하는데 절대 성공하지 못합니다. 패킷이 내 네트워크 내부에서 오는 경우 예상대로 작동합니다.
Apr 23 19:20:03 webmail64 kernel: [ 841.725402] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.729647] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.731056] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4562 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK FIN URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.732784] mangle-PREROUTING IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.734257] mangle-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
Apr 23 19:20:03 webmail64 kernel: [ 841.735676] filter-INPUT IN=eth1 OUT= MAC=00:0c:29:fa:36:c7:00:1f:3b:cb:2e:99:08:00 SRC=192.168.1.69 DST=192.168.1.155 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=4563 DF PROTO=TCP SPT=61520 DPT=80 WINDOW=4042 RES=0x00 ACK URGP=0
나는 무엇을 시도했는가?
- SELinux 끄기
- 완전 폐쇄
iptables
- 기본 정책이 다음과 같은지 확인하세요.
ACCEPT
- 패킷 수
ACCEPT
증가 확인
- 패킷 수
/proc/sys/net/ipv4/ip_forward
만일을 대비해 IP 전달( )을 켜세요.
내 설정: * kernel
= Linux webmail64 3.3.2-1.fc16.x86_64 #1 SMP Sat Apr 14 00:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
*iptables v1.4.12
iptables
모든 중요한 정보 는 다음과 같습니다 .
[root@webmail64 ~]# iptables-save
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*nat
:PREROUTING ACCEPT [916:127527]
:INPUT ACCEPT [1:60]
:OUTPUT ACCEPT [87:7857]
:POSTROUTING ACCEPT [87:7857]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "nat-PREROUTING "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*mangle
:PREROUTING ACCEPT [1402:193108]
:INPUT ACCEPT [1343:189856]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [303:67789]
:POSTROUTING ACCEPT [303:67789]
-A PREROUTING -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-PREROUTING "
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-INPUT "
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "mangle-FORWARD "
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
# Generated by iptables-save v1.4.12 on Mon Apr 23 20:47:24 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1075:220262]
-A INPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-INPUT "
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp -m tcp --dport 80 -j LOG --log-prefix "filter-FORWARD "
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Apr 23 20:47:24 2012
다음은 어디서 볼 수 있나요?
고쳐 쓰다
실행하라는 요청을 받았는데 패킷을 tcpdump
보내지 않는 것 같나요 ? ACK
:
tcpdump -i eth1 -An -vvv \(net 50 or net 173\)
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
19:31:26.305048 IP (tos 0x20, ttl 53, id 26094, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xca12 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517194 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..J........
19:31:26.521815 IP (tos 0x20, ttl 53, id 61033, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x82b4 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517216 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ...................
D..`........
19:31:29.300994 IP (tos 0x20, ttl 53, id 26095, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc8e6 (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152517494 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D..v........
19:31:29.521214 IP (tos 0x20, ttl 53, id 61034, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x8188 (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152517516 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ...................
D...........
19:31:35.302578 IP (tos 0x20, ttl 53, id 26096, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48891 > 192.168.1.155.http: Flags [S], cksum 0xc68e (correct), seq 2918539684, win 5840, options [mss 1460,sackOK,TS val 1152518094 ecr 0,nop,wscale 7], length 0
E .<[email protected]....................
D...........
19:31:35.532347 IP (tos 0x20, ttl 53, id 61035, offset 0, flags [DF], proto TCP (6), length 60)
50.22.90.226.48892 > 192.168.1.155.http: Flags [S], cksum 0x7f2f (correct), seq 1826089481, win 5840, options [mss 1460,sackOK,TS val 1152518117 ecr 0,nop,wscale 7], length 0
E .<[email protected].. ........./.........
D...........
답변1
조금 늦었다는 걸 알지만...알다어떤 IP를 담당하나요? 이것은 제가 만든 규칙 파일의 상단에 넣은 스키마입니다. 유사한 순서도를 다른 곳에서도 찾을 수 있지만 터미널에서 매우 유용할 수 있는 ASCII 형식(예술이라고 부르고 싶지는 않습니다.)입니다.
대부분의 경우 나는 이것을 머리 속으로 알고 있지만, 잊었다고 해서 참고하는 것도 나쁘지 않습니다.
###############################################################################
###
### PACKET FLOW THROUGH NETFILTER TABLES AND CHAINS
###
###
### {Packet in}
### |
### v
### +-----------------+
### |mangle/PREROUTING|
### +-----------------+
### |
### v
### +-----------------+
### | nat/PREROUTING |
### +-----------------+
### |
### v
### *~~~~~~~~~~~~~~~~~*
### | kernel routing |
### *~~~~~~~~~~~~~~~~~*
### |
### v
### .------------{?for this host?}------------.
### yes! | | no!
### v v
### +-----------------+ +-----------------+
### | mangle/INPUT | | mangle/FORWARD |
### +-----------------+ +-----------------+
### | |
### v v
### +-----------------+ +-----------------+
### | filter/INPUT | | filter/FORWARD |
### +-----------------+ +-----------------+
### | |
### v |
### *~~~~~~~~~~~~~~~~~~~~* |
### | response & routing | |
### *~~~~~~~~~~~~~~~~~~~~* |
### | |
### v |
### +-----------------+ |
### | mangle/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | nat/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | filter/OUTPUT | |
### +-----------------+ |
### | |
### .-------------------+---------------------.
### |
### v
### +------------------+
### |mangle/POSTROUTING|
### +------------------+
### |
### v
### +------------------+
### | nat/POSTROUTING |
### +------------------+
### |
### v
### {Packet out}
###
###############################################################################
무슨 뜻이에요?
라우팅은 라우팅 테이블(위 순서도의 "커널 라우팅")을 사용하거나 netfilter를 사용하여 수행할 수 있습니다. 이제 귀하의 경우 가장 가능성이 높은 시나리오인 경우 라우팅 테이블을 적절하게 설정하지 않으면 커널은 패킷이 어디로 가야 하는지 알지 못하고 결국 패킷을 삭제하게 됩니다. 참고: 이 경우 사용자 정의 체인을 만든 LOG
다음 DROP
해당 순서대로 규칙을 추가하는 것이 유용합니다 . 이렇게 하면 어떤 규칙이 영향을 받는지 확인할 수 있습니다. iptables-save -c
체인에 추가하는 방법(format [packets:bytes]
) 과 유사하게 각 규칙 줄에 패킷 및 바이트 카운터를 추가하는 것도 유용합니다 .
가상 머신으로 전달하는 포트의 경우 DNAT
다음 레시피가 있습니다(아래에 설명됨).
#!/bin/bash
VMNET=192.168.1.0/24
MAINIP=66.249.67.195
CONTIP=192.168.1.2
VMPORT=80
INPORT=80
ACTION="-I"
iptables -t nat $ACTION PREROUTING -d $MAINIP -p tcp --dport $INPORT -j DNAT --to-destination $CONTIP:$VMPORT
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -j MASQUERADE
iptables -t filter $ACTION INPUT -p tcp -d $MAINIP --dport $INPORT -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $VMNET -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $MAINIP -j ACCEPT
자신의 규칙에 맞게 순서를 변경할 수도 있습니다. 또한 OUTPUT
체인에 ACCEPT
기본 정책이 없으면 출력 규칙을 추가해야 합니다. 그러나 모든 실제적인 목적을 위해서는 RELATED,ESTABLISHED
상태 규칙을 사용하여 이를 충족해야 합니다. 와일드카드를 통해 일치하거나 일치하도록 인터페이스를 구체화할 수도 있습니다. 예를 들어 가상 게스트의 브리지에 모든 접두사(밑줄)를 지정하여 및 와 _
일치하도록 했습니다 . 마찬가지로 여러 네트워크 카드( , )의 경우 와 일치시킬 수 있습니다 .-i _+
-o _+
eth0
eth1
-i eth+
여기서 일어나는 일은 다음과 같습니다.
DNAT
$INPORT
TCP(호스트) 포트에서 입력을 받아들이고 이를$CONTIP:$VMPORT
컨테이너의 IP와 컨테이너의 포트 로 "라우팅"하는 규칙을 삽입합니다 . 예, 다를 수 있습니다. 그렇지 않은 경우 대상 부분을 생략할 수 있습니다(예: "$CONTIP").- 트래픽 마스킹을 위한 세 가지 규칙~에서가상 게스트 서브넷이 있지만 가지 않음도착하다또 다른 가상 손님.
INPUT
공용 IP(인터페이스는 제공되지 않았지만 아마도!) 포트에서 들어오는 패킷이 통과하도록 허용하는 규칙입니다$INPORT
. 적어도 공용 인터페이스에 바인딩하는 경우에는 이 규칙이 엄격하게 필요하지 않다고 생각합니다.$INPORT
가상 게스트 서브넷으로 트래픽을 전달하는 규칙($VMNET
)$INPORT
공용 IP로 트래픽을 전달하는$MAINIP
규칙 ( )
sysctl
마지막으로 ( )의 값은 다음과 /proc/sys/net/ipv4/ip_forward
같아야 합니다.
# cat /proc/sys/net/ipv4/ip_forward
1
호스트를 라우터로 만드세요.
echo 1
위의 "파일"에 쓰지 않는 procfs
경우 .sysctl -w net.ipv4.ip_forward=1
root
답변2
난 아직도 모르겠어왜그러나 나는 그것을 작동시켰다.
eth0
(192.168.99.x)와 eth1
(192.168.1.x)의 두 가지 인터페이스가 있습니다 . 레거시 이유로 존재하므로 새 VM을 원하고 이전 VM을 복사할 때 게으릅니다. 어쨌든 방금 비활성화했는데 eth0
모든 것이 잘 작동합니다.
rp_filter
일부 설정을 확인했지만 /etc/sysctl.conf
해결되지 않았습니다(하지만 IF 문제가 이상한 것 같습니다). 이러한 설정은 /usr/share/doc/kernel-doc-x.x.x/Documentation/networking/ip-sysctl.txt
패키지 에 문서화되어 있습니다 kernel-doc
.
이제 작동하므로 검색 엔진이 찾을 수 있도록 여기에 남겨두겠습니다. 언젠가는 이것이 다른 사람에게 도움이 될 수도 있습니다.