iptables
2016年05月13日

iptables原理

五个检查点PREROUTING ,FORWARD POSTROUTING INPUT OUTPUT
一个数据包从prerouting 进入我的机器,它有两个去向,一是经过input 访问我机器上的应用程序,后经output ,postrouting
流走,另一个去向是:直接经forward postrouting 流向别的机器,也就是说我的机器只是充当路由,数据包经我的机器到其他机器上

PREROUTING----->FORWARD------>POSTROUTING  
    |                            ^  
    |                            |  
  INPUT                        OUTPUT   
    |                            |   
    v                            |  
    -----我机器上的应用程序------>  

iptables 的结构由上到下是:表(table),规则链(chain),规则(rule) ,表由规则链组成,规则链由一条条规则组成
iptables 默认有三张表filter ,nat ,mangle , 使用-t 参数指定对哪张表操作,如果不指定,则默认是对filter 表进行操作

filter 默认有三条内建的规则链, INPUT FORWARD OUTPUT
nat … POSTROUTING ,OUTPUT PREROUTING
mangle … OUTPUT PREROUTING

命令详解

iptables 命令的一般格式

iptables [ -t table]  操作  [ chain] [options ]  

一个查对完整参数的示例

iptables -t filter -I INPUT 2 -i eth0  -s 10.2.1.111 --sport 1234 -d 10.2.1.123 --dport 22   -j ACCEPT   

在filter表的INPUT链上插入一条规则在2处(此规则排在第二个位置) ,规则的具体:从我的eth0网卡联我,且对方机的ip是10.2.1.111,对方端口1234,访问我的ip :10.2.1.123,我的22端口时才接受

iptables -t filter -I OUTPUT 2 -i eth0  -d 10.2.1.123  --dport 22 -s 10.2.1.123  --sport 1234   -j ACCEPT   

从我的ip 10.2.1.123:22 向10.2.1.111:1234 经eth0 网卡发出的包放行

iptables -F         # 清空filter的所有规则链  
iptables -t nat -F  # 清空nat表的所有规则链  

关于INPUT ,OUTPUT 都是相对于“我”这台机器,即INPUT :表示向我输入数据,OUTPUT 表示“我”向外输出数据
而-s -d --sport --dport 分别表示 源ip(source) ,目标ip(destination) ,源ip的端口,目标ip的端口
当在对INPUT 作处理的时候,-s 指的是对方的机器,-d 指的是我这台机器,因为数据是从对方的机器流向我的,
而对OUTPUT 作处理的时候 -s 指的是我,而-d 指的是对方的机器
正确使用防火墙,一般默认设为拒绝所有,然后只开放需要开放的,而不是允放所有,只拒绝需要拒绝的

首先启动iptables服务

/etc/init.d/iptables start   

我用的是gentoo 系统装上iptables 后,第一次运行 它它提示我要先运行/etc/init.d/iptables save,好像是做一些初始化或者保存一些文件,

/etc/init.d/iptables save   
/etc/init.d/iptables start   

启动后看一下默认的访问规则

iptables -L
# 或者iptables -L --line-number 显示行号, -v 详细信息  
Chain INPUT policy ACCEPT
target     prot opt source               destination           
Chain FORWARD policy ACCEPT
target     prot opt source               destination           
Chain OUTPUT policy ACCEPT
target     prot opt source               destination  

默认情况下policy是ACCEPT,等于没有防火墙,现在修改默认的policy
注意千万不要使用远程ssh 连接进行这个操作,因为它也会关闭ssh 使用的22 端口
使用ssh 连接 ,首先开放了22 端口再进行下面三条命令

允许任何机器向我的22 端口发出请求,这里没用用-t 则默认是-t filter

iptables -A INPUT  -p tcp --dport 22      -j ACCEPT  

等价于:

iptables -t filter  -A INPUT  -p tcp --dport 22      -j ACCEPT  

允许我的22端口向外输出数据

iptables -A OUTPUT  -p tcp --sport 22      -j ACCEPT  

如果只限某些特定ip的机器访问我,上面两条要换成

iptables -A INPUT  -p tcp --dport 22  -s 10.2.1.110     -j ACCEPT  
iptables -A OUTPUT  -p tcp --sport 22 -d 10.2.1.110     -j ACCEPT  

现在只有ip为10.2.1.110的ip 可以访问我

修改默认规则

iptables -P INPUT  DROP  
iptables -P OUTPUT DROP  
iptables -P FORWARD DROP   

默认的策略只能是ACCEPT,DROP,不能是REJECT

Chain INPUT policy DROP  
target     prot opt source               destination           
Chain FORWARD policy DROP  
target     prot opt source               destination           
Chain OUTPUT policy DROP  
target     prot opt source               destination  

现在无论INPUT,OUTPUT,FORWARD 默认都是丢包(drop拒绝),而不是accept接受
此时我极度安全,等于没连网,我不能访问别人,别人不能访问我
现在我想上网
假 如我想访问对方的80 端口,其实包括了两个方面,一是我有权限向对方的80 端口发出请求,二是有权限从对方的80 端口取得数据,这里只规定对方的 80 端口,而没有规定我从哪个端口去访问它的80 ,意味着我可以从任意端口访问对方的80端口,这里端口都是tcp 类型的
允许我向对方的80 端口发出请求

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT  

允许对方的80 端口向我返回数据

iptables -A INPUT -p tcp --sport 80 -j ACCEPT  

虽然我们此时可以访问对方的80 端口,但是我们在浏览器中输入www.baidu.com 并不能显示对方的网页,但是 http://202.108.22.142/ 确可以。因为在这个过程中还要进行dns域名解析,又要有另一个权限,那就是允许我向 dns server 的udp 53 端口请求,并允许从它返回数据

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT  
iptables -A INPUT -p udp --sport 53 -j ACCEPT  

这里没有指定dns server 的ip 地址,如果想边dns server 的ip 也做限定的话
可以这样写

iptables -A OUTPUT -p udp -d 211.64.208.1 --dport 53 -j ACCEPT  
iptables -A INPUT -p udp -s 211.64.208.1  --sport 53 -j ACCEPT  

我校园网用drcom 进行流量计费要开upd 61440 端口
drcom
允许211.64.208.160 从它的61440 (sport) 端口连接到我的机器的61440 (dport).
-s 表示源,表示从哪台机器向我发送数据

iptables -A INPUT  -p udp --sport 61440 --dport 61440 -s 211.64.208.160 -j ACCEPT  

允许 我的机器 从61440(sport) 端口 向211.64.208.160 的61440(dport)端口发送数据
-d 指定对方机器(目标机器).

iptables -A OUTPUT  -p udp --sport 61440 --dport 61440 -d 211.64.208.160 -j ACCEPT  

目前为止,都是作为一个客户去访问别人,如果我要在我的电脑上架设个服务器又当如何呢,比如架设sshd 及web 服务器
web服务器,开放80端口

iptables -A INPUT -p tcp  --dport 80 -j ACCEPT   
iptables -A OUTPUT  -p tcp  --sport 80 -j ACCEPT   

开放ftp 服务

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT  

允许连接保持的被动访问。
ftp协议是一个简单、保密性差(明码)的tcp协议,它的工作原理是客户端先连服务器端的21端口,然后经过3步的握手以后建立了一条连接。要注意的是,这条连接只可以用来传输ftp的命令,只有这条连接的话是什么都传不了的,就算是用“ls”命令来查看文件也不行。
建立了命令的连接以后,服务器端就要建立一条数据的连接。数据的连接又分为主动模式(port)和被动模式(passive)。ftp默认是被动模式,主 动和被动之间使用"pass"命令切换。主动模式通过20端口与客户端相连,而被动模式却使用1024以后的端口与客户端相连。由于1024以后的端口是 随机分配的,所以在被动模式下我们是不知道服务端是使用什么端口与客户端连接的。也就是说,我们是不知道iptables要开放什么端口。

在/etc/conf.d/iptables配置文件中 加入 如下语句(不同发行版可能文件位置不同).

IPTABLES_MODULES="ip_conntrack_ftp"  

iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -A INPUT -p tcp --dport 21 -j ACCEPT  
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT  

主动模式使用20端口

iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT  
iptables -A INPUT -p tcp --dport 20 -j ACCEPT  

对于lo 设备的数据包都放行 ,也就是本机数据 -i 表示输入,-o 表示输出
表示所有从lo 来的数据accept

iptables  -t filter  -I  INPUT l -i lo  -j ACCEPT   

表示流向lo 的数据accept

iptables  -t filter  -I   OUTPUT 1 -o lo  -j ACCEPT   

完整的脚本:

sudo /etc/init.d/iptables save  
sudo /etc/init.d/iptable restart  

清空表中规则链

iptables -F   
iptables -X  
iptables -t nat -F   
iptables -t nat -X  

开放sshd服务

iptables -A INPUT  -p tcp --dport 22      -j ACCEPT  
iptables -A OUTPUT  -p tcp --sport 22      -j ACCEPT  

默认drop 所有包

iptables -P INPUT  DROP  
iptables -P OUTPUT DROP  
iptables -P FORWARD DROP   

本机设备放行

iptables  -t filter  -I  INPUT 1 -i lo  -j ACCEPT   
iptables  -t filter  -I   OUTPUT 1 -o lo  -j ACCEPT   

dns

iptables -A OUTPUT -p udp   --dport 53 -j ACCEPT  
iptables -A INPUT -p udp --sport 53  -j ACCEPT  

上网

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT  
iptables -A INPUT -p tcp --sport 80 -j ACCEPT  

drcom

iptables -A INPUT  -p udp --sport 61440 --dport 61440 -s 211.64.208.160 -j ACCEPT  
iptables -A OUTPUT  -p udp --sport 61440 --dport 61440 -d 211.64.208.160 -j ACCEPT  

ftp
在配置文件中加入

IPTABLES_MODULES="ip_conntrack_ftp"  
iptables -I INPUT  2 -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -I OUTPUT 2  -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -A INPUT -p tcp --dport 21 -j ACCEPT  
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT  
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT  
iptables -A INPUT -p tcp --dport 20 -j ACCEPT  

web 服务

iptables -A INPUT -p tcp  --dport 80 -j ACCEPT   
iptables -A OUTPUT  -p tcp  --sport 80 -j ACCEPT   

dhcp ,使用dhcp 获得ip
dhcp

iptables -A INPUT -p udp --sport 67 --dport 68 -j ACCEPT  
vi /usr/src/iptables-ddos.sh
echo "/bin/sh /usr/src/iptables-ddos.sh" >> /etc/rc.local

脚本如下:

#!/bin/bash
modprobe ipt_recent ip_list_hash_size=0 ip_list_tot=16384 ip_pkt_list_tot=200
iptables -F SYN_FLOODING
iptables -X SYN_FLOODING
iptables -N SYN_FLOODING
iptables -t filter -F
iptables -A INPUT -i eth0 -m state --state INVALID -j DROP
iptables -A INPUT -p all -m state --state ESTABLISHE,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --syn -m multiport --dports 80,443 -m limit --limit 1/m --limit-burst 300 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --syn -m multiport --dports 80,443 -j SYN_FLOODING
iptables -A SYN_FLOODING -i eth0 -p tcp --syn -m multiport --dports 80,443 -m recent --name SYN_FLOOD --update --second 120 --hitcount 1 -j  ACCEPT
iptables -A SYN_FLOODING -i eth0 -p tcp --syn -m multiport --dports 80,443 -m recent --name SYN_FLOOD --set
iptables -A SYN_FLOODING -i eth0 -p tcp --syn -m multiport --dports 80,443 -j DROP

linux DDOS

echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

禁止连续ping

iptables -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --update --second 60 --hitcount 6 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --set

防止扫描端口(包含过滤连续ping功能,所以禁止ping要放在前面).

iptables -A INPUT -p all -m state --state NEW -m recent --name port_scan --update --seconds 1800 --hitcount 10 -j DROP
iptables -A INPUT -p tcp --syn -m state --state NEW -m multiport --dports 22122,80,7777,1723 -j ACCEPT
iptables -A INPUT -p all -m recent --name port_scan --set

ip 欺骗防护

iptables -A INPUT -i ! lo -s 127.0.0.0/8 -j DROP
iptables -A INPUT -p all -s 10.254.0.0/24 -j ACCEPT
iptables -A INPUT -p all -s 10.0.0.0/8 -j DROP
iptables -A INPUT -p all -s 172.16.0.0/12 -j DROP
iptables -A INPUT -p all -s 192.168.0.0/16 -j DROP
iptables -A INPUT -p ! udp -s 224.0.0.0/4 -j DROP
[*] Networking support  --->
Networking options  --->
...
[*] TCP/IP networking
[ ]   IP: multicasting
[ ]   IP: advanced router
[ ]   IP: kernel level autoconfiguration
< >   IP: tunneling
< >   IP: GRE demultiplexer
[ ]   IP: TCP syncookie support
< >   Virtual (secure) IP: tunneling
< >   IP: AH transformation
< >   IP: ESP transformation
< >   IP: IPComp transformation
<*>   IP: IPsec transport mode
<*>   IP: IPsec tunnel mode
    < >   IP: IPsec BEET mode
< >   Large Receive Offload (ipv4/tcp)
    <*>   INET: socket monitoring interface
    < >     UDP: socket monitoring interface
    [ ]   TCP: advanced congestion control  ----
    [ ]   TCP: MD5 Signature Option support (RFC2385)
    <*>   The IPv6 protocol  --->
    [ ] Security Marking
    [ ] Timestamping in PHY devices
    [*] Network packet filtering framework (Netfilter)  --->
--- Network packet filtering framework (Netfilter)
    [ ]   Network packet filtering debugging
    [ ]   Advanced netfilter configuration
    Core Netfilter Configuration  --->
    <M> Netfilter LOG over NFNETLINK interface
    <*> Netfilter connection tracking support
[ ]   Supply CT list in procfs (OBSOLETE)
    < >   FTP protocol support
    < >   IRC protocol support
    < >   NetBIOS name service protocol support
    < >   SIP protocol support
    < >   Connection tracking netlink interface
    < > Netfilter nf_tables support
-*- Netfilter Xtables support (required for ip_tables)
    *** Xtables combined modules ***
    < >   nfmark target and match support
    *** Xtables targets ***
    < >   LOG target support
    < >   "NFLOG" target support
    < >   "TCPMSS" target support
    *** Xtables matches ***
    <*>   "conntrack" connection tracking match support
    < >   IPsec "policy" match support
    < >   "state" match support
    < >   IP set support  ----
    < >   IP virtual server support  ----
    IP: Netfilter Configuration  --->
    <*> IPv4 connection tracking support (required for NAT)
<*> IP tables support (required for filtering/masq/NAT)
    <*>   Packet filtering
    <*>     REJECT target support
< >   ULOG target support (obsolete)
    < >   IPv4 NAT
    < >   Packet mangling
< >   raw table support (required for NOTRACK/TRACE)
    IPv6: Netfilter Configuration  --->
    <*> IPv6 connection tracking support
<*> IP6 tables support (required for filtering)
    < >   "ipv6header" IPv6 Extension Headers Match
    <*>   Packet filtering
    <*>     REJECT target support
    < >   Packet mangling
< >   raw table support (required for TRACE)

相关链接

http://hi.baidu.com/feixuemengying/item/d6c79114f3a33a0e8fbde4df
http://blog.163.com/js4461751@126/blog/static/2365588820071132255516/

gentoo iptabls规则
http://forum.ubuntu.org.cn/viewtopic.php?f=21&t=789