一、安裝iptables服務
1、查看系統是否安裝了iptables防火牆
[root@localhost ~]# iptables -V
2、安裝 iptables 防火牆
3、查看防火牆規則列表
[root@localhost ~]# iptables --list [root@localhost ~]# iptables --list-rules
二、開啟、關閉、重啟 iptables 服務
1、通過 service 操作防火牆
[root@localhost ~]# service iptables stop # 關閉防火牆(清空規則) [root@localhost ~]# service iptables start # 啟動防火牆(讀取配置文件里的規則) [root@localhost ~]# service iptables restart # 重啟防火牆(清空規則讀取配置文件里規則) [root@localhost ~]# service iptables save # 保存防火牆(規則保存到配置文件中) [root@localhost ~]# service iptables status # 查看防火牆啟動狀態(查看當前使用的規則) [root@localhost ~]# service iptables reload # 重新加載相關配置,效果和restart一樣,很多新的系統中一般不用了。
三、規則設定
1、開放端口(這種情況下所有ip均能訪問3120端口,即對外暴露3120端口了)
[root@localhost ~] iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3120 -j ACCEPT # 開啟防火牆 3120 端口,方式一 [root@localhost ~] iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3120 -j ACCEPT # 開啟防火牆 3120 端口,方式二
2、關閉端口
[root@localhost ~] iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 3120 -j ACCEPT # 刪除防火牆 3120 端口。方式一 [root@localhost ~] iptables -nv --line-number
3、屏蔽指定IP:拒絕指定IP,所有端口都不能訪問
[root@localhost ~]# iptables -I INPUT -s 1.1.1.1 -j DROP # 添加屏蔽IP,方式一 [root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j DROP # 添加屏蔽IP,方式二 [root@localhost ~]# iptables -D INPUT -s 1.1.1.1 -j DROP # 刪除屏蔽IP
4、放行指定IP:允許指定IP,所有端口都可以訪問
[root@localhost ~]# iptables -I INPUT -s 1.1.1.1 -j ACCEPT # 添加放行IP,方式一 [root@localhost ~]# iptables -A INPUT -s 1.1.1.1 -j ACCEPT # 添加放行IP,方式二 [root@localhost ~]# iptables -D INPUT -s 1.1.1.1 -j ACCEPT # 刪除放行IP
5、允許指定 IP 訪問指定端口
iptables -I INPUT -s 1.1.1.1 -p tcp --dport 3120 -j ACCEPT iptables -D INPUT -s 1.1.1.1 -p tcp --dport 3120 -j ACCEPT
6、拒絕指定 IP 訪問指定端口
iptables -I INPUT -s 1.1.1.1 -p tcp --dport 3120 -j DROP iptables -D INPUT -s 1.1.1.1 -p tcp --dport 3120 -j DROP
7、重啟后生效
[root@localhost ~]# chkconfig iptables off # 永久關閉防火牆 [root@localhost ~]# chkconfig iptables on # 永久關閉后重啟
8、ping設置
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 允許PING設置 [root@localhost ~]# iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP # 禁止PING設置
四、端口轉發
1、開啟系統的轉發功能,開啟內核 ip_forward 轉發。sysctl配置ipv4轉發
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 # 方式一:臨時生效 [root@localhost ~]# vim /etc/sysctl.conf # 方式二:永久生效,更改net.ipv4.ip_forward的值為1:net.ipv4.ip_forward = 1。默認值為0 [root@localhost ~]# sysctl -p # 使用命令讓配置馬上生效 [root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf [root@localhost ~]# sysctl -p /etc/sysctl.conf [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward # 方式三
2、將本機的端口轉發到本機端口,這種情況不需要第一步
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 88 -j REDIRECT --to-port 3120 # 添加端口轉發 [root@localhost ~]# iptables -t nat -D PREROUTING -p tcp --dport 88 -j REDIRECT --to-port 3120 # 刪除端口轉發
3、將本機的端口轉發到其他機器,這種情況就需要第一步
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport This_Server_Port -j DNAT --to-destination Remote_Server_IP:Remote_Server_Port [root@localhost ~]# iptables -t nat -A POSTROUTING -p tcp -d Remote_Server_IP --dport Remote_Server_Port -j SNAT --to-source This_Server_IP [root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8006 -j DNAT --to-destination 32.23.56.69:3120 # 第一步:訪問8006端口的數據包轉發到32.23.56.69上的3120端口 [root@localhost ~]# iptables -t nat -A POSTROUTING -j MASQUERADE # 第二步:任選其一,一般選這個就行 [root@localhost ~]# iptables -t nat -A POSTROUTING -p tcp -d 32.23.56.69 --dport 3120 -j SNAT --to-source 172.16.16.10 # 第二步:任選其一
4、如果上面操作完還不行的話,就放行轉發命令。這一步一般不需要。
[root@localhost ~]# iptables -I FORWARD -i eth0 -j ACCEPT # 放行Forward的數據包,其中eth0改為實際使用網卡(一般是eth0) [root@localhost ~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 開啟網卡混雜模式(允許任意流向的數據包) [root@localhost ~]# iptables -D FORWARD -i eth0 -j ACCEPT # 刪除第一條 [root@localhost ~]# iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # 刪除第二條
5、抓包測試
# 方式一 [root@localhost ~]# tcpdump -S -s0 -nn -i any port 8006 # 本地端抓包,可以不用管這條命令 [root@localhost ~]# tcpdump -S -nn -i any port 8006 or port 3120 # 在中間服務器上執行這條命令 [root@localhost ~]# tcpdump -S -nn -i any port 3120 # 在目的服務器上執行這條命令 # 方式二:-i 選項指定網卡,-w 選項保存結果到文件當中。 [root@localhost ~]# tcpdump -i eth0 port 3120 or 8006 -w result.cap
6、名詞解釋
- DNAT是destination networkaddress translation的縮寫,即目標網絡地址轉換。
- SNAT是source networkaddress translation的縮寫,即源地址目標轉換。
- MASQUERADE,地址偽裝,算是snat中的一種特例,可以實現自動化的snat。
五、配置文件:/etc/sysconfig/iptables
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # 開啟防火牆端口80、443、3306 -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 39000:40000 -j ACCEPT # 允許PING設置 -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT
六、鏈的基本操作
# 清除預設表filter中所有規則鏈中的規則。 [root@localhost ~]# iptables -F # 清除預設表filter中使用者自定鏈中的規則。 [root@localhost ~]# iptables -X [root@localhost ~]# iptables -Z # 設置鏈的默認策略。一般有兩種方法。 # 首先允許所有的包,然后再禁止有危險的包通過放火牆。 [root@localhost ~]# iptables -P INPUT ACCEPT [root@localhost ~]# iptables -P OUTPUT ACCEPT [root@localhost ~]# iptables -P FORWARD ACCEPT # 首先禁止所有的包,然后根據需要的服務允許特定的包通過防火牆。 [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -P OUTPUT DROP [root@localhost ~]# iptables -P FORWARD DROP # 列出表/鏈中的所有規則。默認只列出filter表。 [root@localhost ~]# iptables -L https://www.cnblogs.com/blogforly/p/5997287.html https://www.cnblogs.com/kevingrace/p/6265113.html
七、通過 ipset 來封禁IP
[root@localhost ~]# ipset list [root@localhost ~]# ipset create allset hash:net [root@localhost ~]# ipset add allset 145.201.56.109 [root@localhost ~]# ipset del allset 145.201.56.109 [root@localhost ~]# iptables -I INPUT -m set --match-set allset src -p tcp -j DROP [root@localhost ~]# iptables -D INPUT -m set --match-set allset src -p tcp -j DROP
https://www.cnblogs.com/zhink/articles/9171834.html:跟ufw使用ipset差不多
https://www.moerats.com/archives/684/
https://blog.csdn.net/wangshui898/article/details/90513792
https://www.centos.bz/2017/07/iptables-port-redirect/
https://blog.csdn.net/e_wsq/article/details/79933232