iptables常用指令
Comands:
-A --append 附加规则,将新的规则附加到链的尾部
-D --detelte 从链中删除匹配的规则
-I --insert 根据数字插入链中,默认1插入第一位
-R --replace 替换链中规则,默认1第一个
-L --list List the rules in a chain or all chains
-S --list-rules Print the rules in a chain or all chains
-F --flush 删除链中规则,或者全部链
-Z --zero 链或所有链计数器清零
-N --new 新建一条用户自定义链
-X --delete-chain 删除用户定义的链
-P --policy 设置默认策略
-E --rename-chain 改变链名称
Options:
-d --destination 目的地址或网关
-s --source 来源地址或网关
-i --in-interface 输入网卡设备
-o --out-interface 输出网卡设备
-j --jump 跳转到目标规则:-j ACCEPT
-g --goto 跳转到目标链,没有返回
-m --match 匹配、扩展
-n --numeric 以数字输出地址和端口
-p --protocol 协议类型:tcp、udp
-t --table table to mainpulate(default:filter
)
其它:
--dport 目的端口
--sport 源端口
1:查看当前规则
iptables -L -n
2:查看当前规则
iptables -t nat -S
iptables -L -t filter
3:设置默认策略
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
4:删除全部规则
iptables -F
5:阻止指定IP地址
iptables -A INPUT -s 1.1.1.1 -j DROP
iptables -A INPUT -i eth0 -s 1.1.1.1 -j DROP
iptables -A INPUT -i eth0 -p tcp -s 1.1.1.1 -j DROP
6:允许所有SSH连接请求
iptables -A INPUT -i eth0 -p tcp -s 1.1.1.1/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
7: 允许http和https的连接请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
8:使用multiport将多个规则结合在一起
允许所有ssh http https的流量访问
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptable -A OUTPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
9:允许从本地发起ssh请求
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
// 限定向特定网段发起ssh请求
iptables -A OUTPUT -o eth0 -p tcp -d 1.1.1.1/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10. 负载平衡传入的网络流量
使用iptables nth将https流量负载平衡到三个不同的IP地址
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
11. 允许外部主机ping内部主机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
12. 允许内部主机ping外部主机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
13. 允许回环访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
14. 允许内部网络与外部网络之间通信
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT
15. 允许出站的DNS连接
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
16. 防止DOS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
17. 端口转发
首先,允许422的端口访问
其次,将422端口的流量用DNAT转发到22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.101 --dport 422 -j DNAT --to 192.168.1.101 --dport 22
18. 记录丢弃的数据表
首先,新建LOGGING的链
iptables -N LOGGING
其次,将所有INPUT链的请求跳转到LOGGING链
iptables -A INPUT -j LOGGING
再次,为这些包自定义前缀,命名为"IPTables Packet Dropped"
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped" --log-level 7
最后,丢弃这些数据包
iptables -A LOGGING -j DROP
四表
- filter表,负责过滤功能,防火墙,内核模块:iptable_filter
- nat表,网络地址转换功能,内核模块:iptable_nat
- mangle表,拆解报文,做出修改,并重新封装,内核模块:iptable_mangle
- raw表,关闭nat表上启用的连接追踪机制,iptable_raw
五链
- prerouting 对数据包作路由选择前应用此链中的规则
- input 进来的数据包应用此规则链中的规则
- forward 转发数据包时应用此规则链中的规则
- postrouting 对数据包作路由选择后应用此链中的规则
- output 外出的数据包应用此规则链中的规则
报文流向:
- 到本机某进程的报文:prerouting -> input
- 由本机转发的报文:prerouting -> forward -> postrouting
- 本机某进程发出的报文:output -> postrouting
四表五链对应关系:
- 规则和表对应关系
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。 - 表和规则对应关系
表(功能)<–> 链(钩子):
raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
处理动作
- ACCEPT 允许数据包通过
- DROP 直接丢弃数据包
- REJECT 拒绝数据包通过
- SNAT 源地址转换
- MASQUERADE 是SNAT的一种特俗形式,适用于动态的,临时会变的IP上
- DNAT 目的地址转换
- REDIRECT 在本机做端口映射
- LOG 在/var/log/message文件中记录日志信息,然后将数据包传给下一条规则,也就是除了记录以外,不对数据包做任何其它操作,仍然让下一条规则去匹配
非常用指令
// 查看
iptables -t 表名 -L 链名
iptables -L INPUT (默认是-t filter)
iptables -L -t filter INPUT
// -n 已数字显示端口和IP -v详细的信息
iptables -nvL INPUT
// 自定义链表
iptables -t filter -N LXH_IN_WEB
iptables -L LXH_IN_WEB
iptables -A LXH_IN_WEB -s 192.168.1.1 -j ACCEPT
iptables -A LXH_IN_WEB -s 192.168.1.1 -j DROP
iptables -A LXH_IN_WEB -s 192.168.1.3 -p tcp --sport 80 -j ACCEPT
// --line显示序号
iptables --line -nvL LXH_IN_WEB
// 从LXH_IN_WEB表中删除序号为3的规则
iptables -D LXH_IN_WEB 3
// 从LX_IN_WEB表中修改序号为2的规则
iptables -R LXH_IN_WEB 2 -j ACCEPT
// 表重命名
iptables -E LXH_IN_WEB IN_WEB
// 删除
iptables -X IN_WEB
规则匹配
-s 源IP
-p 目的IP
--sport 源端口
--dport 目的端口
-p 协议,tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
-i 入口网卡
-o 出口网卡
//多个源IP
-s ip1,ip2
// 多端口
-m multiport --sport 21,22,53,80
//取反
! -s ip1,ip2
// 如果不是192.168.1.1的,就接收,是否拒绝,还要看有没有其他规则匹配,比如默认规则,如果默认规则是接收,依旧会接收,否则拒绝。
iptables -t filter -A INPUT ! -s 192.168.1.1 -j ACCEPT
常用扩展
// tcp扩展
-m tcp --sport 22
-m tcp --dport 22
// multiport扩展
-m multiport --sport 21,22
-m multiport --dport 21,22
// iprange扩展
-m iprange --src-range 192.168.1.127-192.168.1.146
-m iprange --dst-range 192.168.1.127-192.168.1.146
// string扩展 可以指定要匹配的字符串
//–algo bm表示使用bm算法去匹配指定的字符串
-m string --algo bm --string "Hello World"
// time扩展 根据时间段区匹配报文
-m time --timestart 09:00:00 --timestop 18:00:00
-m time --weekdays 6,7 // 周六、周日
-m time --monthdays 22,23 //每月22,23号
–monthdays与–weekdays可以使用”!”取反,其他选项不能取反
// connlimit扩展 限制每个IP地址同时链接到server端的链接数量
-m connlimit --connlimit-above 2 -j REJECT //每个IP的链接数量上限为2,超过就要拒绝
-m connlimit ! --connlimit-above 2 -j ACCEPT //每个IP的链接数量不超过2个,接受,超过不代表拒绝,要匹配其它规则
-m connlimit --connlimit-above 2 --connlimit-mask 24 //限制某类网段 24网段255个IP,27网段30个IP
// limit扩展 对”报文到达速率”进行限制的
-p icmp -m limit --limit 10/minute //每分钟10个包 ,还有second,hour,day
–limit-burst // 空闲时可放行的包的数量
// --tcp-flags 指的就是tcp头中的标志位
-m tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN
// 匹配第一次握手
--tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN
--tcp-flags ALL SYN 同上
--syn 等价于 同上
// 匹配第二次握手
--tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK
--tcp-flags ALL SYN,ACK 同上
// udp扩展
-p udp --sport 21,22 // 21,22
-p udp --dport 21:25 // 21 - 25
// icmp扩展 ping命令使用icmp协议,类型为8
-p icmp -m icmp --icmp-type 8/0 -j REJECT//禁止别人ping本机, 8/0格式为:type/code,表示类型为8,code为0的报文
-p icmp -m icmp -icmp-type 'echo-request' // 使用类型描述名称匹配
// state扩展 可以让iptables实现”连接追踪”机制,五种状态:
NEW 第一个包
ESTABLISHED 连接已建立
RELATED 关系,ftp协议有命令连接和数据连接,数据连接可以是RELATED状态,表示有关系
INVALID 一个包没有办法被识别
UNTRACKED 表示报文未被追踪
黑白名单
- 当默认策略是ACCEPT是,链中的规则对应DROP和REJECT,表示只有符合规则的才会被丢弃、拒绝,没有匹配的规则默认接受,这就是黑名单
- 当默认策略是DROP、REJECT,链中的规则对应为ACCEPT,表示只有符合规则的才会接受,没有匹配的规则默认拒绝,这就是白名单
iptables动作
- 基础动作 ACCEPT、DROP
- 扩展动作 REJECT
- LOG动作
// 将22端口的tcp报文信息记录到日志,日志存储位置/var/log/messages
iptables -I INPUT -p tcp --dport 22 -j LOG
//vim /etc/rsyslog.conf
kern.warning /var/log/iptables.log
//加入上述配置后,报文的相关信息将会被记录到/var/log/iptables.log文件中。
//完成上述配置后,重启rsyslog服务(或者syslogd)
service rsyslog restart
//服务重启后,配置即可生效,匹配到的报文的相关信息将被记录到指定的文件中。
LOG选项:
–log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。
–log-prefix选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。
- SNAT 内部网络的报文发送出去时,报文的源IP会被修改
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP
- DNAT 外部网络的报文响应时,响应报文的目标IP会再次被修改
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP
- MASQUERADE 动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
- REDIRECT 在本机上进行端口映射
//将本机80端口映射到本机8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
centos7中配置iptables-service
#配置好yum源以后安装iptables-service
yum install -y iptables-services
#停止firewalld
systemctl stop firewalld
#禁止firewalld自动启动
systemctl disable firewalld
#启动iptables
systemctl start iptables
#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
systemctl enable iptables
ICMP报文type和code对照表
ICMP报文ICMP报文
网友评论