[LinuxFocus-icon]
<--  | ��ҳ  | վ���ͼ  | ����  | ����

���� | �����ڿ� | ���� | ����LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Russian  Turkce  

Vincent Renardias
by Vincent Renardias
<vincent(at)renardias.com>

��������:

Vincent Renardias��1993ʹ��GNU/Linux,1996�꿪ʼ�漰�����ķ�չ: Debian�����ߣ�GIMP��GNOME ����ķ������ߣ� Linux��֯Marseille��PLUG�� �Ĵ�ʼ��...������EFB2��˾��R&D��������ʼ��ΪGNU/Linux���Ź��ס�


Ŀ¼:

 

Packet filtering with Linux

[Illustration]

ժҪ:

��ƪ�����״η�������Linux�ڿ������ؿ��еİ�ȫ�����ϡ��༭�����ߺͷ����� ���Ǻ��Ƶ�����LinuxFocus��������ؿ����ÿһƪ���¡���ˣ�LinuxFocus���� �̽����Ƿ����Ӣ�Ĵ����㡣��л����Ϊ�˹��������ǡ����ժҪ���ᱻ������ÿƪ�� �µĿ�ͷ��


��ֹ���ֵ�һ���õķ����dz������ǹ�������û���õĶ������������ͨ������һ̨�� Ϊ����ǽ���豸��
����ƪ��������ǽ�����ִ�к���������һ��ϵͳ������Ҫ�Ļ�����


_________________ _________________ _________________

 

Gateway, Proxy-Arp �� Ethernet Bridge ��

���˻������Ա����dz�һ���ܹ������к������ݰ�����������ҪҪ�����ҵ����ʴ� С�����׺Ͱ�װ������ȷλ�á�

����ǽ�������е�λ��
Firewall location

Ϊ���ܹ���ȫ�Ĺ������ݰ���������˻��������޷�IJ�������Ҫ����������͡��� ������硱֮�䡣��ʵ���ϣ����������һ̨������������ӿڣ�ͨ������̫�������� �豸����� ��һ�������ڲ������磬��һ�������ⲿ��Ϊ·��ת�������ַ�ʽ��ͨ�� �����ò�ͨ������ǽ����������ǽ������ֹ���ǻ��������ǵ����ݽ��з��͡�
�豸���й��˻������Ա����ó�3�ֲ�ͬ�ķ�ʽ��

- "simple" Gateway: ��������ͨ�����á��豸�������������������֮������ء��ڱ��������ڵĵ��Խ�ʹ �÷���ǽ�������ǵ�Ĭ��·�ɡ�

- "Proxy-ARP" Gateway�� ǰ���Ǹ����ð�ʾ�Ű�һ�����绮�ֳ�������������� �����һ������õ� ip ��ַʧЧ�ˡ������е����˵ġ��ٸ����ӣ�һ��16����ַ���� ����28λ�������룩����ȥ�����ַ�͹㲥��ַֻ��14������Ч�ģ���������һλ���� Ч��ַ����14���ٵ�6��8��ip��ȥ�����ַ�͹㲥��ַ�������㲻�ܹ�����ʧȥһ���� Чip��ַ������������ʹ�����ּ��������ǽ������Ժ������������������⣬���� ��������Ҫ�������д��ڵ�·�����ͱ������ĵ��������κθı䡣

- Ethernet bridge: ��Ϊһ����̫�����ذ�װ ������ip���أ���ʹ���˻������� �����豸��˵��͸���ġ���˲�����ip��ַ����̫���ӿ����׵��ġ����ǣ��豸������ ��ping��traceroute�ȹ��߷��֡�������ע��һ�����ݰ�����ִ�У���2.4.x�ں˻� ��û���ǰ���£���������˿ڵ�������Ҫ2.2.x���ںˡ�

 

���˻�������

��Ȼ����֪��ʲô�ط���װ����������ô���DZ��붨��ʲôӦ����ֹʲôӦ�ý��ܡ�
���������ַ�ʽȥ����һ����������

- �õķ�����û�����ݱ�����ͨ�������˹��������ġ�
- ���ķ����������ҵ��Ǿ�����ʹ�ã���ȷ����ֹ����ֹ���ݰ������е����ݰ������ܡ�

����һ���򵥵Ľ��ͣ��ڵ�һ����������������·�����ȫ�����������������ͨ ������ᱻ�ܿ��ע�⵽��Ȼ�������ʵ��Ĺ���ʹ����������������
�ڵڶ������������һ����������һ��DZ�ڵ����㣬�������ȥ�ң�����ȥ����...

 

Netfilter

��linux 2.4�ں���ʹ�õ����İ�����������Netfilter�����ܺõ�ȡ����ʹ ����2.2�ں˵ġ�ipchains����Netfilter����������ɣ��ں�֧������Ҫ������� �ں˺�����ϵͳ�п��õ�����iptables������

 

��װʵ��

һ��ʵ����ע�ͱ�һ�γ�ʱ����ݽ�Ҫ�õĶ࣬�������ǽ���������ȥ��װ������ һ���������豸�����ȣ��豸Ҫ�����ó�һ�����أ�ʹ��Proxy-ARP���޶�ip��ַ�� ���������ǽ����ù���ϵͳ��

����ƫ��ѡ����Debian������������һ��������ϵͳ���κ�linux���а涼���ԡ�

���ȣ��������ں��Ѿ�֧��Netfilter������ǵģ�������Ϣ��������

ip_conntrack (4095 buckets, 32760 max)
ip_tables: (c)2000 Netfilter core team

���⣬��Netfilter֧�ֱ�������㲻�ò��������ںˡ���Ӧ��ѡ����� "Networking Options"�˵����"Network Packet Filtering" �Ӳ˵����ҵ�����"Netfilter Configuration"ѡ�ѡ������Ҫ�ġ� �������ȷ���������ȫ��ѡ�񡣴��⣬��ð�Netfilter�������ںˣ���������Ϊ�� ��ģ�顣�����ΪһЩԭ�����Netfilterһ��ģ��������ܼ��أ������������ܹ� �������Dz������̸�۹�����ô����ð�ķ����ˡ�

��ҲӦ�ð�װ��iproute2��������������Dz���Ҫ���ģ��������ǵ�ʵ����ʹ �ô����������ǽ������ýű��ļ���ʼ��������Debian����apt-get install iproute�� �����㹻�ˡ�
�����ķ��а棬�����Ӧ������������ͨ���ķ��������Դ����װ�������������� ��ַ���ص���Ӧ����������
ftp://ftp.inr.ac.ru/ip-routing/

���ڶ�������̫�������á����DZ���ע��Liunx���ںˣ��Զ����Ӳ�����򵽼�� ���翨����һ��ʱ�ͻᷢ���������ǣ�������һ�鱻̽�⵽��
һ���򵥵Ľ����������lilo.conf�ļ�������һ�仰��
append="ether=0,0,eth1"

���ڣ�����������̫���ӿڡ�����ѡ�����������ʹ��ͬһ��ip��ַ�ķ�������� ���Խ�Լһ����ַ��
���Ǽٶ���һ��10.1.2.96/28�����������ĵ�ַ��10.1.2.96��10.1.2.111 ·�����ĵ�ַ��10.1.2.97�����ǵĹ������豸�ĵ�ַ��10.1.2.98��eth0 �ӿ�֮�����û��ͨ��hub��switch��������ô��ͨ��RJ45˫����ֱ������·������ eth1�ӿڽ�����hub��switch�� ͨ���������ﱾ�������豸��

��ˣ������ӿڽ��ᱻ���ó����в�����

address  : 10.1.2.98
netmask  : 255.255.255.240
network  : 10.1.2.96
broadcast: 10.1.2.111
gateway  : 10.1.2.97

������������ʹ������Ľű�����������������ʼ�������Ժ����С�

net.vars: configuration variables

PREFIX=10.1.2
DMZ_ADDR=$PREFIX.96/28
# Interface definitions
BAD_IFACE=eth0
DMZ_IFACE=eth1
ROUTER=$PREFIX.97


net-config.sh: network configuration script

#!/bin/sh
# Comment out the next line to display the commands at execution time
# set -x
# We read the variables defined in the previous file
source /etc/init.d/net.vars
# We remove the present routes from the local network
ip route del $PREFIX.96/28 dev $BAD_IFACE
ip route del $PREFIX.96/28 dev $DMZ_IFACE
# We define that the local network can be reached through eth1
# and the router through eth0.
ip route add $ROUTER dev $BAD_IFACE
ip route add $PREFIX.96/28 dev $DMZ_IFACE
# We activate Proxy-ARP for both interfaces
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp
# We activate the IP forwarding to allow the packets coming to one card
# to be routed to the other one.
echo 1 > /proc/sys/net/ipv4/ip_forward

�����Ƿ���Proxy-ARP���ƶ����ǵ�����������ġ�
��һ���豸��ͬһ��������ͬ��һ̨�豸�Ựʱ������Ҫ֪����̫����ַ������MAC�� ַ����Ӳ����ַ����Ӧ��ip��ַ����Դ�豸�㲥����ip��ַλ1.2.3.4��MAC��ַ�� ʲô����Ŀ���豸����ش�

������һ�����Ự����ʵ������ͨ��tcpdump��⵽�ģ�
- the request: the machine 172.16.6.72 asks the MAC address corresponding to the IP address IP 172.16.6.10.
19:46:15.702516 arp who-has 172.16.6.10 tell 172.16.6.72
- the answer: the machine 172.16.6.10 provides its card number.
19:46:15.702747 arp reply 172.16.6.10 is-at 0:a0:4b:7:43:71

ͨ��������ԵĽ��ͽ��������ǵ���Ŀ�ĵأ�ARP����ͨ���㲥��������������� ����ͬһ�������������ˣ��ܱ������豸��Ҫȥ����·����MAC��ַ�����󽫻ᱻ �������豸��ֹ�������ŵ�Proxy-ARP����ɫ���ǽ��������⣬������ ��ARP����

����һ�׶���㽫��һ�������ŵ����磬������һ̨�豸������������������� ����ͨ�š�

���ڣ����DZ���ʹ��Netfilter�������ˡ�
Netfilter����ֱ�ӶԾ��������ݰ������ж����ڻ�����������ݰ���3��������������
- INPUT�����ݰ�ͨ��һ���ӿڽ�����
- FORWARD�������е����ݰ���һ���ӿ�ת������һ���ӿڡ�
- OUTPUT�����ݰ�ͨ��һ���ӿڳ�ȥ��

��iptables��������������Щ�����ӣ��ı�����Ƴ�����Ӷ��޸Ĺ������Ķ�����
���⣬ÿһ������һ��Ĭ�ϵIJ��ԣ����仰˵����֪����һ�����ݰ�û�й���ƥ��ʱ�� ��ô������
��ǰ���ĸ�ѡ�
- ACCEPT������ͨ�����ݰ���
- REJECT���ܾ����ݰ�ͨ���������Ĵ�����Ϣ�����ͣ�ICMP�˿ڲ��ܵ��TCP���� ������Щ�ģ���
- LOG�������ݰ���¼д��syslog��
- DROP���������ݰ��������ͻش�

������ͨ����׼��

Packet flow

������һЩ�������������õ���iptablesѡ����ǽ����Ժ�������ǣ�

-N������һ��������
-X���Ƴ�һ��������
-P���ı�һ������Ĭ�ϲ��ԡ�
-L���г�һ�����Ĺ���
-F�����һ���������Ĺ���
-Z������Ѿ�ͨ�����������ֽں����ݰ����ļ�������

�޸�һ�������������������õģ�
-A������һ���������������
-I������һ���¹��������ĸ���λ�á�
-R��ȡ��һ����������
-D��ɾ������Ĺ��򣬿���ʹ�ù���ı�Ż����ľ���������

�����ǿ�һ���򵥵�ʵ�������ǽ���ֹ�Ը����豸PING��Ӧ������һ��'echo-reply' ���͵�ICMP���ݰ�����
���ȣ������Ǽ����"ping"ͨ���������豸��

# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms

--- 172.16.6.74 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
���ڣ����Ƕ�INPUT������һ�������⽫��ȡ����172.16.6.74��'-s 172.16.6.74'�� ��ICMP-Reply���ݰ���'-p icmp --icmp-type echo-reply'����Щ���ݰ����ᱻ ���ԣ�'-j DROP'����
# iptables -A INPUT -s 172.16.6.74 -p icmp --icmp-type echo-reply -j DROP

��������PING�Ǹ��豸��

# ping -c 3 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes

--- 172.16.6.74 ping statistics ---

3 packets transmitted, 0 packets received, 100% packet loss

���������������һ������Ӧû��ͨ�������Ǽ���Ѿ�����ֹ��3���� Ӧ����3�����ݰ���252�ֽڣ�

# iptables -L INPUT -v
Chain INPUT (policy ACCEPT 604K packets, 482M bytes)
 pkts bytes target     prot opt in    out     source       destination
  3   252   DROP       icmp --  any   any     172.16.6.74    anywhere

����뷵�ص���ʼ״̬������Ҫ���Ľ������Ƴ�INPUT����ĵ�һ������

# iptables -D INPUT 1

������PINGһ�Σ�

# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms

--- 172.16.6.74 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
#

�����ˣ�

����Զ�3������������������������3������������β����Ƴ�����ʹͨ��ͨ���� �ǡ��������ã��ٸ����ӣ����Ա����ڲ�ͬ�������ظ�����

����������һ����С���ķ���ǽ������Ĺ�����������ssh����DNS����http�� smtp���������һЩ�޹ؽ�Ҫ�ġ�
Ϊ�˼򵥻�������������д��shell�ű������ø�����һ�㡣������ű�����һ���µ� ����ǰӦ����յ�ǰ���á�������һ��С����ȥ���нű�������������û�и��������� �����

rc.firewall

#!/bin/sh

# Flushing out the rules
iptables -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD


# The chain is built according to the direction.
# bad = eth0 (outside)
# dmz = eth1 (inside)
iptables -X bad-dmz
iptables -N bad-dmz
iptables -X dmz-bad
iptables -N dmz-bad
iptables -X icmp-acc
iptables -N icmp-acc
iptables -X log-and-drop
iptables -N log-and-drop

# Specific chain used for logging packets before blocking them
iptables -A log-and-drop -j LOG --log-prefix "drop "
iptables -A log-and-drop -j DROP

# The packets having the TCP flags activated are dropped
# and so for the ones with no flag at all (often used with Nmap scans)
iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j log-and-drop
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j log-and-drop

# The packets coming from reserved addresses classes are dropped
# and so for multicast
iptables -A FORWARD -i eth+ -s 224.0.0.0/4 -j log-and-drop
iptables -A FORWARD -i eth+ -s 192.168.0.0/16 -j log-and-drop
iptables -A FORWARD -i eth+ -s 172.16.0.0/12 -j log-and-drop
iptables -A FORWARD -i eth+ -s 10.0.0.0/8 -j log-and-drop

# The packets belonging to an already established connexion are accepted
iptables -A FORWARD -m state --state INVALID -j log-and-drop
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# The corresponding chain is sent according to the packet origin
iptables -A FORWARD -s $DMZ_ADDR -i $DMZ_IFACE -o $BAD_IFACE -j dmz-bad
iptables -A FORWARD -o $DMZ_IFACE -j bad-dmz
# All the rest is ignored
iptables -A FORWARD -j log-and-drop

# Accepted ICMPs
iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A icmp-acc -j log-and-drop

# Outside -> Inside chain
# mail, DNS, http(s) and SSH are accepted
iptables -A bad-dmz -p tcp --dport smtp -j ACCEPT
iptables -A bad-dmz -p udp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport www -j ACCEPT
iptables -A bad-dmz -p tcp --dport https -j ACCEPT
iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT
iptables -A bad-dmz -p icmp -j icmp-acc
iptables -A bad-dmz -j log-and-drop

# Inside -> Outside chain
# mail, DNS, http(s) and telnet are accepted
iptables -A dmz-bad -p tcp --dport smtp -j ACCEPT
iptables -A dmz-bad -p tcp --sport smtp -j ACCEPT
iptables -A dmz-bad -p udp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport www -j ACCEPT
iptables -A dmz-bad -p tcp --dport https -j ACCEPT
iptables -A dmz-bad -p tcp --dport telnet -j ACCEPT
iptables -A dmz-bad -p icmp -j icmp-acc
iptables -A dmz-bad -j log-and-drop

# Chains for the machine itself
iptables -N bad-if
iptables -N dmz-if
iptables -A INPUT -i $BAD_IFACE -j bad-if
iptables -A INPUT -i $DMZ_IFACE -j dmz-if

# External interface
# SSH only accepted on this machine
iptables -A bad-if -p icmp -j icmp-acc
iptables -A bad-if -p tcp --dport ssh -j ACCEPT
iptables -A bad-if -p tcp --sport ssh -j ACCEPT
ipchains -A bad-if -j log-and-drop

# Internal interface
iptables -A dmz-if -p icmp -j icmp-acc
iptables -A dmz-if -j ACCEPT

���ڷ��������ļ���˵����Linux�ܹ��޸�ToS��"Type of Service"���ֶΣ��� һ�����ݰ����費ͬ������Ȩ��������������������������SSH���ݰ���������Ӧ��

iptables -A OUTPUT -t mangle -p tcp --dport ssh -j TOS --set-tos Minimize-Delay

��ͬ���ķ���������FTP���������ʹ��'--set-tos Maximize-Throughput' ѡ�������ƴ����ٶȡ�

�����Netfilter��������֪������һ����Ч�����ݰ�����ϵͳ�Ļ���֪ʶ�����ǣ� ���ǵ��漰��ȫʱ����ǽ����������ҩ����������һ��Ԥ�����㻹��ʹ��ǿ׳�����룬 ���µİ�ȫ���������ּ��ϵͳ�ȵȡ�

 

�漰����

 

����ƪ���·�������

ÿƪ���¶��и��Եķ���ҳ�档�����ҳ����������ύ���ۣ�Ҳ���Բ鿴�������ߵ����ۣ�
 ����ҳ�� 

<--, back to the index of this issue

��ҳ��LinuxFocus�༭��ά��
© Vincent Renardias, FDL
LinuxFocus.org
������Ϣ:
fr --> -- : Vincent Renardias <vincent(at)renardias.com>
fr --> en: Georges Tarbouriech <gt(at)linuxfocus.org>
en --> zh: hwhuwww <hudihui(at)zj165.com>

2004-03-15, generated by lfparser version 2.46