Iptables 防火墙讲义
What’s Iptables?
iptables 是一种基于包过滤的防火墙
Iptables 需要 2.4 以上版本的内核支持
2.6 内核仍然支持 iptables
iptables 和内核的关系
iptables 命令
iptables–t filter–A INPUT–p tcp –dport 23–j REJECT
iptables [-t 要操作的表] <操作命令> [要操作的链] [匹配条件] [-j 匹配到以后的动作]
iptables 的表
包过滤中包含3个表
1.filter table,过滤表
nat,用于地址转换
mangle 表,俗称矫正表,本课程不包括
mangle 的内容,仅仅简单介绍其含义
包含 INPUT、OUTPUT 和 FORWARD 链,用于处理输入、输出和转发包。
filter 表是缺省的表。
在我们使用 iptbles something 的时候等同于命令 iptables–t filter something
规则和链
每个链中的规则是按顺序的,处理一个包时,从第一条规则到最后一条规则,依次匹配。
顺序很重要
可以创建自定义规则。(大体相当于子函数)
可以动态添加、删除和修改规则
可以查看当前规则
简单的 iptalbes 命令
iptables -F 清除所有规则
iptables -L 列出当前所有规则
iptables–t filter–A INPUT–p tcp –dport 23–j REJECT
红色部分定义使用的表
紫色部分定义匹配的规则
绿色部分定义了采取的措施
[root@php_notes ~]# iptables -L
没有规则
[root@php_notes ~]# iptables -t filter -A INPUT -p tcp –dport 21 -j REJECT
[root@php_notes ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source
destination
REJECT tcp — anywhere anywhere tcp dpt:ftp reject-with icmp-port-unreachable
[root@php_notes ~]# iptables -F
[root@php_notes ~]# iptables -L
没有规则
[root@php_notes ~]# iptables -t filter -A INPUT -s 192.168.9.254 -p icmp -j DROP
[root@php_notes ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target
prot opt source
destination
DROP
icmp — localhost
anywhere
filter 表中可以采取的措施
ACCEPT 接受,等于不进行过滤
DROP 丢弃,弃之不理。别人可以判断出您的系统使用了防火墙
[root@php_notes ~]# iptables -t filter -A INPUT -s 192.168.9.254 -p icmp -j DROP
C:\Documents and Settings\Administrator>ping 192.168.9.7
Request timed out.
REJECT 弹回,貌似跟本没有打开这端口。
[root@php_notes ~]# iptables -t filter -A INPUT -s 192.168.9.254 -p icmp -j REJECT
C:\Documents and Settings\Administrator>ping 192.168.9.7
Reply from 192.168.9.7: Destination port unreachable.
LOG 进行日志,/var/log/message
匹配条件
流入、流出接口(-i、-o)网卡 eth0
来源、目的地址(-s、-d)IP
协议类型(-p)TCP、UDP、ICMP
来源、目的端口(–sport、–dport)
简单地添加规则
根据源地址进行匹配的–s 参数
[!] addr[net mask]
根据目的地址进行匹配 -d
[!] addr[net mask]
使用“!”的时候,需要在两端加空格(下同)
根据协议进行匹配的–p 参数
[!] icmp
[!] tcp
[!] udp
根据端口进行匹配,这时必须指定协议,必须是 tcp 或 udp 协议。
根据封包来源的端口进行匹配的
–sport [!] port
–source-port=–sport
port 可以用/etc/services 中的协议名来代替
根据封包的目的端口进行匹配
–dport [!] port
–dport=–destination-port
port 可以用/etc/services 中的协议名来代替
INPUT 和 OUTPUT 的差别
对于 INPUT 而言
–dport -d 都是指你自己的端口和地址
–sport 和-s 指的是发起连接者的端口和地址
对于 OUTPUT 而言
–sport -s 都是指你自己的端口和地址
–dport 和-d 指的是服务器的端口和地址
任务:使得本机不能 ssh 到 192.168.9.50,分别用 INPUT 和 OUTPUT 方法实现。
方法一
iptables -t filter -A INPUT –s 192.168.9.50 -p tcp –sport 22 -j REJECT
方法二
iptables -t filter -A OUTPUT -d 192.168.9.50–dport 22 -j REJECT
方法一中,你发起的 ssh 请求被服务器所接收,但服务器返回给你的封包被 iptables 所阻
挡。
方法二中,你发出的 ssh 请求本身就被 iptables 所阻挡。服务器当然收不到你的请求。
常用参数
Iptables-A
增加一条规则,
iptables -t filter -A INPUT -s 192.168.0.1 -j DROP
iptables -t filter -A INPUT -s 192.168.0.2 -j DROP
用 iptables -L 可以看到两条规则
Iptables -L 命令可以看到 4 条规则
iptables -D 可以删除规则
方法 1:
iptables -t filter -D INPUT -s 192.168.0.2 -j DROP
要和原来一样,但把-A 换为-D
方法二
iptables -D INPUT 2
可以删除第二条 INPUT 规则
iptables -D OUTPUT 1
可删除第一条输出规则
Iptables -L 命令
iptables -L,列出所有 filter 表的规则
等同于 iptables -t filter -L
iptables -t nat -L 列出所有 nat 表的规则
iptables -L INPUT 列出所有 filter 表中的 INPUT 规则
Iptables -F 命令
清除规则
iptables -t filter -F INPUT
iptables -t filter -F OUTPUT
iptables -t nat -F
[root@php_notes ~]# iptables -F
C:\Documents and Settings\Administrator>ping 192.168.9.7
Pinging 192.168.9.7 with 32 bytes of data:
Reply from 192.168.9.7: bytes=32 time<1ms TTL=64
[root@php_notes ~]# iptables -t filter -A INPUT -s 192.168.9.254 -p icmp -j REJECT
C:\Documents and Settings\Administrator>ping 192.168.9.7
Pinging 192.168.9.7 with 32 bytes of data:
Reply from 192.168.9.7: Destination port unreachable.
[root@php_notes ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot
opt source destination
REJECT icmp — localhost anywhere
reject-with icmp-port-unreachable
[root@php_notes ~]# iptables -D INPUT 1
[root@php_notes ~]# iptables -L
没有规则
C:\Documents and Settings\Administrator>ping 192.168.9.7
Pinging 192.168.9.7 with 32 bytes of data:
Reply from 192.168.9.7: bytes=32 time<1ms TTL=64
对比性匹配的扩展
通过–m 参数来调用.主要用法有
基于 Mac 地址的匹配–m mac
基于封包数量的匹配–m limit
基于 uid、gid 的限制–m owner
基于 MAC 地址的匹配
格式:-m mac –mac-source mac_addr
iptables -A INPUT -p tcp –dport 23 -m mac –mac-source 00:0C:29:BC:BB:DB -j REJECT
仅仅对 PREROUTING 和 INPUT 链起作用
限制别人 ping
允许每秒通过一个 icmp 包
iptables -A INPUT -p icmp -m limit –limit 1/s -j ACCEPT
超过部分全部拒绝
iptables -A INPUT -p icmp -j DROP
根据 uid 或者 gid 进行限制
-m owner 参数
-m owner –uid-owner $AN_UID
iptables -A OUTPUT -p tcp –dport 23 -m owner –uid-owner 500 -j REJECT
iptables -A OUTPUT -p udp –dport 23 -m owner –gid-owner 500 -j REJECT
注意,-m owner 仅仅对 OUTPUT 链有效
实例:一个普通的 web 服务器
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -P INPUT DROP( –policy ,Set the policy for the chain to the given target.)
实例:禁止用户访问域名为 www.taobao.com 的网站。
iptables–I FORWARD -d www.taobao.com -j DROP
实例:添加 iptables 规则禁止 IP 地址为 192.168.0.200 的客户机上网
iptables–I FORWARD -s 192.168.0.200 -j DROP
禁止 192.168.1.0 子网里所有的客户机使用 FTP 协议下载
iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 21 -j DROP
禁止客户机用 QQ,查看 config.db 文件,封 QQ 是许多管理员最为头疼的问题,特别是新版
的 QQ 比较难封锁。其实只要知道 QQ 使用的服务器地址和端口号就可以封锁了。
iptables –I FORWARD -p tcp –dport 8000–j DROP
#iptables –I FORWARD -p udp –dport 8000–j DROP
#iptables –I FORWARD –d tcpconn.tencent.com -j DROP
#iptables –I FORWARD –d tcpconn2.tencent.com -j DROP
#iptables –I FORWARD –d tcpconn3.tencent.com -j DROP
#iptables –I FORWARD –d tcpconn4.tencent.com -j DROP
#iptables –I FORWARD –d tcpconn5.tencent.com -j DROP
#iptables –I FORWARD –d http.tencent.com -j DROP
#iptables –I FORWARD –d http2.tencent.com -j DROP