Iptables基於內核netfilter安全框架運行,主要有過濾數據包和NAT地址轉換功能。vim
filter
|
INPUT
|
FORWARD
|
OUTPUT
|
|
|
nat
|
|
|
OUTPUT
|
PREROUTING
|
POSTROUTING
|
mangle
|
INPUT
|
FORWARD
|
OUTPUT
|
PREROUTING
|
POSTROUTING
|
raw
|
|
|
OUTPUT
|
PREROUTING
|
|
Iptables主要經過規則鏈的方式進行數據包的過濾和轉發以及NAT功能,表是具備相同功能的規則鏈的集合,方便咱們進行管理。centos
條件
|
參數
|
範例
|
源IP地址
|
-s
|
-s 172.16.1.1,172.16.1.2 -s 172.16.1.0/24 ! -s 172.16.1.0/24
|
目的IP地址
|
-d
|
-d 172.16.1.1,172.16.1.2 -d 172.16.1.0/24 ! -d 172.16.1.0/24
|
源端口
|
-p tcp -m tcp --sport
-p tcp -m multiport --sports
|
-p tcp -m tcp --sport 22 -p tcp -m tcp --sport 22:25
-p tcp -m tcp --sport :22 -p tcp -m tcp --sport 80:
-p tcp -m tcp ! --sport 22 -p tcp -m multiport --sports 22,25
|
目的端口
|
-p tcp -m tcp --dport
-p tcp -m multiport --dports
|
-p tcp -m tcp --dport 22 -p tcp -m tcp --dport 22:25
-p tcp -m tcp --dport :22 -p tcp -m tcp --dport 80:
-p tcp -m tcp ! --dport 22 -p tcp -m multiport --dports 22,25
|
協議
|
-p
|
-p tcp ! -p tcp (tcp udp icmp)
|
網卡
|
-i 流入網卡 / -o流出網卡
|
-i eth0 ! -i eth0 / -o eth0 ! -o eth0
|
擴展模塊
|
參數
|
範例
|
tcp
|
-p tcp -m tcp --dport
-p tcp -m tcp --sport
-p tcp -m tcp --dport --tcp-flags
-p tcp -m tcp --dport --syn
|
-p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
-p tcp -m tcp --dport 22 --syn -j REJECT
|
udp
|
-p udp -m udp --dport
-p udp -m udp --sport
|
略
|
multiport
|
-p tcp -m multiport --dports
-p tcp -m multiport --sports
|
略
|
icmp
|
-p icmp -m icmp --icmp-type 8/0
-p icmp -m icmp --icmp-type 8
-p icmp -m icmp --icmp-type "echo-request"
|
-p icmp -m icmp --icmp-type 8/0 -j REJECT 禁止別人ping本身
-p icmp -m icmp --icmp-type 8 -j REJECT
-p icmp -m icmp --icmp-type "echo-request" -j REJECT
|
state
|
-m state --state
|
-m state --state RELATED,ESTABLISHED -j ACCEPT
|
動做
|
參數
|
範例 |
ACCEPT
|
-j ACCEPT
|
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
|
DROP
|
-j DROP
|
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
|
REJECT
|
-j REJECT <--reject-with>
|
iptables -t filter -I INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable (提示爲何被拒絕)
|
LOG
|
-j LOG <--log-level> <--log-prefix>
|
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
|
SNAT
|
-j SNAT --to-source
|
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
|
DNAT
|
-j DNAT --to-destination
|
iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.0.0.6:3389
|
MASQUERADE
|
-o eth0 -j MASQUERADE
|
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE (動態SNAT)
|
REDIRECT
|
-j REDIRECT --to-ports
|
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
|
在配置NAT網關、路由器或網絡防火牆的時候,須要開啓內核轉發功能。安全
#使用以下兩種方法都可臨時開啓核心轉發,當即生效,可是重啓網絡配置後會失效。 方法一:echo 1 > /proc/sys/net/ipv4/ip_forward 方法二:sysctl -w net.ipv4.ip_forward=1 #使用以下方法開啓核心轉發功能,重啓網絡服務後永久生效。 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中將 net.ipv4.ip_forward設置爲1
查看規則
|
iptables -nvL
iptables -t filter -nvL
iptables -t filter -nvL INPUT
iptables --line-number -nvL INPUT
|
清空規則
|
iptables -F 清空filter表的規則
iptables -F INPUT
|
增長規則
|
iptables -t filter -I INPUT -s 192.168.1.1 -j DROP // DROP表丟棄不響應 REJECT表拒絕並響應
iptables -t filter -I INPUT 2 -s 192.168.1.1 -j DROP
iptables -t filter -A INPUT -s 192.168.1.1 -j DROP
|
刪除規則
|
iptables -t filter -D INPUT 3 刪除INPUT鏈中第3條規則
iptables -t filter -D INPUT -s 192.168.1.1 -j ACCEPT
|
修改規則
|
iptables -t filter -R INPUT 1 -s 192.168.1.1 -j REJECT
只能改動做,參數條件一個不能少,推薦先刪除後添加的方式
|
修改默認規則
|
iptables -t filter -P FORWARD DROP
|
保存規則
|
service iptables save
/etc/init.d/iptables save
cat /etc/sysconfig/iptables
|
白名單機制
|
iptables -P INPUT ACCEPT 默認設爲ACCEPT防止清空後管理員沒法登陸
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j REJECT 在規則鏈最後加上拒絕,實現白名單機制
|
建立自定義鏈
|
iptables -t filter -N IN_WEB
|
引用自定義鏈
|
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
|
重命名自定義鏈
|
iptables -E IN_WEB WEB
|
刪除自定義鏈
|
iptables -X WEB 知足兩個條件:自定義鏈沒有被引用 自定義鏈中沒有任何規則
|
計數器清零
|
iptables -Z
|
網絡防火牆=網關+Iptables過濾bash
#1.開啓防火牆轉發功能,實現網關 [root@B ~]# vim /etc/sysctl.conf # Controls IP packet forwarding net.ipv4.ip_forward = 1 [root@B ~]# sysctl -p // 應用參數 #2.分別添加路由記錄,設置網關 [root@A ~]# route add -net 172.16.1.0/24 gw 10.0.0.88 [root@C ~]# route add -net 10.0.0.0/24 gw 172.16.1.88 #3.配置防火牆Iptables過濾規則 [root@B ~]# iptables -nvL FORWARD Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@B ~]# iptables -A FORWARD -d 172.16.1.13 -j ACCEPT [root@B ~]# iptables -A FORWARD -s 172.16.1.13 -j ACCEPT #4.進行測試 [root@A ~]# ping 172.16.1.13 PING 172.16.1.13 (172.16.1.13) 56(84) bytes of data. 64 bytes from 172.16.1.13: icmp_seq=1 ttl=63 time=12.5 ms 64 bytes from 172.16.1.13: icmp_seq=2 ttl=63 time=1.03 ms [root@C ~]# ping 10.0.0.100 PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data. 64 bytes from 10.0.0.100: icmp_seq=1 ttl=63 time=0.391 ms 64 bytes from 10.0.0.100: icmp_seq=2 ttl=63 time=1.03 ms
#嚴格上,配置網關=開啓內核轉發功能,配置方法同上 #添加SNAT功能 [root@B ~]# iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 172.16.1.88 #測試 [root@A ~]# ping 172.16.1.13 PING 172.16.1.13 (172.16.1.13) 56(84) bytes of data. 64 bytes from 172.16.1.13: icmp_seq=1 ttl=63 time=0.796 ms 64 bytes from 172.16.1.13: icmp_seq=2 ttl=63 time=3.38 ms 64 bytes from 172.16.1.13: icmp_seq=3 ttl=63 time=1.34 ms [root@C ~]# tcpdump -i eth1 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 23:12:29.983216 IP 172.16.1.88 > 172.16.1.13: ICMP echo request, id 14715, seq 1, length 64 23:12:29.983239 IP 172.16.1.13 > 172.16.1.88: ICMP echo reply, id 14715, seq 1, length 64 23:12:30.998859 IP 172.16.1.88 > 172.16.1.13: ICMP echo request, id 14715, seq 2, length 64
#網關配置同網絡防火牆 #開啓DNAT功能 [root@B ~]# iptables -t nat -I PREROUTING -d 10.0.0.88 -j DNAT --to-destination 172.16.1.13 #測試 [root@A ~]# ping 10.0.0.88 PING 10.0.0.88 (10.0.0.88) 56(84) bytes of data. 64 bytes from 10.0.0.88: icmp_seq=1 ttl=63 time=21.8 ms 64 bytes from 10.0.0.88: icmp_seq=2 ttl=63 time=2.03 ms 64 bytes from 10.0.0.88: icmp_seq=3 ttl=63 time=1.53 ms [root@C ~]# tcpdump -i eth1 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 23:31:30.079065 IP 10.0.0.100 > 172.16.1.13: ICMP echo request, id 20091, seq 1, length 64 23:31:30.079104 IP 172.16.1.13 > 10.0.0.100: ICMP echo reply, id 20091, seq 1, length 64 23:31:31.083794 IP 10.0.0.100 > 172.16.1.13: ICMP echo request, id 20091, seq 2, length 64 23:31:31.083853 IP 172.16.1.13 > 10.0.0.100: ICMP echo reply, id 20091, seq 2, lengt