一、名字解釋
ACCEPT:允許數據包通過。
DROP:直接丟棄數據包,不給任何回應信息,這時候客戶端會感覺自己的請求泥牛入海了,過了超時時間才會有反應。
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。
SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。
DNAT:目標地址轉換。
REDIRECT:在本機做端口映射。
LOG:在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則,也就是說除了記錄以外不對數據包做任何其他操作,仍然讓下一條規則去匹配。
二、查詢
iptables -t 表名 -L 查看對應表的所有規則,-t選項指定要操作的表,省略”-t 表名”時,默認表示操作filter表,-L表示列出規則,即查看規則。
iptables -t 表名 -L 鏈名 查看指定表的指定鏈中的規則。
iptables -t 表名 -v -L 查看指定表的所有規則,並且顯示更詳細的信息(更多字段),一般簡寫為iptables -t 表名 -vL。
iptables -t 表名 -n -L 查看表的所有規則,並且在顯示規則時,不對規則中的IP或者端口進行名稱反解,-n選項表示不解析IP地址。
iptables --line-numbers -t 表名 -L 查看表的所有規則,並且顯示規則的序號
iptables -t 表名 -v -x -L 查看表中的所有規則,-x選項表示顯示計數器的精確值。為了方便可以一起使用iptables --line -t filter -nvxL
三、設置指定表的指定鏈的默認策略(默認動作)
將filter表中FORWARD鏈的默認策略設置為ACCEPT 命令語法:iptables -t 表名 -P 鏈名 動作 示例:iptables -t filter -P FORWARD ACCEPT
四、添加規則
在指定表的指定鏈的尾部添加一條規則,-A選項表示在對應鏈的末尾添加規則,省略-t選項時,表示默認操作filter表中的規則。
iptables -t 表名 -A 鏈名 匹配條件 -j 動作 示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
在指定表的指定鏈的首部添加一條規則,-I選型表示在對應鏈的開頭添加規則。
命令語法:iptables -t 表名 -I 鏈名 匹配條件 -j 動作
示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT
在指定表的指定鏈的指定位置添加一條規則
命令語法:iptables -t 表名 -I 鏈名 規則序號 匹配條件 -j 動作
示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT
五、刪除規則
按照規則序號刪除規則,刪除指定表的指定鏈的指定規則,-D選項表示刪除對應鏈中的規則。 命令語法:iptables -t 表名 -D 鏈名 規則序號 示例:iptables -t filter -D INPUT 3 按照具體的匹配條件與動作刪除規則,刪除指定表的指定鏈的指定規則。 命令語法:iptables -t 表名 -D 鏈名 匹配條件 -j 動作 示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP 刪除指定表的指定鏈中的所有規則,-F選項表示清空對應鏈中的規則,執行時需三思。 命令語法:iptables -t 表名 -F 鏈名 示例:iptables -t filter -F INPUT 刪除指定表中的所有規則,執行時需三思。 命令語法:iptables -t 表名 -F 示例:iptables -t filter -F
六、修改規則
修改指定表中指定鏈的指定規則,-R選項表示修改對應鏈中的規則,使用-R選項時要同時指定對應的鏈以及規則對應的序號,並且規則中原本的匹配條件不可省略。 命令語法:iptables -t 表名 -R 鏈名 規則序號 規則原本的匹配條件 -j 動作 示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT 上述示例表示修改filter表中INPUT鏈的第3條規則,將這條規則的動作修改為ACCEPT, -s 192.168.1.146為這條規則中原本的匹配條件,如果省略此匹配條件,修改后的規則中的源地址可能會變為0.0.0.0/0。 修改指定表的指定鏈的默認策略(默認動作),並非修改規則 命令語法:iptables -t 表名 -P 鏈名 動作 示例:iptables -t filter -P FORWARD ACCEPT
七、保存規則
service iptables save
iptables-save > /etc/sysconfig/iptables
八、載入規則
iptables-restore < /etc/sysconfig/iptables
九、匹配條件
- 基本匹配條件
-s用於匹配報文的源地址,可以同時指定多個源地址,每個IP之間用逗號隔開,也可以指定為一個網段。 #示例如下 iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT -d用於匹配報文的目標地址,可以同時指定多個目標地址,每個IP之間用逗號隔開,也可以指定為一個網段。 #示例如下 iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT -p用於匹配報文的協議類型,可以匹配的協議類型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中還支持icmpv6、mh)。 #示例如下 iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT -i用於匹配報文是從哪個網卡接口流入本機的,由於匹配條件只是用於匹配報文流入的網卡,所以在OUTPUT鏈與POSTROUTING鏈中不能使用此選項。 #示例如下 iptables -t filter -I INPUT -p icmp -i eth4 -j DROP iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP -o用於匹配報文將要從哪個網卡接口流出本機,於匹配條件只是用於匹配報文流出的網卡,所以在INPUT鏈與PREROUTING鏈中不能使用此選項。 #示例如下 iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP
- 擴展匹配條件
tcp擴展模塊 常用的擴展匹配條件如下: -p tcp -m tcp –sport 用於匹配tcp協議報文的源端口,可以使用冒號指定一個連續的端口范圍 -p tcp -m tcp –dport 用於匹配tcp協議報文的目標端口,可以使用冒號指定一個連續的端口范圍 #示例如下 iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT multiport擴展模塊 常用的擴展匹配條件如下: -p tcp -m multiport –sports 用於匹配報文的源端口,可以指定離散的多個端口號,端口之間用”逗號”隔開 -p udp -m multiport –dports 用於匹配報文的目標端口,可以指定離散的多個端口號,端口之間用”逗號”隔開 #示例如下 iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT
–tcp-flags
用於匹配報文的tcp頭的標志位
#示例
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT
–syn
用於匹配tcp新建連接的請求報文,相當於使用”–tcp-flags SYN,RST,ACK,FIN SYN”
#示例
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
十、常用擴展模板
- iprange擴展模塊
包含的擴展匹配條件如下 –src-range:指定連續的源地址范圍 –dst-range:指定連續的目標地址范圍 #示例 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DR
- string擴展模塊
常用擴展匹配條件如下 –algo:指定對應的匹配算法,可用算法為bm、kmp,此選項為必需選項。 –string:指定需要匹配的字符串 #示例 iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
- time擴展模塊
常用擴展匹配條件如下 –timestart:用於指定時間范圍的開始時間,不可取反 –timestop:用於指定時間范圍的結束時間,不可取反 –weekdays:用於指定”星期幾”,可取反 –monthdays:用於指定”幾號”,可取反 –datestart:用於指定日期范圍的開始日期,不可取反 –datestop:用於指定日期范圍的結束時間,不可取反 #示例 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
- connlimit擴展模塊
常用的擴展匹配條件如下 –connlimit-above:單獨使用此選項時,表示限制每個IP的鏈接數量。 –connlimit-mask:此選項不能單獨使用,在使用–connlimit-above選項時,配合此選項,則可以針對”某類IP段內的一定數量的IP”進行連接數量的限制。 #示例 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
- limit擴展模塊
常用的擴展匹配條件如下 –limit-burst:類比”令牌桶”算法,此選項用於指定令牌桶中令牌的最大數量, –limit:類比”令牌桶”算法,此選項用於指定令牌桶中生成新令牌的頻率,可用時間單位有second、minute 、hour、day。 #示例 #注意,如下兩條規則需配合使用 iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT iptables -t filter -A INPUT -p icmp -j REJECT
- udp和icmo擴展模塊
udp擴展 常用的擴展匹配條件 –sport:匹配udp報文的源地址 –dport:匹配udp報文的目標地址 #示例 iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT #可以結合multiport模塊指定多個離散的端口 icmp擴展 常用的擴展匹配條件 –icmp-type:匹配icmp報文的具體類型 #示例 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
- state擴展模塊
--state NEW 建立新的連接 --state ESTABLISHED 已建立連接 --state RELATED 相關的 --state INVALID 無效的
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
放行已經建立連接的ip
十一、自定義鏈
創建自定義鏈 #示例:在filter表中創建IN_WEB自定義鏈 iptables -t filter -N IN_WEB 引用自定義鏈 #示例:在INPUT鏈中引用剛才創建的自定義鏈 iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB 重命名自定義鏈 #示例:將IN_WEB自定義鏈重命名為WEB iptables -E IN_WEB WEB 刪除自定義鏈 刪除自定義鏈需要滿足兩個條件 1、自定義鏈沒有被引用 2、自定義鏈中沒有任何規則 #示例:刪除引用計數為0並且不包含任何規則的WEB鏈 iptables -X WEB
十二、網絡防火牆
#如果想要iptables作為網絡防火牆,iptables所在主機開啟核心轉發功能,以便能夠轉發報文。 #使用如下命令查看當前主機是否已經開啟了核心轉發,0表示為開啟,1表示已開啟 cat /proc/sys/net/ipv4/ip_forward #使用如下兩種方法均可臨時開啟核心轉發,立即生效,但是重啟網絡配置后會失效。 方法一: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此時的角色為"網絡防火牆",所以需要在filter表中的FORWARD鏈中設置規則。 #可以使用"白名單機制",先添加一條默認拒絕的規則,然后再為需要放行的報文設置規則。 #配置規則時需要考慮"方向問題",針對請求報文與回應報文,考慮報文的源地址與目標地址,源端口與目標端口等。 #示例為允許網絡內主機訪問網絡外主機的web服務與sshd服務。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT #可以使用state擴展模塊,對上述規則進行優化,使用如下配置可以省略許多"回應報文放行規則"。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
十三、NAT
如果想要NAT功能能夠正常使用,需要開啟Linux主機的核心轉發功能。 echo 1 > /proc/sys/net/ipv4/ip_forward SNAT相關操作 配置SNAT,可以隱藏網內主機的IP地址,也可以共享公網IP,訪問互聯網,如果只是共享IP的話,只配置如下SNAT規則即可。 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公網IP 如果公網IP是動態獲取的,不是固定的,則可以使用MASQUERADE進行動態的SNAT操作,如下命令表示將10.1網段的報文的源IP修改為eth0網卡中可用的地址。 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE DNAT相關操作 配置DNAT,可以通過公網IP訪問局域網內的服務。 注:理論上來說,只要配置DNAT規則,不需要對應的SNAT規則即可達到DNAT效果。 但是在測試DNAT時,對應SNAT規則也需要配置,才能正常DNAT,可以先嘗試只配置DNAT規則,如果無法正常DNAT,再嘗試添加對應的SNAT規則,SNAT規則配置一條即可,DNAT規則需要根據實際情況配置不同的DNAT規則。 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 在本機進行目標端口映射時可以使用REDIRECT動作。 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 配置完成上述規則后,其他機器訪問本機的80端口時,會被映射到8080端口。