1. 关于iptables。
Iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables会查找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。
iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
如图可以知道:
1)这4个表的优先级别:raw > mangle > nat > filter
2)每个表中包含的链
- raw表有2个链:prerouting、output
- mangle表有5个链:prerouting、postrouting、input、output、forward
- nat表有3个链:prerouting、postrouting、output
- filter表中有3个链:input、output、forward
最常用的链:input(进入)、output(出去)、forward(转发),而prerouting与postrouting用于网络地址转换(NAT)
2. filter表规则链的类型。
输入(INPUT),转发(FORWARD),输出(OUTPUT)
INPUT:这条链用来过滤目的地址是本机的连接。例如,如果一个用户试图使用SSH登陆到你的PC/服务器,iptables会首先匹配其IP地址和端口到iptables的输入链规则。
FORWARD:这条链用来过滤目的地址和源地址都不是本机的连接。例如,路由器收到的绝大数数据均需要转发给其它主机。如果你的系统没有开启类似于路由器的功能,如NATing,你就不需要使用这条链。
检测系统是否需要转发链:
上图是对一台已经运行了几个星期的服务器的截图。这台服务器没有对输入和输出做任何限制。从中可以看到,输入链和输出链已经分别处理了11GB和17GB的数据,而转发链则没有处理任何数据。这是因为此服务器没有开启类似于路由器的转发功能。
OUTPUT:这条链用来过滤源地址是本机的连接。例如,当你尝试ping howtogeek.com时,iptables会检查输出链中与ping和howtogeek.com相关的规则,然后决定允许还是拒绝你的连接请求。
注意:当ping一台外部主机时,看上去好像只是输出链在起作用。但是请记住,外部主机返回的数据要经过输入链的过滤。当配置iptables规则时,请牢记许多协议都需要双向通信,所以你需要同时配置输入链和输出链。人们在配置SSH的时候通常会忘记在输入链和输出链都配置它
3. 链的默认行为。
如果匹配不到规则,iptables该怎么做。
设置默认行为:
[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT
[root@tp ~]# iptables -p FORWARD DROP
查看iptables各种类型链的默认行为:
添加规则:
有上图可以看出,INPUT类型的默认是DROP,所以我们要编写ACCEPT(通过)的链
#开放22端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#对指定的IP开放22端口
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
#只允许特定的IP可以ping
[root@tp ~]# iptables -A INPUT -p icmp -s 192.168.66.123 -j ACCEPT
4. iptables中的一些规则:
iptables -F # 清除所有的chain中的所有rule,但保留chain
iptables -F -t nat #清除nat table中chain的所有rule
iptables -P INPUT DROP #给INPUT链添加默认行为
iptables -A INPUT rule #给INPUT链添加rule,在结尾追加
iptables -I INPUT rulenum rule #在rule编号为rulenum的后面插入该规则
iptables -D INPUT rulenum #删除某条规则
动态规则:
1、有四种动态参数:
NEW:当你在使用UDP、TCP、ICMP等协议时,发出的第一个包的状态就是“NEW”
ESTABLISHED:当你在使用TCP、UDP、ICMP等协议时:假设你的主机发出的第一个包成功穿越防火墙,那么接下来你的主机 发出和接收 到的包的状态都是“ESTABLISHED”。
RELATED:当连接建立后,又有相关的连接建立(典型的是ftp的passive模式,由client发起到server的数据连接,这个端口是由server指定的,但由client发起)
INVALID:状态为INVALID的包就是状态不明的包,也就是不属于前面3中状态的包,这类包一般会被视为恶意包而被丢弃。
用法:
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
上面两条命令,拒绝所有NEW的外来包(外来主机请求建立连接的包)。但允许自己发出的连接收到外来的数据(ESTABLISHED)
再加上:
iptables -A INPUT -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -p udp -dport 21 -j ACCEPT
则表示可以允许外界访问21端口(FTP,并假设采用passive模式),结合上面的状态,则允许外界主动发起到自己的ftp数据连接———可能是任意端口。
所以,一般,先写上动态规则,然后再写静态规则,就可以做到处理一些像FTP Passive模式这种不知道用户会访问哪个端口的情况。
drop非法连接:
[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
用子网掩码禁止IP段:
/sbin/iptables -A INPUT -i eth1 -p tcp -s 219.142.118.0/24 --dport 80 -j ACCEPT
# 或者
/sbin/iptables -A INPUT -i eth1 -p tcp -s 219.142.118.0/255.255.255.0 --dport 80 -j ACCEPT
一个防火墙实例:
#!/bin/sh
echo "starting forward..."
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j ACCEPT
/sbin/iptables -A INPUT -i eth2 -j ACCEPT
/sbin/iptables -A INPUT -s 118.194.48.38 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.66.168 -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -s 172.28.4.88 -p tcp --dport 10050 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 81 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 3690 -j ACCEPT
/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 4000 -j ACCEPT
/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 6379 -j ACCEPT
#ping
/sbin/iptables -A INPUT -p icmp -s 192.168.66.0/23 -j ACCEPT
/sbin/iptables -P INPUT DROP
防火墙的操作:
service iptables start / stop /status
iptables-save > /etc/rc.d/forward 将防火墙导出保存为文件
#添加开机启动
vim /etc/rc.local
#加下面这行
sh /etc/rc.d/forward
参考:
http://blog.chinaunix.net/uid-20485483-id-82944.html
http://www.poluoluo.com/server/201403/265782.html