一、iptables 工作流程
iptables是采用数据包过滤机制工作的,所以其会对请求的数据包的包头进行分析。
二、 防火墙的四表五链
INPUT链:处理输入数据包
OUTPUT链:处理输出数据包
FORWARD链:处理转发数据包
PREROUTING链:用于目标地址转换(DNAT)
POSTROUTING链:用于源地址转换(SNAT)
常用的两张表主要是filter表和nat表
三、防火墙工作原理
四、iptables基本参数
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-R | 替换规则列表中的某条规则 |
-z | 将表中数据包计数器和流量计数器归零 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
–dport num | 匹配目标端口号 |
–sport num | 匹配来源端口号 |
五、基本动作
参数 | 作用 |
---|---|
-j | 动作 |
ACCEPT | 接受 |
DROP | 丢弃 |
REJECT | 拒绝访问 |
RETURN | 返回调用链 |
六、iptables防火墙策略查看
① 以域名方式查看:iptables -L
② 以ip的方式显示:iptables -nL
③ 显示nat表的信息:iptables -t nat -nL
④ 显示mangle表的信息:iptables -t mangle -nL
七、命令配置的基本格式
iptables -t filter -A INPUT -p ICMP -j REJECT
八、查看命令
列出表中的所有规则:iptables [–line][-t 表名(raw,mangle,nat,filter)]–[n][v][x]L [链名(INPUT,OUTPUT,PREROUTING,FORWARD,POSTROUTING)]
–line可以显示规则编号,省略 [-t 表名] 则默认为查看filter表,-v显示更详细的信息,-n不对IP地址进行名称反解,-x 表示显示计数器的精确值。
num:行号
pkts:规则匹配到的报文数
bytes:匹配的报文包大小总和
target:规则对应的动作
prot:规则对应的协议
opt:规则对应选项
in:数据包由哪个网卡流入
out:数据包由哪个网卡流出
source:规则对应的源头地址
destination:规则对应的目标地址
policy:当前链的默认策略,当为ACCEPT时,默认放行所有报文
packets:当前链默认策略匹配到的包的数量
bytes:当前链默认策略匹配到的所有包的大小
九、iptables数据包匹配流程
基本步骤如下:
-
数据包到达网络接口,比如 eth0。
-
进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
-
如果进行了连接跟踪,在此处理。
-
进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
-
进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
-
决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
-
进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
-
进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
-
进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
-
进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
-
进入出去的网络接口。完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
-
进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
-
进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
-
交给本地主机的应用程序进行处理。
-
处理完毕后进行路由决定,看该往那里发出。
-
进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
-
连接跟踪对本地的数据包进行处理。
-
进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
-
进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
-
再次进行路由决定。
-
进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
-
进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
-
进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
-
进入出去的网络接口。完毕。
十、其他常用命令
iptables -F
#清除规则
iptables -A INPUT -s ! 189.25.89.0/23 -m state --state NEW -p tcp -m multiport --dport 23,110 -j DROP
#除189.25.89.0之外的主机,new状态,23,110端口数据包drop
iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP
#这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问我的123和110端口。
iptables -R INPUT 10 -s 192.168.5.20 -p tcp --dport 25 -j ACCEPT
替换INPUT链中的第十条规则
iptables -t filter -L INPUT -vn
#以数字形式详细显示filter表INPUT链的规则
iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800
#-A PREROUTING 指定在路由前做的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:800那里去。
iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55
#-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,我们都给他做SNAT转换,把源地址改写成 192.168.102.55 。
iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP
iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP
# 上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP
iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP
iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP
iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP
# 防止广播包从IP代理服务器进入局域网:
iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP
iptables -A INPUT -p udp -m udp --sport 5000 -j DROP
iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP
iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP
# 屏蔽端口 5000
iptables -A input -s ! 192.168.1.0/24 -i eth1 -p tcp -m tcp --dport 3306 -j drop
iptables -A input -s 192.168.1.0/24 -i eth1 -p tcp -m tcp --dport 3306 -j accept
#只允许内网用户访问 MySQL 服务器(就是 3306 端口)
iptables -A INPUT -p tcp -m multiport --dports 110,80,25,139 -j ACCEPT
#允许内网访问邮件,web,samba
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
#允许dns连接
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
#允许外网vpn连接
ptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -p icmp -j DROP
#禁止icmp通信-ping 不通
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
#内网转发
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
itables -A syn-flood -j REJECT
#防止SYN攻击 轻量
iptables -I FORWARD -p udp --dport 53 -m string --string “tencent” -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -s 192.168.0.0/24 -m string --string “ay2000.NET” -j DROP
#禁止ay2000.Net连接 !
iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
#禁止BT连接
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP
#只允许每组ip同时15个80端口转发
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
十一、相关命令操作练习
① 查看iptables当前所有规则的命令
Iptables -L -n –line-numbers
② 禁止来自10.0.0.7 ip地址访问80端口
Iptables -A INPUT -s 10.0.0.7 -p tcp –dport 80 -j DROP
③ 在命令行执行iptables的规则永久生效
/etc/init.d/iptables save
Iptables -save >/etc/sysconfig/iptables
④ 实现把访问10.0.0.3:80的请求转到172.16.1.17:80
Iptables -t nat -A PREROUTING -d 10.0.0.4 –dport 80 -j DANT –to-destination 172.16.1.6:80
⑤ 实现172.16.1.0/24端所有主机通过124.32.54.26外网ip上网
–line-numbers
② 禁止来自10.0.0.7 ip地址访问80端口
Iptables -A INPUT -s 10.0.0.7 -p tcp –dport 80 -j DROP
③ 在命令行执行iptables的规则永久生效
/etc/init.d/iptables save
Iptables -save >/etc/sysconfig/iptables
④ 实现把访问10.0.0.3:80的请求转到172.16.1.17:80
Iptables -t nat -A PREROUTING -d 10.0.0.4 –dport 80 -j DANT –to-destination 172.16.1.6:80
⑤ 实现172.16.1.0/24端所有主机通过124.32.54.26外网ip上网
Iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT –to-source 124.32.54.26