转自:http://blog.csdn.net/jixiuffff/article/details/5879547
- # 五个检查点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
- #iptables -t filter -I OUTPUT 2 -i eth0 -d 10.2.1.123 --dport 22 -s 10.2.1.123 --sport 1234 -j ACCEPT
- # 这条命令是:在filter 表中的INPUT 链上 插入一条规则在2处(此规则排在第二个位置) ,规则的具体:从我的eth0 网卡联我,且对方机 的ip 是10.2.1.111 对方端口1234,访问我的ip :10.2.1.123 我的22端口 ,时才接受
- # 然后是,从我的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 端口再进行下面三条命令
- # sshd
- # 允许任何机器向我的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要开放什么端口。
- #
- #
- #1 在/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