通过iptables设置防火墙
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#设置网卡
wk="eth1"
# 1. 清除规则
iptables -F
iptables -X
iptables -Z
# 2. 设定政策
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 3~5. 制订各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $wk -m state --state RELATED,ESTABLISHED -j ACCEPT
#samba服务
iptables -A INPUT -i $wk -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i $wk -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -i $wk -p udp --dport 137:138 -j ACCEPT
#vsftp服务
iptables -A INPUT -i $wk -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i $wk -p tcp --dport 1024:65535 -j ACCEPT
#iptables -A INPUT -i $wk -s 192.168.1.0/24 -j ACCEPT
1.查看防火墙规则
# iptables [-t tables] [-L] [-nv]
选项与参数:
-t :后面接table ,例如nat或filter,若省略此项目,则使用预设的filter
-L :列出目前的table的规则
-n :不进行IP 与HOSTNAME 的反查,显示速度会快很多!
-v :列出更多的相关信息
2.清除规则
# iptables [-t tables] [-FXZ]
选项与参数:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者"自订" 的chain;
-Z :将所有的chain 的计数与流量统计都归零
3.定义预设政策(policy)
# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项与参数:
-P :定义政策( Policy )。注意,这个P为大写啊!
ACCEPT :该封包可接受
DROP :该封包直接丢弃,不会让client 端知道为何被丢弃。
范例:将本机的INPUT设定为DROP ,其他设定为ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -t nat -P PREROUTING ACCEPT
# iptables -t nat -P POSTROUTING ACCEPT
# iptables -t nat -P INPUT ACCEPT
# iptables -t nat -P OUTPUT ACCEPT
nat表不用于过滤,所以不能设置为DROP
4.定义规则
# iptables [-AI链名] [-io网络界面] [-p协议] [-s来源IP/网域] [-sport 端口范围] [-d目标IP/网域] [-dport 端口范围] -j [ACCEPT'DROP'REJECT'LOG]
选项与参数:
-AI链名:规则的"插入"或"增加"
-A:新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用-A就可以加上第五条规则!
-I:插入一条规则。如果没有指定此规则的顺序,预设是插入变成第一条规则。
例如原本有四条规则,使用-I则该规则变成第一条,而原本四条变成2~5号
链:有INPUT,OUTPUT,FORWARD等,此链名称又与-io有关,请看底下。
-io网卡:设定封包进出的规范
-i:封包所进入的那个网卡,例如eth0,lo等网卡。需与INPUT链配合;
-o:封包所传出的那个网卡,需与OUTPUT链配合;
-p协议:设定此规则适用于哪种封包格式
主要的封包格式有:tcp,udp,icmp及all。
-s来源IP/网域:设定此规则之封包的来源项目,可指定单纯的IP或包括网域,例如:
IP :192.168.0.100
网域:192.168.0.0/24,192.168.0.0/255.255.255.0均可。
若规范为『不许』时,则加上!即可,例如:
-s!192.168.100.0/24表示不许192.168.100.0/24封包来源;
-d目标IP/网域:同-s,只不过这里指的是目标的IP或网域。
--sport 来源端口范围。例如 1024:65535
--dport 目标端口范围
-j:后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
# iptables -A INPUT [-m state] [--state状态]
选项与参数:
-m:一些iptables的外挂模块,主要常见的有:
state:状态模块
mac:网络卡硬件地址(hardware address)
--state:一些封包的状态,主要有:
INVALID:无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态;
NEW:想要新建立联机的封包状态;
RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关
例:只要已建立或相关封包就予以通过,只要是不合法封包就丢弃
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -m state --state INVALID -j DROP
对MAC地址为aa:bb:cc:dd:ee:ff主机开放其连接
# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd :ee:ff -j ACCEPT
选项与参数:
--mac-source :就是来源主机的MAC
ICMP 封包规则:针对是否回应ping 来设计
通常我们会把ICMP type 8 (echo request)去掉而已,让远端主机不知道我们是否存在,也不会接受ping的回应。
# iptables -A INPUT [-p icmp] [--icmp-type类型] -j ACCEPT
选项与参数:
--icmp-type :后面必须要接ICMP 的封包类型,也可以使用代号,
例如8 代表echo request 的意思。
例:让0,3,4,11,12,14,16,18的ICMP type可以进入本机:
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done