這篇文章給大家介紹下iptables防火墻,防火墻大致分三種,分別是硬件、軟件和云防火墻。硬件的話部署在企業(yè)網絡的入口,有三層路由的H3C、華為、Cisco(思科),還有深信服等等;軟件的話一般是開源軟件,寫在網站內部,最常見的有iptables(寫入Linux內核)和firewalld(CentOS7有的),云防火墻就是阿里云業(yè)務的防火墻安全組等等。
目錄
名詞解釋
iptables執(zhí)行過程
NetFilter框架
Linux服務器雙網卡路由器
表與鏈
1、filter表
2、NAT表
3、Mangle表
環(huán)境準備及命令
iptables命令參數(shù)
配置filter表規(guī)則
1、禁止訪問22端口
?編輯
2、封ip,屏蔽某個ip
3、禁止網段連入(禁止10.0.0.0/24網段訪問 8888端口)
4、只允許指定網段連入(允許10.0.0.0網段)
?編輯
5、指定多個端口
6、匹配ICMP類型
7、匹配網絡狀態(tài)(TCP/IP連接狀態(tài))
8、限制并發(fā)及速率
9、防火墻規(guī)則的保存與恢復
10、filter表簡單總結
企業(yè)中用法
1、ssh可以連接
2、設置允許本機lo通訊規(guī)則
3、配置默認規(guī)則及放行80,443端口
NAT表
1、實現(xiàn)共享上網
2、端口轉發(fā)(端口映射)
3、IP映射
4、NAT表簡單總結
iptables簡單練習
名詞解釋
在介紹防火墻之前,我們先了解幾個名詞
容器:可以存放東西
表(table):存放鏈的容器
鏈(chain):存放規(guī)則的容器
規(guī)則(policy):準許或拒絕規(guī)則
這幾個像俄羅斯套娃那樣環(huán)環(huán)相套!
iptables執(zhí)行過程
NetFilter框架
最底層是網絡接口層,網絡接口層上面是網絡層,網絡層部署了NetFilter(網絡過濾框架)
網絡層上面部署了TCP、UDP傳輸層,這一層部署了Filter表、NAT表、Mangle表,表種存放要檢查的條件和操作,這些都是內核層,再往上就是用戶層,也就是應用層,可以設置iptables命令。
Linux服務器雙網卡路由器
從物理層和數(shù)據(jù)鏈路層進入先通過PREROUTING鏈,進入路由判決,如果可以進入會通過INPUT鏈進入TCP、UDP,再進入應用層,由應用層再返回到TCP、UDP,通過OUTPUT鏈進入路由判決,再通過POSTROUTING鏈傳輸?shù)轿锢韺雍蛿?shù)據(jù)鏈路層出來。
如果在路由判決那里不能進入的話,則會通過FORWARD鏈傳輸?shù)匠隹诘穆酚膳袥Q,在通過POSTROUTING鏈進入物理層和數(shù)據(jù)鏈路層傳輸出來。
表與鏈
iptables是4表5鏈,4表是filter表、nat表、raw表、mangle表,5鏈是input、pouput、forward、prerouting、postrouting
filter表有input鏈、output鏈、forward鏈
nat表有prerouting鏈、output鏈、postrouting鏈
mangle表有prerouting鏈、forward鏈、input鏈、output鏈、postrouting鏈
1、filter表
負責流量進出,屏蔽或準許端口IP
filter表 | 主要和主機自身相關,真正負責主機防火墻功能的(過濾流入與流出主機數(shù)據(jù)包)filter標識iptables默認使用的表,這個表定義了三個鏈。企業(yè)工作場景:主機防火墻 |
INPUT | 負責過濾所有目標地址是本機地址的數(shù)據(jù)包,通俗說就是過濾進入主機的數(shù)據(jù)包 |
FORWARD | 負責轉發(fā)流經主機的數(shù)據(jù)包,起轉發(fā)的作用,和NAT關系很大,有專門的LVS NAT模式,net.ipv4.ip_forward=0 |
OUTPUT | 處理所有源地址是本機地址的數(shù)據(jù)包,通俗說就是從主機發(fā)送出去的數(shù)據(jù)包 |
2、NAT表
雙網卡的,負責接受到后轉發(fā),類似于路由器,可以實現(xiàn)NAT功能:共享上網(內網服務器上外網)、端口映射和ip映射
NAT | 負責網絡地址轉換,即來源與目的IP地址和端口的轉換。 應用:和主機本身無關,一般用于局域網共享上網或者特殊的端口轉換服務 工作場景: 1、用于企業(yè)路由(zebra)或網關(iptables),共享上網(postrouting) 2、做內部外部IP地址一對一映射(dmz),硬件防火墻映射IP到內部服務器,ftp服務(prerouting) 3、web,單個端口的映射,直接映射80端口(prerouting),這個表定義了3個鏈,nat功能相當于網絡的acl控制,和網絡交換機acl類似。 |
OUTPUT | 和主機放出去的數(shù)據(jù)包有關,改變主機發(fā)出數(shù)據(jù)包的目的地址 |
PREROUTING | 在數(shù)據(jù)包到達防火墻時,進行路由判斷之前執(zhí)行的規(guī)則,作用是改變數(shù)據(jù)包的目的地址、目的端口等 就是收信時,根據(jù)規(guī)則重寫收件人的地址 例如:把公網IP映射到局域網的服務器上,如果是web服務,可以把80轉換為局域網的服務器9000端口上10.0.0.61:80(目標端口)----nat----10.0.0.7:22 |
POSTROUTING | 在數(shù)據(jù)包離開防火墻時進行路由判斷之后執(zhí)行的規(guī)則,作用是改變數(shù)據(jù)包的源地址,源端口等 寫好發(fā)件人的地址,要讓家人的回信時能夠有地址可以回 例如:默認筆記本和虛擬機都是局域網地址,在出網的時候被路由器將源地址改為了公網地址 生產應用:局域網共享上網 |
3、Mangle表
存放頭部信息
環(huán)境準備及命令
準備Ansible(10.0.0.61,172.16.1.61)和Web01(10.0.0.7、172.16.1.7)兩臺主機
安裝iptables
[root@Ansible ~]# yum install -y iptables-services
查看iptables服務的配置文件
[root@Ansible ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables #防火墻的配置文件
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #防火墻服務配置文件(命令)
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
?將防火墻相關的模塊、加載到內核中
[root@Ansible ~]# modprobe ip_tables
[root@Ansible ~]# modprobe iptable_filter
[root@Ansible ~]# modprobe iptable_nat
[root@Ansible ~]# modprobe ip_conntrack
[root@Ansible ~]# modprobe ip_conntrack_ftp
[root@Ansible ~]# modprobe ip_nat_ftp
[root@Ansible ~]# modprobe ipt_state
?永久加入,寫進開機自啟動
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
?列出三表相關的內核模塊,lsmod是列出系統(tǒng)當前載入的所有內核模塊
[root@Ansible ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp 12809 0
nf_conntrack_ftp 18478 1 nf_nat_ftp
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack 139264 6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter 12810 0
ip_tables 27126 2 iptable_filter,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
關閉firewalld,啟用iptables,并設置開機自啟動
[root@Ansible ~]# systemctl stop firewalld
[root@Ansible ~]# systemctl disable firewalld
[root@Ansible ~]# systemctl start iptables.service
[root@Ansible ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
列出iptables所有規(guī)則
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT) #鏈默認規(guī)則
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 #規(guī)則
ACCEPT all -- 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
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT) #鏈默認規(guī)則
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) #鏈默認規(guī)則
target prot opt source destination
iptables命令參數(shù)
參數(shù) | 含義 |
-L | 顯示表中的所有規(guī)則 |
-n | 不要把端口或ip反向解析為名字 |
-t | 指定表,不指定默認是filter表 |
-A | append追加,加入準許類規(guī)則 |
-D | delete刪除,-D INPUT 1 |
-I | insert拒絕類規(guī)則放在所有規(guī)則的最上面 |
-p | 協(xié)議protocal tcp/udp/icmp/all |
--dport | 目標端口dest destination指定端口加上協(xié)議 -p tcp |
--sport | 源端口,source源 |
-d | --destination 目標IP |
-m | 指定模塊 multiport |
-i | input輸入的時候,從哪個網卡進來 |
-o | output輸出的時候,從哪個網卡出去 |
-j | 滿足條件后的工作:DROP/ACCEPT/REJECT DROP REJECT拒絕 DROP把數(shù)據(jù)丟掉,不會返回信息給用戶 REJECT拒絕,返回拒絕信息 |
-F | flush 清楚所有規(guī)則,不會處理默認的規(guī)則 |
-X | 刪除用戶自定義的鏈 |
-Z | 鏈的計數(shù)器清零(數(shù)據(jù)包計數(shù)器和數(shù)據(jù)包字節(jié)計數(shù)器) |
配置filter表規(guī)則
正式配置之前,先備份,清空規(guī)則
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -X
[root@Ansible ~]# iptables -Z
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
1、禁止訪問22端口
[root@Ansible ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
[root@Ansible ~]#
Connection closed by foreign host.
Disconnected from remote host(Linux86-10.0.0.61-Ansible) at 22:43:23.
Type `help' to learn how to use Xshell prompt.
[c:\~]$
?刪除規(guī)則
Connecting to 10.0.0.61:22...
Connection established.
To escape to local shell, press Ctrl+Alt+].
Last login: Sat May 6 22:44:26 2023
[root@Ansible ~]#
2、封ip,屏蔽某個ip
[root@Ansible ~]# iptables -I INPUT -s 10.0.0.7 -j DROP
[root@Ansible ~]# iptables -I INPUT -s 172.16.1.7 -j DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 172.16.1.7 0.0.0.0/0
DROP all -- 10.0.0.7 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
屏蔽之后用10.0.0.7ssh連接會卡住?
[root@Web01 ~]# ssh 10.0.0.61
3、禁止網段連入(禁止10.0.0.0/24網段訪問 8888端口)
#指定10.0.0.0網段的屏蔽了22端口
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
[root@Web01 ~]# ssh 10.0.0.61 hostname
^C
[root@Web01 ~]# ssh 172.16.1.61 hostname
root@172.16.1.61's password:
Ansible
#指定10.0.0.0網段的屏蔽8888端口
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
這個可以用nc和telnet測試
4、只允許指定網段連入(允許10.0.0.0網段)
類似于阿里云白名單功能,開放指定端口和網段,其他均拒絕
1、利用!排除,只準許10.0.0.0/24訪問
[root@Ansible ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.466 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.658 ms
^C
--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.466/0.562/0.658/0.096 ms
[root@Web01 ~]# ping 172.16.1.61
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
^C
--- 172.16.1.61 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms
2、修改鏈默認規(guī)則,修改為拒絕,添加準許?
若默認規(guī)則修改為拒絕后,ping公網IP可以但是ping公網域名不行,故障類似于DNS解析有問題(我踩過的坑)
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -P INPUT DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
5、指定多個端口
[root@Ansible ~]# ??iptables -I INPUT -p tcp --dport 8888 -j DROP
[root@Ansible ~]# iptables -I INPUT -p tcp --dport 9999 -j DROP
[root@Ansible ~]# ?iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9999
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
#如果是禁用連續(xù)端口可以不加-m multiport 1:1024
[root@Ansible ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1024:65535
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
6、匹配ICMP類型
ICMP(Internet Control Message Protocol)Internet控制報文協(xié)議,ping,是整個網站的核心
通過防火墻規(guī)則,控制是否可以ping
[root@Ansible ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
^C
--- 10.0.0.61 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5002ms
通過內核參數(shù),控制禁止被ping?
[root@Ansible ~]# cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 0 #0為允許,1為禁止
[root@Ansible ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
7、匹配網絡狀態(tài)(TCP/IP連接狀態(tài))
-m state --state
NEW:已經或將啟動新的連接
ESTABLISHED:已建立的連接
RELATED:正在啟動的新連接
INVALID:非法或無法識別的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
?
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
8、限制并發(fā)及速率
-m limit 限制模塊
-m limit --limit 10/minute #每分鐘只能有10個數(shù)據(jù)包 每6秒生成
?-m limit --limit n/{second/minute/hour}:指定時間內的請求速率”n”為速率,后面為時間分別為:秒 分 時
-m limit --limit 10/minute --limit-burst 5 每6秒釋放工牌 給別人使用
?
#10個數(shù)據(jù)包
前5個 1個1個工牌 從第6個開始 每6秒 才能釋放1個工牌
--limit-burst [n]:在同一時間內允許通過的請求“n”為數(shù)字,不指定默認為5
#ping icmp 協(xié)議 進行測試
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@Ansible ~]# iptables -P INPUT DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
?測試
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.298 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=1.33 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.435 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.460 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.758 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=2.28 ms #7和1之間間隔6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.793 ms #13和7之間間隔6秒
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.734 ms
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.803 ms
^C
--- 10.0.0.61 ping statistics ---
26 packets transmitted, 9 received, 65% packet loss, time 25013ms
rtt min/avg/max/mdev = 0.298/0.877/2.286/0.572 ms
9、防火墻規(guī)則的保存與恢復
iptables-save 保存,默認輸出到屏幕
iptables-restore 恢復,加上文件
寫入/etc/sysconfig/iptables
[root@Ansible ~]# iptables-save >/etc/sysconfig/iptables
[root@Ansible ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
*nat
:PREROUTING ACCEPT [306:36403]
:INPUT ACCEPT [182:29467]
:OUTPUT ACCEPT [145:11135]
:POSTROUTING ACCEPT [145:11135]
COMMIT
# Completed on Sun May 7 16:11:34 2023
# Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
*filter
:INPUT DROP [17:1428]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5580]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Sun May 7 16:11:34 2023
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -D INPUT 1
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables-restore < /etc/sysconfig/iptables
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
此外,systemctl restart iptables 會讀取/etc/sysconfig/iptables內容
10、filter表簡單總結
1、封ip,端口,網段
2、禁止ping
3、限制速度和并發(fā)
4、iptables filter表功能可以在云服務器使用
企業(yè)中用法
iptables配置方式:1、逛公園模式,默認規(guī)則是ACCEPT;2、看電影模式,默認規(guī)則是DROP
默認是拒絕
1、ssh可以連接
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -X
[root@Ansible ~]# iptables -Z
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Web01 ~]# ssh 10.0.0.61 hostname
root@10.0.0.61's password:
Ansible
2、設置允許本機lo通訊規(guī)則
允許本機回環(huán)lo(本地操作)接口數(shù)據(jù)流量流出和流入
[root@Ansible ~]# iptables -A INPUT -i lo -j ACCEPT
[root@Ansible ~]# iptables -A OUTPUT -o lo -j ACCEPT
3、配置默認規(guī)則及放行80,443端口
[root@Ansible ~]# iptables -P INPUT DROP
[root@Ansible ~]# iptables -P FORWARD DROP
[root@Ansible ~]# iptables -P OUTPUT ACCEPT
[root@Ansible ~]#
[root@Ansible ~]# iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@Ansible ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@Ansible ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
#此處還可以添加 vpn網段 比如說 10.7.1.0/24
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@Ansible ~]# iptables-save
# Generated by iptables-save v1.4.21 on Sun May 7 16:24:29 2023
*nat
:PREROUTING ACCEPT [9:711]
:INPUT ACCEPT [2:112]
:OUTPUT ACCEPT [3:312]
:POSTROUTING ACCEPT [3:312]
COMMIT
# Completed on Sun May 7 16:24:29 2023
# Generated by iptables-save v1.4.21 on Sun May 7 16:24:29 2023
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [7:1480]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun May 7 16:24:29 2023
NAT表
恢復鏈
[root@Ansible ~]# iptables -P INPUT ACCEPT
[root@Ansible ~]# iptables -P FORWARD ACCEPT
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
1、實現(xiàn)共享上網
1、防火墻配置
[root@Ansible ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
[root@Ansible ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@Ansible ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.ip_forward = 1
注意:公網IP不固定
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
2、web配置
[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no #修改網卡,禁止開機自啟動
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
[root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=172.16.1.61
DNS1=1.2.4.8
[root@Web01 ~]# systemctl restart network
[root@Ansible ~]# ssh 172.16.1.7
Last login: Sun May 7 21:16:43 2023 from 10.0.0.1
[root@Web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 00:0c:29:91:01:20 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:91:01:2a brd ff:ff:ff:ff:ff:ff
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe91:12a/64 scope link
valid_lft forever preferred_lft forever
?3、在web01測試結果
[root@Web01 ~]# ip r
default via 172.16.1.61 dev eth1
169.254.0.0/16 dev eth1 scope link metric 1003
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7
[root@Web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.1.61 0.0.0.0 UG 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
[root@Web01 ~]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=127 time=10.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=127 time=12.3 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 10.306/11.346/12.386/1.040 ms
[root@Web01 ~]# ping 1.2.4.8
PING 1.2.4.8 (1.2.4.8) 56(84) bytes of data.
64 bytes from 1.2.4.8: icmp_seq=1 ttl=127 time=12.5 ms
64 bytes from 1.2.4.8: icmp_seq=2 ttl=127 time=11.3 ms
^C
--- 1.2.4.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.337/11.945/12.554/0.618 ms
2、端口轉發(fā)(端口映射)
[root@Ansible ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
[root@Ansible ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
?本地shell測試
c:\~]$ ssh root@10.0.0.61 9000
Connecting to 10.0.0.61:9000...
Connection established.
To escape to local shell, press Ctrl+Alt+].
Last login: Sun May 7 21:34:55 2023 from 10.0.0.61
3、IP映射
[root@Ansible ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
[root@Ansible ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22
DNAT all -- 0.0.0.0/0 10.0.0.62 to:172.16.1.7
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
4、NAT表簡單總結
1、可以實現(xiàn)共享上網
2、可以實現(xiàn)端口轉發(fā)
3、NAT功能在云服務器無法使用,但有替代品叫NAT網關
iptables簡單練習
1、查看iptables當前所有規(guī)則的命令
iptables-save
iptables -nL
iptables -nL -t nat
2、禁止來自10.0.0.188IP地址訪問80端口的請求
iptables -I INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP
3、在命令行執(zhí)行的iptables規(guī)則永久生效
iptables-save > /etc/sysconfig/iptables
?4、實現(xiàn)把訪問10.0.0.3:80請求轉到172.16.1.17:80
iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80
5、實現(xiàn)172.16.1.0/24段所有主機通過124.32.54.26外網IP共享上網
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 123.32.54.26
?
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT MASQUERADE
6、iptables實現(xiàn)防止syn ddos和ping攻擊
-A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
-A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
說明:第一行:每秒中最多允許5個新連接。第二行:防止各種端口掃描。第三行:Ping洪水攻擊(Ping of Death),可以根據(jù)需要調整或關閉
我是koten,10年運維經驗,持續(xù)分享運維干貨,感謝大家的閱讀和關注!文章來源:http://www.zghlxwxcb.cn/news/detail-704303.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-704303.html
到了這里,關于【運維知識進階篇】iptables防火墻詳解(iptables執(zhí)行過程+表與鏈概述+iptables命令參數(shù)+配置filter表規(guī)則+NAT表實現(xiàn)共享上網、端口轉發(fā)、IP映射)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!