# iptables、共用上網SNAT、埠轉發DNAT ## 1.防火牆概述 封端⼝,封ip 實現NAT功能 共用上⽹ 端⼝映射(端⼝轉發),ip映射 ## 2.防火牆 ### 2.1防火牆種類以及使用說明 硬體:整個企業入口 軟體:開源軟體 網站內部 封ip iptables 雲防火牆 安全組 ...
iptables、共用上網SNAT、埠轉發DNAT
1.防火牆概述
封端⼝,封ip
實現NAT功能
共用上⽹
端⼝映射(端⼝轉發),ip映射
2.防火牆
2.1防火牆種類以及使用說明
硬體:整個企業入口
軟體:開源軟體 網站內部 封ip
iptables
雲防火牆
安全組
NAT網關
waf應用防火牆
2.2專有名詞
容器、表、鏈、規則
2.3iptables執行過程
1.防⽕牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進⾏過濾的。
2.如果匹配成功規則,即明確表示是拒絕(DROP)還是接收(ACCEPT),數據包就不再向下匹配新的規則。
3.如果規則中沒有明確表明是阻⽌還是通過的,也就是沒有匹配規則,向下進⾏匹配,直到匹配預設規則得到明確的阻⽌還是通過。
4.防⽕牆的預設規則是所有規則都匹配完才會匹配的。
2.4表與鏈
iptables 是 4表伍鏈
4表: filter 表 nat表 raw表 mangle表
伍鏈: INPUT OUTPUT FORWARD PREROUTING POSTROUTING
1.filter表
實現防火牆功能:屏蔽或准許埠ip
2.nat表
實現nat功能:實現共用上網 埠映射和ip映射
2.5環境準備及命令
先關閉防火牆
systmectl stop firewalld
systemctl disable firewalld
1.安裝並啟動
yum install iptables-services
systemctl enable iptables
systemctl start iptables
2.設置開機自啟防火牆相關模塊
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 | egrep 'filter|nat|ipt'
3.查看規則
iptables -nL 預設filter -n不要把端⼝ 或ip反向解析為名字 -L 列出規則
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
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
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)
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)
target prot opt source destination
查看指定表的規則 iptables -t nat -nL
[root@localhost ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
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
配置filter表規則
-A | 添加防火牆規則(尾部追加) |
---|---|
-D | 刪除防火牆規則 |
-I | 插入防火牆規則(首部插入) |
-F | 清空防火牆規則 |
-X | 刪除用戶自定義的鏈 |
-L | 列出添加防火牆規則 |
-R | 替換防火牆規則 |
-Z | 清空防火牆數據表統計信息 |
-P | 設置鏈預設規則 |
-p | 協議 protocal tcp/udp/icmp/all 指定埠的時候需要用到指定協議 |
--dport | 目標埠 |
-j | 滿足條件後的動作 DROP/ACCEPT/REJECT drop 把數據丟掉不會返回給用戶 reject 返回拒絕信息 |
-s | --source 源ip |
-d | --destination ⽬標ip |
1.先清空規則
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -Z
[root@localhost ~]# 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
2.添加規則
iptables -t filter -I INPUT -p tcp --dport 22122 -j drop
3.刪除規則
iptables -t filter -D INPUT 1 //1是行號 上述添加的規則的行號
1:封ip
1.192.168.70.133機器 ping 192.168.70.136機器
[root@web2 ~]# ping 192.168.70.136
PING 192.168.70.136 (192.168.70.136) 56(84) bytes of data.
64 bytes from 192.168.70.136: icmp_seq=1 ttl=64 time=0.937 ms
2.136機器添加規則
iptables -t filter -I INPUT -s 192.168.70.134 -j DROP
3.刪除規則
iptables -D INPUT 1 //刪除後可以發現又繼續ping了
2:禁止網段訪問指定埠
iptables -t filter -I INPUT -s 192.168.70.0/24 -p tcp --dport 8888 -j DROP
3:只允許指定網段連入
iptables -I INPUT ! -S 192.168.70.0/24 -j DROP
4:指定多埠
iptables -I INPUT -m multiport -p tcp --dport 80,433 -j DROP //禁止80和433埠
iptables -I INPUT -p tcp --dport 1:10 -j DROP //禁止1-10埠
5:控制是否能ping
iptables -I INPUT -p icmp -j DROP
另一種方法
vim /etc/sysctl.conf //添加如下一條指令
net.ipv4.icmp_echo_ignore_all = 1
sysctl -p //生效
6:匹配⽹絡狀態(TCP/IP連接狀態)
NEW:已經或將啟動新的連接
ESTABLISHED:已建⽴的連接
RELATED:正在啟動的新連接INVALID:⾮法或⽆法識別的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
7:限制併發及速率
-m limit --limit 10/minute #每分鐘只能有10個數據包 每6秒⽣成
8:防⽕牆規則的保存與恢復
iptables-save 預設輸出到屏幕
iptables-restore 加上⽂件
寫⼊到/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
3.實際⽣產⽤法
iptables -F
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -s 允許的IP地址 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables-save
4.共用上網SNAT
實現:內部網路的伺服器通過可訪問外網的機器訪問到外網
環境準備
server01設置為VMnet2 192.168.100.18
server02設置為NAT 192.168.70.134 網路再添加一個網卡VMnet2 192.168.100.16
1.設置好server01的ip
[root@server01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="none"
IPADDR=192.168.100.18
NETMASK=255.255.255.0
NAME="ens33"
DEVICE="ens33"
DNS1=114.114.114.114
2.設置好server02的ip
[root@server02 ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:13:88 brd ff:ff:ff:ff:ff:ff
inet 192.168.70.134/24 brd 192.168.70.255 scope global noprefixroute dynamic ens33
valid_lft 5270229sec preferred_lft 5270229sec
inet6 fe80::725c:49ee:6f78:42a0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 00:0c:29:eb:13:92 brd ff:ff:ff:ff:ff:ff
[root@server02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
BOOTPROTO="none"
IPADDR=192.168.100.16
NETMASK=255.255.255.0
NAME="ens37"
DEVICE="ens37"
DNS1=114.114.114.114
[root@server02 ~]# systemctl restart network
[root@server02 ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:13:88 brd ff:ff:ff:ff:ff:ff
inet 192.168.70.134/24 brd 192.168.70.255 scope global noprefixroute dynamic ens33
valid_lft 5269237sec preferred_lft 5269237sec
inet6 fe80::725c:49ee:6f78:42a0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:13:92 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.16/24 brd 192.168.100.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feeb:1392/64 scope link
valid_lft forever preferred_lft forever
3.測試ping相互下一
[root@server01 ~]# ping 192.168.100.16
4.server02開啟轉發功能
[root@serve02 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@serve02 ~]# sysctl -p
5.server02設置iptables
[root@serve02 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.70.134
6.測試
[root@server01 ~]# ping baidu.com //能通則成功了
[root@server02 ~]# iptables -t nat -D POSTROUTING 1 //再試著關閉規則 再試試ping
5.埠轉發DNAT
在上述snat基礎上增加一臺機器server03
1.server02添加prerouting規則
iptables -t nat -A PREROUTING -d 192.168.70.134 -p tcp --dport 9000 -j DNAT --to-destination 192.168.100.18:22
2.server03測試
[root@localhost ~]# ssh 192.168.70.134 -p 9000
[email protected]'s password:
Last login: Fri Sep 1 20:37:06 2023
[root@localhost ~]# ip a //查看埠可以發現連上的是server01
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:18:39:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.18/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::725c:49ee:6f78:42a0/64 scope link noprefixroute
valid_lft forever preferred_lft forever