菜鸟学Linux 第066篇笔记 简单配置iptables
Linux 网络防火墙
netfilter: frame
iptables: 数据报文过滤,NAT, mangle 等规则生成的工具
网络: IP报文首部, TCP报文首部
ip 协议
tcp protocol
三次握手
四次断开
防火墙 硬件, 软件: 规则(匹配标准,处理办法)
framework
默认规则
开放:堵
关闭:通
规则:匹配标准
IP:源IP,目标IP
TCP: 源port, 目标port
UDP: 源port, 目标port
ICMP:icmp-type
Linux2.0
ipfw/firewall
Linux 2.2
ipchain/firewall
Linux2.4
iptables/netfilter
hock function: 勾子函数
prerouting
input
output
forward
postrouting
规则链
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
filter(过滤) 表
INPUT
OUTPUT
FORWARD
nat(地址转换) 表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装) 表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw() 表
PREROUTING
OUTPUT
iptables
不是服务,但有服务脚本,服务脚本的主要作用在于管理保存规则
装载或移除iptables/netfilter相关的内核模块
能否使用自定义链?
可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用户可以删除自定义的空链;
默认链无法删除
每个规则都有两个内置的计数器
被匹配的报文个数
被匹配的报文大小之和
规则:匹配标准,处理动作
匹配标准:
通用匹配
-s, --src
-d, --dst
-p,{tcp|udp|icmp}
-i, INTERFACE 数据报文流入接口
可用于定义标准的链:PREROUTING, INPUT, FORWARD
-o, INTERFACE 数据报文流出接口
可用于定义标准的链:OUTPUT, POSTROUTING, FORWARD
扩展匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因为使用-p {tcp|udp|icmp}
-p tcp
--sport PORT 源端口
--dport PORT 目标端口
--tcp-flags mask comp 只检查指定的标志位,是逗号分隔的标志位
--tcp-flags SYN,FIN,ACK,RST SYN,ACK
mask 0 comp 1
-p icmp
--icmp-type
0: echo-reply
8: echo-request
-p udp
--sport
--dport
显式扩展:必须指明哪个模块进行的扩展,在iptables中使用-m选项完成此功能
-m EXTENSION --spe-opt
state: 状态扩展
结合ip_conntrack追踪会话的状态
NEW 新连接请求
ESTABLISHED 已经建立的连接
INVALID 非常连接
RELATED 相关联的
-m state --state NEW,ESTABLISHED -j ACCEPT
multiport 离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
-m multiport --destination-ports 21,22,80 -j ACCEPT
保存规则:
# service iptables save (将现配置的规则保存)
/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables.20161231(明确指定要保存的位置)
# iptables-restore < /etc/sysconfig/iptables.20161231 (读取保存的规则)
添加规则
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
-j TARGET
ACCEPT
DROP
REJECT
iptables/netfilter:
iptables
filter, nat, mangle, raw
filter
INTPU, FORWARD, OUTPUT
nat
PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw
PREROUTING, OUTPUT
CHAN
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
netfilter: Framework, tcp/ip, 内核中
命令COMMAND
管理规则
-A 附加一条 规则,添加在链的尾部append
-I CHAIN [num] 插入一条规则,插入为对应CHAIN上的第num条insert ;
-D CHAIN [num] 删除指定链中的第num条规则delete
-R CHAIN [num] 替换指定的规则replace
管理链
-F [CHAIN] 清空指定规则链flush
-p CHAIN 设定指定链的默认策略
-N 自定义一个新的空链
-X 删除一个自定义的空链
-Z 置零指定链中所有规则的计数器
-E 重命名自定义链
查看类
-L 显示指定表中的规则
-n 以数字格式显示主机地址和端口号
-v 显示链及规则的详细信息
-x 显示精确值
--line-numbers 显示规则号码
动作(target)
ACCEPT
DROP
REJECT
DNAT
SNAT
REDIRECT
MASQUERADE 伪装
LOG
MARK
放行示例:
ssh 放行
# iptables -t filter -A OUTPUT -s 192.168.11.122 -d 192.168.11.0/24 -p tcp --sport 22 -j ACCEPT
# iptables -t filter -A INPUT -s 192.168.11.0/24 -d 192.168.11.122 -p tcp --dport 22 -j ACCEPT
修改默认链的默认策略
# iptables -t filter -P FORWARD DROP
# iptables -t filter -P OUTPUT DROP
# iptables -t filter -P INPUT DROP
放行 http 80
# iptables -t filter -I OUTPUT -s 192.168.11.122 -p tcp --sport 80 -j ACCEPT
# iptables -t filter -I INPUT -d 192.168.11.122 -p tcp --dport 80 -j ACCEPT
放行本地lo
# iptables -t filter -A OUTPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -o lo -j ACCEPT
# iptables -t filter -A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
可以自己ping其它主机,而不允许其它主机ping自己
# iptables -t filter -A OUTPUT -s 192.168.11.122 -p icmp --icmp-type 8 -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.11.122 -p icmp --icmp-type 0 -j ACCEPT
想想DNS如果要放行的话应该建立几条?
8条
4条tcp
2条input
1条为本地客户端向本地DNS服务器请求地址解析(递归)
1条为远程DNS服务器向本地的DNS服务器发送解析结果
2条output
1条为本地服务器向远端DNS服务器请求地址解析(迭代)
1条为本地DNS服务器向本地客户端发送解析结果
4条udp
同上,只是此为udp 端口
优化iptables 规则条目
放行所有服务器已经建立会话出去的包
iptables -t filter -I OUTPUT -s 192.168.11.122 -m state --state ESTABLISHED -j ACCEPT
ftp 放行需要单加模块在iptables配置文件
/etc/sysconfig/iptables-config
ip_nat_ftp
然后需要在进入和出口方向加入 RELATED
INPUT
第一条放行所有已经建立的和相关联的规则
iptables -t filter -I INPUT -d 192.168.11.122 -m state --state ESTABLISHED,RELATED -j ACCEPT
多端口一条匹配NEW
iptables -t filter -I INPUT 2 -d 192.168.11.122 -p tcp -m multiport --destination-ports 22,80,21 -m state --state NEW -j ACCEPT