分类: LINUX
2015-07-16 14:31:53
封包进入本机时,会通过防火墙、服务器软件程序、SELinux与文件系统等
最小化安装的linux,之后实验安装http、dns等无论如何配置配置文件,就是无法访问服务,后发现是iptables也就是防火墙捣的鬼!还有一个东西就是SELinux,这两个服务默认都是开启的,
所以你最好不要不负责任的关闭它,而是配置它,搞了一天iptables收集到就是这些,至于iptables的nat和postrouting部分暂不研究。以下的研究主要针对服务器开放服务端口方面的设置
参数:
-A:新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用 -A 就可以加上第五条规则!
-I:插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号
-F:清除,但清除不了大P参数
-P:(大P) 定义策略( Policy即INPUT/FORWARD/OUTPUT )
-L:列出目前的 table 的规则,默认为filter(iptables -L -t nat直接使用-L表示列出filter表,-t nat表示列出nat表的规则)
-t:后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-i:封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;
-o:封包所传出的那个网络接口,需与 OUTPUT 链配合;
-p:(小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:范围:限制来源的端口号码,端口号码可以是连续的
--dport:埠口范围:限制目标的端口号码,端口号码可以是连续的,例如iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
不指定-i/-o/-p/-s/-d/--sport/--dport如下面的实例
iptables -A INPUT -i lo -j ACCEPT
细看上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!这个概念挺重要的,就是"没有指定的项目,则表示该项目完全接受"
的意思! 例如这个案例当中,关于 -s, -d...等等的参数没有规定时,就代表不论什么值都会被接受啰。
-j:后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
常用的ACTION:
ACCEPT:该封包可接受
DROP:该封包直接丢弃,不会让 client 端知道为何被丢弃。
REJECT:明示拒绝
LOG:记录 外挂模块 iptables -A INPUT [-m state] [--state 状态]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
state :状态模块
mac :网络卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
INVALID :无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态;
NEW :想要新建立联机的封包状态(NEW参数通常用在INPUT的服务端,表示第一个数据包到达服务器时,状态字段为NEW);
RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
范例:如果OUTPUT为ACCEPT只要已建立或与我们主机发送出去的封包有关就予以通过,只要是不合法封包就丢弃
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
(1)查看规则
iptables-save [-t table]
查看已经保存的配置
more /etc/sysconfig/iptables
查看内存中的配置
iptables-save #列出完整的防火墙规则
iptables -L -n #与iptables-save类似,两个命令输出的配置是同步的,只是没有iptables-save完整。
(2)清除规则
iptables [-t tables] [-FXZ]
选项与参数:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰;
-Z :将所有的 chain 的计数与流量统计都归零
(3)设定预设规则
iptables -p INPUT DROP #拒绝所有数据包进入
iptables -p OUTPUT ACCEPT #拒绝所有数据包出去
iptables -p FORWARD DROP #拒绝所有数据包的转发
(4)添加规则.
可以使用iptables -A命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功,可以参见下的插入规则
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
iptables -A INPUT 1 -p tcp --dport 22 -j ACCEPT #为了能采用远程SSH登陆,我们要开启22端口.
iptables -A INPUT 1 -p tcp --dport 80 -j ACCEPT #如果做了WEB服务器,开启80端口
iptables -A INPUT 1 -p tcp --dport 110 -j ACCEPT #如果做了邮件服务器,开启25,110端口.
iptables -A INPUT 1 -p tcp --dport 25 -j ACCEPT #如果做了邮件服务器,开启25,110端口.
iptables -A INPUT 1 -p tcp --dport 21 -j ACCEPT #如果做了FTP服务器,开启21端口
iptables -A INPUT 1 -p tcp --dport 20 -j ACCEPT #如果做了FTP服务器,开启20端口
iptables -A INPUT 1 -p tcp --dport 53 -j ACCEPT #如果做了DNS服务器,开启53端口
如果你还做了其他的服务器,需要开启哪个端口,参照/etc/services照写就行了。
iptables -A INPUT -p icmp -j ACCEPT #允许icmp包通过,也就是允许ping,
iptables –A INPUT –s 192.168.0.2 –j ACCEPT #在input方向允许192.168.0.2的访问
iptables –A INPUT –s 192.168.0.2 –j DROP #在input方向拒绝192.168.0.2的访问
(5)插入规则
iptables -I INPUT -s 192.168.0.2 -j DROP #默认插到第1个位置
iptables -I INPUT 2 -s 192.168.0.2 -j DROP #插到第2个位置
(6)删除规则
iptables -D INPUT 3
iptables -D INPUT -s 192.168.0.2 -j DROP
(7)记录某个规则的纪录
在INPUT链中默认规则是DROP,所有没有匹配到列表的数据包会被丢弃。
但是有时我们想看一下被iptables丢弃的数据包,比如以前没有开启iptables,开启iptables有可能会丢弃正常的数据包,或后安装的某项服务如http,这时除非你更新iptables配置否则用户
将无法访问你的服务器。
我们可以使用iptables中的LOG动作来对这些数据进行记录。
最简单的使用办法
iptables -I INPUT x -j LOG #x表示行,插入到第多少行之意
这样我们就可以把匹配上iptables规则的数据包写到/var/log/messages中。
因为iptables是按照自上而下的顺序对数据包进行匹配,所以在最底下DROP的上面插入LOG记录,也就是记录了执行默认规则的数据包。
iptables -A INPUT -s 192.168.2.200 -j LOG #那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个档案当中,也会记录到dmesg日志中即/var/log/dmesg。
我做了一个测试,将iptables种关于80的接受规则删除,然后在INPUT DROP前插入iptables -I INPUT x -j LOG,使用其他客户端访问服务器的80服务,得到的日志是:只有SYN报文
[root@bogon ~]# tail -f /var/log/messages Jul 16 16:31:48 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=9371 DF PROTO=TCP SPT=54714 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Jul 16 16:31:48 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=9373 DF PROTO=TCP SPT=54716 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Jul 16 16:32:00 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9381 DF PROTO=TCP SPT=54717 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Jul 16 16:32:00 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9383 DF PROTO=TCP SPT=54718 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Jul 16 16:32:03 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9415 DF PROTO=TCP SPT=54717 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Jul 16 16:32:03 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:cb:b0:20:00:5a:39:b9:18:75:08:00 SRC=192.168.1.124 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=9417 DF PROTO=TCP SPT=54718 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 |
(8)保存规则
保存方式有3种
/etc/init.d/iptables save
service iptables save
iptables-save > /etc/sysconfig/iptables #这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
(9)使规则生效(如果是手工编写的/etc/sysconfig/iptables)
service iptables restart #会读写一次/etc/sysconfig/iptables文件
我机器里的一些默认的iptables防火墙配置
如果/etc/sysconfig/iptables保存过(iptables–save > /etc/sysconfig/iptables)那么结果就与iptables –L –n相同,也与iptables-save相同 [root@localhost ~]# more /etc/sysconfig/iptables # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended.
:INPUT ACCEPT [0:0] #冒号开头的指的是链,三条内建的链三条内建链的政策都是 ACCEPT
:OUTPUT ACCEPT [456:1322] #方括号内的数字表示the OUTPUT chain matched 456 packets and 1322 bytes -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT #安装系统时开启防火墙的默认配置允许input方向的ping -A INPUT -i lo -j ACCEPT #-i表示输入接口lo,input方向的一切都允许,默认的配置 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT #允许远程主机的SSH请求,当SSH客户端第一个数据包到达服务器时,状态字段为NEW; -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许远程主机的SSH请求,当HTTP客户端第一个数据包到达服务器时,状态字段为NEW; -A INPUT -j REJECT --reject-with icmp-host-prohibited #全部进入的封包信息通通拒绝 -A FORWARD -j REJECT --reject-with icmp-host-prohibited #全部转发的封包信息通通拒绝 COMMIT #提交 [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED #只要是封包状态为 RELATED,ESTABLISHED 就予以接受 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 #只要封包协议是 icmp 类型的,就予以放行 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 #无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式 (prot 为 all),通通都接受 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 #只要是传给 port 22 的主动式联机 tcp 封包就接受 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 #只要是传给 port 80的主动式联机 tcp 封包就接受 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited #全部的封包信息通通拒绝
Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# |
最有趣的应该是第 3 条规则了,怎么会所有的封包信息都予以接受?如果都接受的话,那么后续的规则根本就不会有用! 其实那条规则是仅针对每部主机都有的内部循环测试网络 (lo) 接口!
如果没有列出接口,那么我们就很容易搞错啰~ 所以,近来鸟哥都建议使用 iptables-save 这个指令来观察防火墙规则啦!因为 iptables-save 会列出完整的防火墙规则,只是并没有规格化输出而已。
其他的练习
[root@localhost init.d]# iptables-save #查看iptables规则内容 # Generated by iptables-save v1.4.7 on Thu Jul 16 14:48:12 2015 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [5:700] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Thu Jul 16 14:48:12 2015 [root@localhost init.d]# service iptables save #保存iptables的配置 iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定] [root@localhost init.d]# iptables -I INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT #插入一条接受http访问的规则 [root@localhost init.d]# iptables-save # Generated by iptables-save v1.4.7 on Thu Jul 16 14:50:12 2015 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [5:700] -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT #新加入的内容在这 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Thu Jul 16 14:50:12 2015 [root@localhost init.d]# |