1. 程式人生 > >CentOS7.3下的一個iptables配置

CentOS7.3下的一個iptables配置

iptables

centos7.3默認使用的防火墻應該是firewall,而不是iptables。而我們如果想要再服務器上使用iptables防火墻,在配置防火墻之前,我們需要先關閉firewall,安裝iptables。


當前環境:

[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[[email protected] ~]# uname -r
3.10.0-514.el7.x86_64
[[email protected] ~]#


查看firewall狀態:

[[email protected] ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[[email protected] ~]#


如果要關閉firewall防火墻,則執行

[[email protected] ~]#systemctl stop firewalld

如果要設置開機不啟動,則執行

[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]#


接下來安裝iptables服務

[[email protected] ~]# yum -y install iptables-services


查看iptables狀態,執行

[[email protected] ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[[email protected]
/* */ ~]#


設置開機啟動

[[email protected] ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[[email protected] ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
[[email protected] ~]#


啟動iptables服務

[[email protected] ~]# systemctl start iptables.service
[[email protected] ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Tue 2017-08-15 22:27:23 EDT; 1s ago
  Process: 2243 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
 Main PID: 2243 (code=exited, status=0/SUCCESS)
Aug 15 22:27:23 localhost.localdomain systemd[1]: Starting IPv4 firewall with iptables...
Aug 15 22:27:23 localhost.localdomain iptables.init[2243]: iptables: Applying firewall rules: [  OK  ]
Aug 15 22:27:23 localhost.localdomain systemd[1]: Started IPv4 firewall with iptables.
[[email protected] ~]#


查看iptables默認訪問規則

[[email protected] ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   45  3348 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    9   702 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 36 packets, 4064 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[[email protected] ~]#


查看iptables配置文件的默認規則設置:

[[email protected] ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-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 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[[email protected] ~]#


常用iptables配置範例:

[[email protected] ~]# iptables -L -nv
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ping       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 state NEW
   39  3016 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       192.168.112.0        0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       10.0.10.0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:444
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:843
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8001
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8002
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8003
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10050
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10051
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy ACCEPT 31 packets, 2884 bytes)
 pkts bytes target     prot opt in     out     source               destination         
Chain ping (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 1/sec burst 5
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
[[email protected] ~]#


此時如果想保存當前配置到某個文件(這裏用access.txt),可以使用iptables-save命令:

[[email protected] ~]# iptables-save >access.txt
[[email protected] ~]# cat access.txt 
# Generated by iptables-save v1.4.21 on Tue Aug 15 22:41:42 2017
*nat
:PREROUTING ACCEPT [9:702]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [5:380]
:POSTROUTING ACCEPT [5:380]
COMMIT
# Completed on Tue Aug 15 22:41:42 2017
# Generated by iptables-save v1.4.21 on Tue Aug 15 22:41:42 2017
*raw
:PREROUTING ACCEPT [96:7170]
:OUTPUT ACCEPT [66:8472]
:OUTPUT_direct - [0:0]
:PREROUTING_direct - [0:0]
-A PREROUTING -j PREROUTING_direct
-A OUTPUT -j OUTPUT_direct
COMMIT
# Completed on Tue Aug 15 22:41:42 2017
# Generated by iptables-save v1.4.21 on Tue Aug 15 22:41:42 2017
*security
:INPUT ACCEPT [87:6468]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:8472]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
-A INPUT -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
COMMIT
# Completed on Tue Aug 15 22:41:42 2017
# Generated by iptables-save v1.4.21 on Tue Aug 15 22:41:42 2017
*mangle
:PREROUTING ACCEPT [96:7170]
:INPUT ACCEPT [96:7170]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:8472]
:POSTROUTING ACCEPT [66:8472]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
:POSTROUTING_direct - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A INPUT -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
COMMIT
# Completed on Tue Aug 15 22:41:42 2017
# Generated by iptables-save v1.4.21 on Tue Aug 15 22:41:42 2017
*filter
:INPUT DROP [9:702]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:8472]
:ping - [0:0]
-A INPUT -p icmp -m icmp --icmp-type 8 -m state --state NEW -j ping
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.112.0/32 -j ACCEPT
-A INPUT -s 10.0.10.0/32 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 444 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 843 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8001 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8002 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8003 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10051 -j ACCEPT
-A ping -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A ping -p icmp -j ACCEPT
COMMIT
# Completed on Tue Aug 15 22:41:42 2017
[[email protected] ~]#


如果不小心把配置全部清理了,這是可以用iptables-restore 命令重新將配置導入:

[[email protected] ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 
Chain FORWARD (policy ACCEPT 0 packets, 0 by
 pkts bytes target     prot opt in     out     source               destination 
Chain OUTPUT (policy ACCEPT 0 packets, 0 by
 pkts bytes target     prot opt in     out     source               destination 
[[email protected] ~]# iptables-restore access.
[[email protected] ~]# iptables -L
Chain INPUT (policy DROP 0 packets, 0 by
 pkts bytes target     prot opt in     out     source               destination 
    0     0 ping       icmp --  *      *       0.0.0.0/0            0.0.0.0/0    icmptype 8 state NEW
    5   356 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0    ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0    state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0   
    0     0 ACCEPT     all  --  *      *       192.168.112.0        0.0.0.0/0   
    0     0 ACCEPT     all  --  *      *       10.0.10.0            0.0.0.0/0   
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:444
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:443
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:843
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:8001
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:8002
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:8003
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:8080
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:10050
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0    tcp dpt:10051
Chain FORWARD (policy ACCEPT 0 packets, 0 by
 pkts bytes target     prot opt in     out     source               destination 
Chain OUTPUT (policy ACCEPT 4 packets, 416 by
 pkts bytes target     prot opt in     out     source               destination 
Chain ping (1 referen
 pkts bytes target     prot opt in     out     source               destination 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0    icmptype 8 limit: avg 1/sec burst 5
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0   
[[email protected]


部分規則解釋說明:

摘自:http://www.cnblogs.com/alwu007/p/6693822.html

[[email protected] ~]# systemctl enable iptables.service

編輯並修改配置文件/etc/sysconfig/iptables,使用下面的配置

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:TEST - [0:0]
-A INPUT -j TEST
-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 -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --rcheck --seconds 1 --hitcount 15 -j DROP
-A INPUT -p tcp -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --set
-A INPUT -i eth1 -p tcp -m tcp -d 192.168.1.100 --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 --connlimit-saddr -j DROP
#-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG SYN -m length --length 0:128 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
... ...
-A INPUT -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j TEST
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -j TEST
-A TEST -j RETURN
COMMIT


1.檢查替換eth1;2.檢查替換-d ip;3.若是centos6.8,檢查iptables版本是v1.4.7還是v1.4.21,前者不支持–connlimit-saddr選項,去掉即可。下面,我簡單解釋一下這個配置


# filter表
*filter
# INPUT鏈默認策略為ACCEPT
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 自定義TEST鏈
:TEST - [0:0]
# 進入TEST鏈(從後面配置看,TEST鏈只是RETURN了回來,沒有其他規則)
-A INPUT -j TEST
# 接受連接狀態是RELATED和ESTABLISHED的包
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 接受ICMP協議的包
-A INPUT -p icmp -j ACCEPT
# 接受回環接口的包
-A INPUT -i lo -j ACCEPT
# 同一源IP1秒內最多可發起14次目的地址是192.168.1.100的TCP連接請求,15次及以上的包將被接口eth1丟棄
# 為什麽同時指定-i和-d?猜測:路由器裏的路由表可能人為或未及時更新導致路由表映射錯誤,導致發到接口eth1的包的目的IP錯誤。為了防止此類包,則需同時指定-i和-d
-A INPUT -p tcp -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --rcheck --seconds 1 --hitcount 15 -j DROP
-A INPUT -p tcp -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --set
# 同一源IP只允許50個目的地址是192.168.1.100的TCP連接請求,超出的包將被接口eth1丟棄
-A INPUT -i eth1 -p tcp -m tcp -d 192.168.1.100 --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 --connlimit-saddr -j DROP
# 此條規則有問題(猜測,可能是--length 129 -j DROP)
#-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG SYN -m length --length 0:128 -j ACCEPT
# 下面這些規則對TCP連接請求包開放部分端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
... ...
# 丟棄所有包
-A INPUT -j DROP
# 上一條規則已經丟棄了所有包,此條規則貌似到不了
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j TEST
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -j TEST
-A TEST -j RETURN
COMMIT


重啟iptables

[[email protected] ~]# systemctl restart iptables.service


查看防火墻規則是否已應用

[[email protected] ~]# iptables -L -nv

本文出自 “平平淡淡才是真” 博客,請務必保留此出處http://ucode.blog.51cto.com/10837891/1956698

CentOS7.3下的一個iptables配置