淺談linux網絡防火牆
1️⃣ iptables/netfilter網絡防火牆
- 充當網關
- 使用filter表的FORWARD鏈
- 注意的問題:
- 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性
- 如果要啓用conntrack機制,建議將雙方向的狀態爲ESTABLISHED的報文直接放行
2️⃣ 實驗:模擬網絡防火牆實現內外網分離
▶ 環境搭配
- 1號內網機器配置
ip route flush dev eth0
ipconfig eth0 192.168.39.14 / 指定內網地址
ip route add 192.168.39.0/24 dev eth0 / 創建路由表
ip route add default via 192.168.39.39 dev eth0 / 網關指向防火牆機器
yum -y install httpd
systemctl start httpd
echo "welcome to lanserver" > /var/www/html/index.html
- 配置2號防火牆機器
/ 查看路由轉發是否開啓
[root@centos7 ~]#sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0
/ 永久開啓寫入文件
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
/ 加載生效
[root@centos7 ~]#sysctl -p
net.ipv4.ip_forward = 1
- 配置3號互聯網機器
yum -y install vsftpd httpd
systemctl start vsftpd httpd
echo "weclome to netserver" > /var/www/html/index.html
vim /etc/sysconfig/netwerk-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO=static
DEFROUTE="yes"
NAME=eth0
DEVICE=eth0
ONBOOT="yes"
PREFIX=16
IPADDR=172.20.1.248
GATEWAY=172.20.1.247 / 網關指向firewall
DNS1=180.76.76.76
/ 加載啓用網卡配置
nmcli con reload
nmcli con up eth0
/ 測試是否訪問內網機器
[root@netserver ~]#ping -c3 192.168.39.14
PING 192.168.39.14 (192.168.39.14) 56(84) bytes of data.
64 bytes from 192.168.39.14: icmp_seq=1 ttl=63 time=1.71 ms
64 bytes from 192.168.39.14: icmp_seq=2 ttl=63 time=5.63 ms
64 bytes from 192.168.39.14: icmp_seq=3 ttl=63 time=1.50 ms
--- 192.168.39.14 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 1.503/2.951/5.635/1.899 ms
▶ 開始配置防火牆規則
- 允許內網(192.168.39.0/24)的主機訪問外網(172.20.0.0/16)的ftp, ssh服務,但外網的主機不允許訪問內網主機的所有服務
/ 加載ftp模塊
lsmod | grep ftp
modprobe nf_conntrack_ftp
/ 定義要求所需要的規則
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.39.0/24 -p tcp --dport 21:22 -j ACCEPT
iptables -A FORWARD -j REJECT
-
內網訪問互聯網ftp,ssh服務,均成功
-
外網訪問內網任何服務,全部拒絕
-
增加外網訪問內網的httpd服務,其他服務拒絕
/ 定義要求所需要的規則
iptables -I FORWARD 2 -p tcp --dport 80 -j ACCEPT
3️⃣ NAT表
▶1 NAT基本概念
-
NAT:network address translation
支持鏈:PREROUTING,INPUT,OUTPUT,POSTROUTING
請求報文:修改源/目標IP,由定義如何修改
響應報文:修改源/目標IP,根據跟蹤機制自動實現 -
SNAT:source NAT
支持鏈:POSTROUTING, INPUT
讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址僞裝
請求報文:修改源IP -
DNAT:destination NAT
支持鏈:PREROUTING, OUTPUT
把本地網絡中的主機上的某服務開放給外部網絡訪問(發佈服務和端口映射),但隱藏真實IP
請求報文:修改目標IP -
PNAT:port NAT,端口和IP都進行修改,發生在多臺本地網絡主機的端口衝突時
▶2 SNAT配置:通過net表的target配置
- SNAT:基於nat表的target,適用於固定的公網IP
- SNAT選項:
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
- MASQUERADE:動態IP,如撥號網絡
🌐 實驗:通過SNAT實現本地網絡主機訪問外網,而不會暴露本地網絡主機IP
- 當外網IP爲固定IP時,就是防火牆連接互聯網的地址
iptables -t nat -A POSTROUTING -s 192.168.39.0/24 -j SNAT --to-source 172.20.1.247
- 當外網IP爲動態IP時
iptables -t nat -A POSTROUTING -s 192.268.39.0/24 -j MASQUERADE
- 內網訪問外網httpd
curl 172.20.1.248
外網服務器httpd服務日誌顯示源地址爲172.20.1.247,實現了SNAT功能
▶3 DNAT配置:通過net表的target配置
- DNAT:nat表的target,適用於端口映射
- 格式:
DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]
🌐 實驗:實現本地網絡主機通過外網的指定網址提供http服務,
- 環境搭配:
外網指定IP:172.20.1.247,內網主機IP:192.168.39.14
外網IP端口80指向內網主機的80端口,外網IP端口8080指向內網主機的8000端口 - 配置內網主機多端口httpd服務
/ 創建目錄生成訪問頁面
mkdir -p /data/website2
echo "welcome to LAN1" > /data/website1/index.html
echo "welcome to LAN2" > /data/website2/index.html
/ 編寫配置文件
vim /etc/httpd/conf.d/test.conf
listen 8080
<virtualhost *:8080>
documentroot /data/website2/
<directory /data/website2>
allow from all / httpd2.2的寫法
</directory>
</virtualhost>
httpd -t
service httpd restart
- 修改防火牆規則
/ 開放tcp 8080端口
iptables -I FORWARD 3 -p tcp --dport 8080 -j ACCEPT
/ 定義DNAT表
iptables -t nat -A PREROUTING -d 172.20.1.247 -p tcp --dport 80 -j DNAT --to-destination 192.168.39.14:80
iptables -t nat -A PREROUTING -d 172.20.1.247 -p tcp --dport 8080 -j DNAT --to-destination 192.168.39.14:8080
- 外網主機訪問內網不同的端口,打開不同的web網頁
- 內網主機httpd的訪問日誌
▶4 轉發REDIRECT
- REDIRECT,是NAT表的target,
- 通過改變目標IP和端口,將接受的包轉發至同一個主機的不同端口
- 可用於PREROUTING OUTPUT鏈
- 格式:REDIRECT --to-ports port[-port]
- 實驗:實現將對主機80,8080端口的訪問轉發至主機的8081端口
/ 修改配置文件,增加一個8081端口主機
listen 8081
<virtualhost *:8081>
documentroot /data/website1/
<directory /data/website1>
allow from all / 注意:我這裏用的是httpd2.2版本
</directory>
</virtualhost>
/ 製作訪問頁面
echo "welcome to lanserver 8081" > /data/website1/index.html
service httpd restart
/ 定義要求所需要的防火牆策略,注意這個是內網主機的端口轉發
iptables -t nat -A PREROUTING -d 192.168.39.14 -p tcp -m multiport --dports 80,8080 -j REDIRECT --to-ports 8081
- 外網訪問測試