2021年9月20日 星期一

CentOS 7.6上安裝 iptables NAT

一般想要讓家中或是公司裡的終端設備(如桌機、筆電或是手機等連網裝置)可以連線至Internet,會需要使其介接區域網路中的WIFI路由器或是IP分享器,透過這種IP轉譯方式,讓區域網路中眾多的終端設備可以共用ISP所提供的單一Public IP與Internet互聯。

一個Public IP對應著一個可以連線Internet的份額,而世界上可用的Public IP相較於地球數十億人口甚至是數十億設備來說是非常稀缺的,因此當個人用戶或是企業向ISP申請可與Internet互聯的Public IP時,可說是僧多粥少,一家五十人規模的企業能分得4~6個Public IP進行上網就已經很奢侈了,因此IP轉譯的方式成為了解決IPv4不足的必要手段。

IP轉譯技術上我們稱呼為NAT(Network address translation),這個技術類似於現在流行的共享浪潮,比如說單車只有10台,但是在一天當中卻有50個用戶想要騎腳踏車怎麼辦呢?答案是合理的分配每個使用者騎腳踏車的時間,從結果來看每個人都能騎到腳踏車,而不需要替每個人都各買一台腳踏車,以節省腳踏車的資源,而NAT即是讓珍貴的單一Public IP透過IP轉譯的方式,讓其背後為數眾多的設備裝置共享這一個能夠連線至Internet的Public IP。

以下將透過CentOS 7.6作業系統(Linux Server)來展示以雙網卡實現NAT的作法,LocalLAN作為家中或公司內部的區域網路,設計使用192.168.100.0/24的網段,其中Linux Server在Eth0的部分設置內網IP為192.168.100.254作為內部區域網路的gateway,而Eth1則對接ISP所提供的Public IP,一般是直接連接中華電信提供的小烏龜或是Cable有線電視寬頻提供的路由器,Eth1的IP設置依賴於ISP提供的方法,比如以DHCP方式自動取得IP或是手動設置Static IP(本例為1.100.10.10,請勿參照)


停用CentOS7預設的Firewalld

[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable direwalld

啟用系統ip轉發功能

[root@server ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@server ~]# sysctl -p

安裝iptables服務

[root@server ~]# yum -y install iptables-services

編寫以下script啟用iptables NAT,此處預設eth1為外網、eth0為內網

[root@server ~]# cat /root/iptables_NAT.sh <<-'EOF'
#!/bin/bash
iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p udp --dprot 53 -j ACCEPT
iptabels -A INPUT -p tcp --dprot 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dprot 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.100.0/24 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
EOF

將規則寫入iptable服務、啟動iptables服務並設定為開機啟動iptables服務

[root@server ~]# chmod 777 /root/iptables_NAT.sh
[root@server ~]# /root/iptalbes_NAT.sh
[root@server ~]# iptables-save > /etc/sysconfig/iptables
[root@server ~]# systemctl enable iptables
[root@server ~]# systemctl restart iptables



0 意見: