IP地址分為公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)負責的,這些IP地址分配給了注冊並向INIC提出申請的組織機構。Private Address屬於非注冊地址,專門為組織內部使用。Private Address是不可能直接用來跟WAN通信的,要么利用幀來通信(FRE幀中繼,HDLC,PPP),要么需要路由的轉發(nat)功能把私有地址轉換為公有地址才行。
出於安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多於一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將數據包發往本機另一塊網卡,該網卡根據路由表繼續發送數據包。這通常是路由器所要實現的功
說明:現在有些網絡已經普及ipv6的,所以下面的命令可以從ipv4改為ipv6即可
使用sysctl:
sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
或者檢查/proc下的文件:
cat /proc/sys/net/ipv4/ip_forward 0
ipv4轉發沒有開啟 (值為 0)
通過sysctl可以開啟ipv4的轉發功能 (無需重啟):
sysctl -w net.ipv4.ip_forward=1
或者
echo 1 > /proc/sys/net/ipv4/ip_forward
這種設置只是暫時的,它的效果會隨着計算機的重啟而失效。
通過在/etc/sysctl.conf設置參數:
如果想使IP轉發永久生效,就請修改/etc/sysctl.conf ,在這里可以增加一條net.ipv4.ip_forward = 1
/etc/sysctl.conf: net.ipv4.ip_forward = 1
如果ipv4轉發項已被設為0那么你只需要將它改為1。
sysctl -p /etc/sysctl.conf
在紅帽系列的發行版上可以通過重啟網絡服務使之生效:
service network restart
而在Debian/Ubuntu系列的發行版則用這樣的命令:
#早期版本
/etc/init.d/procps.sh restart
#最新版本
/etc/init.d/procps restart
原文來自:
http://www.linuxidc.com/Linux/2017-09/147186.htm
幾個實例說明https://www.cnblogs.com/zhaogaojian/p/8186220.html
1. iptables的表格與鏈
1.1. Linuxs的iptables里面至少有三個表格(table)
- Filter(過濾器):主要和進入Linux的數據包有關,是默認的tables;
- NAT (地址轉換):Network Address Translation的縮寫,這個表格主要用來進行數據包的源地址以及目的地址的IP和Port的轉換;
- Mangle:不做過多討論
1.2. 每個表格又含多個鏈(chain)
- Filter過濾器的鏈
- INPUT: 定義規則過濾想要進入Linux主機的數據包;
- OUTPUT:處理Linux主機想要送出去的數據包;
- FORWARD:與當前的Linux主機無關,需要轉發到其他計算機的包;
- NAT地址轉換的鏈
- PREROUTING:進行路由判斷前要遵循的規則;
- POSTROUTING:進行路由判斷后要遵循的規則;
- OUTPUT:過濾發出去的數據包
-
這些默認表格和鏈怎么相互工作
這里不考慮Mangle表格,參看如下簡化后netfilter流程圖
- 路徑A:數據包經過路由判斷后,是向Linux主機發起的,經過Filter:INPUT鏈進行數據控制;
- 路徑B:數據包是要轉發走的,則先經過Filter:FORWARD的處理,然后經過NAT:POSTROUTING;
- 路徑C:數據包是從Linux本機送出去的;
2. 轉發和NAT規則
多數的組織都只能分配到有限的公網IP地址。那么一個公司里面局域網(LAN)內的那么多節點要是上網就只能使用內網IP,這個時候就需要有一個Edge路由(比如說防火牆)可以從WAN上接受傳輸然后路由到內網節點上;同時防火牆/網關要可以吧局域網節點的數據包路由到WAN上。這個時候iptables就提供了路由和轉發的策略來防止一些異常使用網絡資源的行為。
2.1. FORWARD策略
'FORWARD'策略允許管理者來控制局域網內數據包轉發到哪里去。舉個例子來說,為了允許局域網內的數據包轉發,假設網關上分配了一個內網IP地址給eth1,那么我們就需要添加如下的一條轉發規則
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
這條規則就允許防火牆后面的系統來訪問內部網絡了,網關會把一個局域網內節點的數據包路由到另一個節點,通過eth1這個設備來傳遞所有數據包。
2.2. IP偽裝
允許通過防火牆的內網IP地址進行數據包轉發后,局域網內節點之間就可以相互通信了;但是這個時候還是不能訪問外網,我們還必須配置防火牆的IP偽裝,這個過程中會使用防火牆的外網地址(這里舉例的外網網卡是eth0)來替代LAN節點上過來的數據包的內網IP。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-t nat
代表NAT表;-A POSTROUTING
指定NAT上的POSTROUTING鏈; -j MASQUERADE
指定了要用外網IP來替換數據包上的內網IP
2.3. DNAT設置
如果你的內網有個服務器,你想把它配置成外網可以訪問,你可以使用-j DNAT
來配置NAT表的PREROUTING鏈來指定一個內網IP用於外網發過來的數據包請求的轉發。舉個例子來說,如果你希望轉發一個HTTP請求到你指定HTTP服務器:172.31.0.23,可以運行如下的命令:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
--to 172.31.0.23:80
這條規則指定了NAT表中的內建鏈PREROUTING把所有收到的HTTP請求都轉發到目的地址172.31.0.23
Note
如果你的FORWARD鏈中有一條默認的策略DROP,你必須添加一條規則來允許轉發收到的HTTP請求,只有這樣目的的NAT路由才有可能,
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT
鏈接:https://www.jianshu.com/p/d4f349f6f48c
iptables實現IP地址重定向(轉發)
iptables不單只防火牆這么簡單,NAT轉發這些都很強大。但是市面上iptables的教程基本都是圍繞着CentOS 6來展開的,而對於CentOS 7和Ubuntu又不一樣的寫法,尤其是Ubuntu居然加了一個ufw做為封裝,目的是為了簡化iptables,個人感覺比較亂,封裝了太多導致上層看不到更多的原理!而CentOS 7整理來說會保持,但是有些規則還是變了,使用的是firewalld的新概念。
下面實現的是通過一個內網IP重定向到一個外網IP上,或者訪問一個外網IP重定向到一個內網IP,基本操作保持一致,主要目的就是重定向,有點類似host:
1、通過代理訪問121.8.210.236的轉向訪問192.168.191.236
sudo iptables -t nat -A OUTPUT -d 121.8.210.236 -j DNAT --to-destination 192.168.191.236
sudo iptables -t nat -A OUTPUT -d 10.0.0.2 -p tcp --dport 11211 -j DNAT --to-destination 192.168.1.33:11211
2、反過來,訪問192.168.191.236的轉向訪問121.8.210.236
sudo iptables -t nat -A OUTPUT -d 192.168.191.236 -j DNAT --to-destination 121.8.210.236
配完后
iptables -t nat -A OUTPUT -d 192.168.1.100 -j DNAT --to-destination 192.168.1.1
查看