iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。
一、iptables的表与链 用我的话说是[4表5链]
1. Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
· INPUT链 – 处理来自外部的数据。
· OUTPUT链 – 处理向外发送的数据。
· FORWARD链 – 将数据转发到本机的其他网卡设备上。
2. NAT表
NAT表有三种内建链:
· PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ipaddress),通常用于DNAT(destination NAT)。
· POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ipaddress),通常用于SNAT(source NAT)。
· OUTPUT链 – 处理本机产生的数据包。
3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
· PREROUTING
· OUTPUT
· FORWARD
· INPUT
· POSTROUTING
4. Raw表
Raw表用于处理异常,它具有2个内建链:
· PREROUTING chain
· OUTPUT chain
二、IPTABLES 规则(Rules)
· Rules包括一个条件和一个目标(target)
· 如果满足条件,就执行目标(target)中的规则或者特定值。
· 如果不满足条件,就判断下一条Rules。
目标值(Target Values)
下面是你可以在target里指定的特殊值:
· ACCEPT – 允许防火墙接收数据包
· DROP – 防火墙丢弃包
· LOG - 在/var/log/messages 文件中记录日志信息,然后传递给下一条规则。防火墙规定的“匹配即停止”的原则对LOG来说是一个例外。LOG是一种辅助动作,没有真正出来数据包。
· REJECT – 防火墙拒绝数据包通过。并且给数据发送端一个回应的信息
三 、编写防火墙规则
基本语法、控制类型
iptables [-t 表名] 可以省略,默认是filter表 [管理选项](-I、-A、-D、-L)[链名](INPUT、OUTPUT、FORWARD)[匹配条件] [-j 控制类型]
一定要区分大小写
例子:在filter表的INPUT链中插入规则,拒绝发给本机的使用ICMP协议的数据包
iptables -t filter -I INPUT -p icmp -j REJECT
管理选项 -A 在指定的链的末尾追加一条新的规则 -I 在指定的链中插入一条规则。
例子:
在filter表的INPUT链的末尾追加一条防火墙规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
-I
在filter表中插入第1条和第2条规则
iptables -I INPUT -p udp -j ACCEPT
iptabels -I INPUT 2 -p icmp -j ACCPET
查看规则列表
iptables -L INPUT --line-numbers
插入一条策略
iptables -I INPUT 3 -p tcp--dport 22 -j ACCEPT
注释:所有使用TCP协议并且目标端口是22的流量全部允许通过的顺序为3的策略
删除一条策略
iptables -D INPUT 3
删除所有策略(临时生效)
iptables -F 清除预设表filter链中的所有规则
iptables -X 清除预设表filter使用者自定义的规则
iptables -n -F INPUT 查看删除后的效果
iptables -t nat -F
iptables -t mangle -F
开机后自启动防火墙的设定 命令行输入
#ntsysv
[root@host.jefflei.com ~]# ntsysv
在gui中选上iptables后。确认
设置chain(链)的策略 -P
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
3.屏蔽指定ip
有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃:
BLOCK_THIS_IP="x.x.x.x"iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
以上命令设置将由x.x.x.x ip发往eth0网口的tcp包丢弃。
4.配置服务项
利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH连接本机:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
类似的,对于HTTP/HTTPS(80/443)、pop3(110)、rsync(873)、MySQL(3306)等基于tcp连接的服务,也可以参照上述命令配置。
对于基于udp的dns服务,使用以下命令开启端口服务:
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
5.网口转发配置
对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0连接内网,eth1连接公网,配置规则如下:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
6.端口转发配置
对于端口,我们也可以运用iptables完成转发配置:
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
以上命令将422端口的包转发到22端口,因而通过422端口也可进行SSH连接,当然对于422端口,我们也需要像以上“4.配置服务项”一节一样,配置其支持连接建立的规则。
7.DoS攻击防范
利用扩展模块limit,我们还可以配置iptables规则,实现DoS攻击防范:
iptables -A INPUT -p -tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
--litmit25/minute 指示每分钟限制最大连接数为25
--litmit-burst100 指示当总连接数超过100时,启动 litmit/minute 限制
8.配置web流量均衡
我们可以将一台服务器作为前端服务器,利用iptables进行流量分发,配置方法如下:
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80
以上配置规则用到nth扩展模块,将80端口的流量均衡到三台服务器。
9.将丢弃包情况记入日志
使用LOG目标和syslog服务,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以下方式实现。
首先自定义一个chain:
iptables -N LOGGING
其次将所有接收包导入LOGGING chain中:
iptables -A INPUT -j LOGGING
然后设置日志前缀、日志级别:
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
最后将包倒向DROP,将包丢弃:
iptables -A LOGGING -j DROP
另可以配置syslog.conf文件,指定iptables的日志输出。
禁止访问21端口(ftp)和80端口(web)
iptables -A -i eth1 -p tcp --dprot 21 -j DROP
iptables之实现SNAT
1.开启路由转发功能
#echo 1 >/proc/sys/net/ipv4/ip_forward
#sysctl -a | grep "ip_forward"
显示“net.ipv4.ip_forward=1”即可表示成功开启,该方法只是临时有效,重启就会失效
永久生效方式,则需要将“net.ipv4.ip_forwaed=1”写入/etc/sysctl.conf中,“sysctl -p”生效
2.配置iptables的SNAT规则
①外网使用的是静态的ip
iptables -t nat -A POSTROUTING -s192.168.1.0/24 -o eth0 -j SNAT --to-source 202.100.1.1
语法:
iptables -t nat -A POSTROUTING -s source_ip -o interface_output -jSNAT --to-source ip[-ip]:[port-port]
②如果是动态获取ip+ADSL拨号则使用
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -oppp0 -j MASQUERADE
※www-server
yum install -y httpd
echo "jeffery.com's home page" > /var/www/html/index.html
service httpd start
setenforce 0 ##关闭selinux
iptables -F ## 做测试,防火墙可关闭
※w2003只需要配置好ip地址和gw即可
测试:
iptables之实现DNAT
iptables -t nat -A PREROUTING -d 202.100.1.1 -p tcp --dport 80 -jDNAT --to-destination 192.168.1.1
在DNAT中可以再发布时修改目标端口。为了提高安全
iptables -t nat -A PREROUTING -d 202.100.1.1 -p tcp --dport 8080 -jDNAT --to-destination 192.168.1.1:80