Iptables原理详解及示例说明

在Linux7系统中firewalld服务取代了iptables服务,不过也可以用iptables服务替代firewalld服务。

**

iptables

**

systemctl stop firewalld #停止firewall
systemctl disable firewalld #禁止firewall开机启动
yum install iptables-services #安装iptables服务
systemctl start iptables #启动iptables服务
systemctl enable iptables #设置开机自启动

/sbin/iptables-save OR service iptables save
##默认会将iptables规则写入/etc/sysconfig/iptables文件,也可自定义保存文件
/sbin/iptables-save | cat >/opt/iptables
##当服务器启动后保存到指定文件是不会被读取的,如果我们想让文件生效需要重定向一下iptables-restore < /opt/iptables(不建议替换默认文件地址)

自动保存规则
修改/etc/sysconfig/iptables-config文件
IPTABLES_SAVE_ON_STOP=no “no” 改成 “yes”
这样每次停服务之前会自动将现有规则保存到/etc/sysconfig/iptables。

查询规则
iptables -L 默认 filter表
iptables -L -t filter
iptables -L -t nat
iptables -L -t mangle
iptables -t filter -L -n --line-numbers #显示所有规则条目的编号

匹配条件
因为iptables是网络层的防火墙、他只能匹配协议、IP、TCP、UDP、ICMP、匹配条件肯定是根据底层的IP报文来检查、或都根据TCP、UDP、ICMP来检查
这几种叫通用匹配
-s IP:匹配源IP的、可以是IP也可以是网络地址、可以取反、用!号取么
-d IP:匹配目标地址的、
-p Proctol:匹配协议的[TCP|UDP|ICMP]、三者之一
-i:数据报文流入的接口、数据包从哪个网卡进来呀、通常只用于INPUT、FORWARD、PRERUTING
-o:数据报文流出的接口、OUTPUT、FORWARD、POSTROUTING

编写规则
iptables [-t table] -N chain:定义一条自定义的新链
iptables [-t table] -X [chain]:删除一条自定义空的规则链
iptables [-t table] -E old-chain-name new-chain-name:为自定义链改名的
iptables [-t table] -P chain target:为链指定默认策略
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]:清空链中的规则、如果不指定链那表中所有的链都清空了
-F:清空链中的规则、规则有编号、在链中自上而下、从1开始
-L:list,列出表中的所有规则
-n:数字格式显示IP和Port、如果不用-n、ip就会反解为主机名、端口反解成服务名、会很慢
-v:以详细格式显示
-vv:更详细
-vvv:更更详细
-x:exactly,精确值、不执行单位换算
–line-numbers:显示各规则的行号
-Z:zero,清零、把规则的计数器清零

iptables [-t table] {-A|-D} chain rule-specification
-A:append,附加一条规则、在规则的后面添加
rule-specification:通常使用匹配条件 -j 处理机制

iptables [-t table] -I chain [rulenum] rule-specification:在指定位置插入规则
iptables [-t table] -R chain rulenum rule-specification:修改指定规则为新定义的
iptables [-t table] -S [chain [rulenum]]:显示指定链上的规则

删除规则
清空表中所有链的规则、和查看iptables中的规则:
iptables -F
iptables -L -n -v
清空表中某条链的规则:
iptables -F -t filter
删除INPUT链上的第三条规则
iptables -D INPUT 3

编写示例
1、只允许通过eth0网卡进入本机
#iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -j ACCEPT
2、只允许通过eth0网卡出去
#iptables -t filter -A OUTPUT -o eth0 -s 172.16.251.171 -j ACCEPT
3、限定协议的、通过eth0接口进来、并且协议是TCP的都允许:
#iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -p tcp -j ACCEPT
4、清空规则后、通过eth0进来的、并且协议是ICMP的都拒绝
#iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -p icmp -j REJECT
5、限制每IP最多的请求个数、大于3个就drop
#iptables -I INPUT -d 172.16.251.171 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP
6、放行ping其他主机(8是ping的请求、0是ping的响应):
#iptables -A OUTPUT -s 172.16.251.171 -p icmp --icmp-type 8 -j ACCEPT
#iptables -A INPUT -d 172.16.251.171 -p icmp --icmp-ytpe 0 -j ACCEPT
7、对目标主机172.16.251.171的端口只在周1、2、3、4、5的8点到18点时间放行:
#iptables -A INPUT -d 172.16.251.171 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 timestop 18:00:00 -j ACCEPT
#iptables -A OUTPUT -s 172.16.251.171 -p tcp --sport 901 -j ACCEPT
8、在OUTPUT上只要是established的都放行
#iptables -A OUTPUT -s 172.16.251.244 -m state --state ESTABLISHED -j ACCEPT
9、在INPUT上开放22和80端口的访问规则:
#iptables -I INPUT -d 172.16.251.171 -p tcp -m multiport --dports 22,80 -j ACCEPT
#iptables -I OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p tcp -m multiport --sports 22,80 -j ACCEPT
10、开放本机23号端口给某个网段的主机访问:
#iptables -A INPUT -d 172.16.251.171 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.17.100.100 -j ACCEPT
#iptables -A INPUT -s 172.16.251.171 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.17.100.100 -j ACCEPT
11、放行来自于172.16.0.0/16网络的主机对本机ssh服务|http80端口的请求:
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p tcp --dport 22(80) -j ACCEPT
#iptables -t filter -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p tcp --sport 22(80) -j ACCEPT
12、放行本机的DNS服务、当本机不可以解析时要出去查询、如果本机服务可以解析就是上面那条、如果本机解析不了就会出去找、就用后面两条:
#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p udp --dport 53 -j ACCEPT
#iptables -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p udp --dport 53 -j ACCEPT
#iptables -A OUTPUT -s 172.16.251.171 -p udp --dport 53 -j ACCEPT
#iptables -A INPUT -d 172.16.251.171 -p udp --sport 53 -j ACCEPT
13、tcp的标志位全为1的错误报文:
#iptables -N mychain
#iptables -A mychain -p --tcp-flags ALL ALL -j DROP 这个表示所有标志位全为1
#iptables -A mychain -p --tcp-flags ALL NONE -j DROP 标志位全为0
14、所有来自172.16.0.0/16这个网段的地址经过172.16.100.7这个主机都允许、-A追加一条规则、在INPUT这条链上添加:
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j ACCEPT
15、所有本机地址出去的、访问172.16.0.0/16的其实任意主机都允许:
#iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -j ACCEPT
16、放行本机的tfpt服务
#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p udp --dport 69 -j ACCEPT
#iptables -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT
17、插入为第一行:
#iptables -I INPUT -i lo -j ACCEPT 默认插入为第一行
#iptables -I INPUT 2 -i lo -j ACCEPT 插入为第二行
18、修改第一条规则:
#iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -d 172.16.251.171 -p tcp --dport 22 -i eth0 -j ACCEPT

参考文献地址:https://blog.51cto.com/tanxw/1389114

**

firewalld

**

具体操作

1、打开一个端口
(–permanent永久生效,没有此参数重启后失效)
#firewall-cmd --zone=public --add-port=22/tcp --permanent
注意:端口的优先级高于白名单,不管在不在白名单当中任何网段22端口都能通
2、关闭一个端口
#firewall-cmd --zone= public --remove-port=22/tcp --permanent
3、添加白名单
#firewall-cmd --add-rich-rule=‘rule family=“ipv4” source address=“10.1.1.1/32” accept’ --permanent
##推荐使用
#firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“10.1.1.1/32” port protocol=“tcp” port=“22” accept”
4、删除白名单
#firewall-cmd --permanent --remove-rich-rule=“rule family=“ipv4” source address=“10.1.1.1/32” port protocol=“tcp” port=“22” accept”
5、重新载入配置
#firewall-cmd --reload
6、查看当前配置
firewall-cmd --list-all

你可能感兴趣的:(linux系统安全,linux,iptables)