1. 程式人生 > >iptables 常用例子總結

iptables 常用例子總結

一、基本原理總結

1. 常用的幾個鏈

  • PREROUTING(nat)
    路由之前操作,用作DNAT 、REDIRECT。 只支援 -i, 不支援 -o。在作出路由之前,對目的地址進行修改

  • INPUT(filter)
    通常對 進入本機 資料進行過濾。

  • OUTPUT(nat、filter)
    影響 本機出的 資料。常用作DNAT 、REDIRECT。 DNAT和REDIRECT規則用來處理來自NAT主機本身生成的出站資料包.

  • FORWARD(filter)
    對轉發的資料進行 過濾 (通過、拒絕)。

  • POSTROUTING(nat)
    路由之後修改。只支援-o,不支援-i。在作出路由之後,對源地址進行修改。

2. 常用的幾個表

  • filter 對資料包的是否通行做出判斷。
  • nat 用於對資料進行地址轉換(源地址、目的地址),即修改資料包的源地址、目的地址。

3. 常用的幾個處理動作

DROP:    丟棄(不返回資訊)
REJECT:    拒絕(返回拒絕資訊)
ACCEPT:    允許
DNAT:    目標地址轉換  --to-dest  IP  或者 IP:port
SNAT:    源地址轉換  --to-source  IP  或者 IP:port
REDIRECT:    本機埠重定向 --to-port  port
MASQUERADE:     地址偽裝

4. 常用檢查模式

-s      ip      檢查包的源ip
-d      ip      檢查包的目的ip
-p      tcp     指定協議
--dport  80     目的埠
--sport  80     源埠
-i  eth0        從 eth0 接收的
-o  eth1        從 eth1 傳送的
! -s  192.168.0.1/24     某個網段取反

5. 開啟轉發配置

  • CentOS 6 /etc/sysctl.conf 配置 net.ipv4.ip_forward = 1
  • CentOS 7 /usr/lib/sysctl.d/50-default.conf
    配置 net.ipv4.ip_forward = 1

二、本機埠到本機埠重定向

1. 場景還原

  本機開啟http服務埠為 8000,為了不使 8000 埠向外界暴露,現在想對外只提供 80 埠。 訪問本機的 80 埠,就相當於訪問本機的 8000 埠。

2. 細節實現

   為了實現埠重定向,需要在進入本機前進行目標地址的修改,即改目標埠,目標IP不變。要用到 nat 表、 PREROUTING 鏈、開啟轉發規則。

sed -i '/net.ipv4.ip_forward/c net.ipv4.ip_forward\ =\ 1' /etc/sysctl.conf
sysctl -p

iptables -t nat -I PREROUTING -p tcp --dport 80 -i eth0 -j REDIRECT --to-port 8000
iptables -I INPUT -i eth0 -p tcp --dport 8000 -j ACCEPT

  現在訪問該機器的 80 埠就會自動導向到 8000 埠了。

三、公網 IP 到 本地區域網的 IP 對映

1. 場景還原

   現在只有一個公網 IP, 這個公網 IP 對應的機器還有一個內網網段,這個網段內有很多的內網機器(沒有公網 IP)。現在想通過這個公網 IP 訪問到那些內網機器的服務。

2. 細節實現

  為了實現公網到內網的訪問,需要使用目標地址轉換 DNAT,將目的地址改成內網IP。 同時為了讓 client 能識別伺服器的IP地址,需要使用源地址轉換 SNAT,將源地址改成公網 IP 地址。

  下面是使用 DNAT 實現遠端 ssh 的內網主機登入,即從擁有公網IP的server1 上 登入沒有公網IP的 server2 。

  • server1(跳板機) 公網IP 10.16.80.213:9100,內網IP 192.168.47.10
  • server2(目標機) 內網IP 192.168.47.20:22

  在server1 上做如下配置

iptables -t nat -I PREROUTING -d 10.16.80.213/32 -p tcp --dport 9100 -j DNAT --to-dest 192.168.47.20:22
iptables -t nat -I POSTROUTING -d 192.168.47.20/32 -p tcp --dport 22 -j SNAT --to-source 192.168.47.10

iptables -I FORWARD -d 192.168.47.20/32 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -s 192.168.47.20/32  -j ACCEPT

echo 1 > /proc/sys/net/ipv4/ip_forward

   其實上面的 SNAT 可以換成 MASQUERADE, 即 iptables -t nat -I POSTROUTING -d 192.168.47.20/32 -p tcp --dport 22 -j SNAT --to-source 192.168.47.10 換成 iptables -t nat -I POSTROUTING -d 192.168.47.20/32 -p tcp --dport 22 -j MASQUERADE

   資料流向:外網Internet —> server1(公網) 10.16.80.213 —> server1(內網) 192.168.47.10 —> server2(內網) 192.168.47.20

四、 區域網一批機器通過一個公網IP上網

1. 場景還原

  現在區域網有一批機器,在同一個網段,但是都沒有公網IP。 現在運營商提供了一臺有公網IP的機器。現在想通過這個公網IP為內網的機器做轉發,實現內網沒有公網IP的機器也可以上網。

2. 細節實現

  為了實現內網機器上網,可以在有公網IP的機器上,使用 iptables 的 SNAT 功能,為區域網的機器做轉發。 SNAT 的作用是把內網發出的 IP 資料包的源地址修改為那個公網IP地址。

  • server1(有公網) 公網IP 10.16.80.213,內網IP 192.168.47.10
  • server2(無公網) 內網IP 192.168.47.20

  在server1 上做如下配置


iptables -t nat -I POSTROUTING -s 192.168.47.0/24 -j SNAT --to-source 10.16.80.213

iptables -I FORWARD -s 192.168.47.0/24 -j ACCEPT
iptables -I FORWARD -d 192.168.47.0/24 -j ACCEPT

echo 1 > /proc/sys/net/ipv4/ip_forward

五、VPN 撥號方法

1. 場景還原

   現在想在 Linux 上撥 pptp協議的 VPN 伺服器, 撥號成功後需要正確配置路由才能使用撥號的VPN上網。這裡需要使用到 策略路由 來實現。

2. 路由簡介

  Linux 上路由分為兩類:快取路由、策略路由。

  • 快取路由
    快取路由是自動學習獲取的,使用者無法干預它的配置項。

  • 策略路由
    在 Linux 系統上存在著很多路由表,每個路由表中都會記錄一些路由走向,這些路由基於 源地址 進行定址。CentOS 預設使用了三個路由表:0、254、255(local、main、default),系統預設使用的路由表示 main , 平時我們配置的路由也是在這個 main 表中配置。

3. 細節實現

a. 連線VPN伺服器

  首先建立VPN連線、啟動VPN的pppd。

yum install pptp-setup pptp ppp -y
pptpsetup --create hk --server vpnserver --user root --password 123456 --encrypt
pppd call hk
ip add

b. 配置自定義管理路由表

  為了配置預設路由後還可以通過 ssh 遠端連線到伺服器,所以需要配置一個優先順序更高(比 main 優先順序高)的策略路由表,將其命名為 guanli。將遠端登入使用的路由配置在 guanli 路由表中。

  • 公網IP 1.1.1.1
  • 私網IP 172.16.252.22
  • 閘道器IP 172.16.252.254
echo "250    guanli" >> /etc/iproute2/rt_tables  
ip rule add from 172.16.25.22 table guanli
ip route add default via 172.16.25.254 table guanli

  然後將必要的解析走原來的閘道器。

ip route add 8.8.8.8 via 172.16.25.254 table guanli
ip route add 114.114.114.114 via 172.16.25.254 table guanli

c. 配置 main 預設策略路由

   檢視撥號成功後對端的IP是什麼。

# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:89:b5:db brd ff:ff:ff:ff:ff:ff
    inet 10.16.80.213/24 brd 10.16.80.255 scope global eth0
    inet6 fe80::20c:29ff:fe89:b5db/64 scope link 
       valid_lft forever preferred_lft forever
3: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 192.168.0.234 peer 192.168.0.1/32 scope global ppp0

   根據獲得的對端IP,配置預設路由,然後檢視是否成功。

ip route replace default via 192.168.0.1 
curl "http://ip.chinaz.com/getip.aspx"

   注意: 上面測試在阿里雲主機上測試成功。如果伺服器在內網,則不需要自定義一個管理策略路由,撥號成功後,直接修改預設路由為撥號的即可。

六、VPN 撥號為一批客戶端提供撥號服務

1. 場景還原

   現在有一臺 Linux 伺服器能上網, 同時能撥多個VPN賬號。現在有一批手機和這臺伺服器在同一個網段,現在想通過這臺 Linux 撥號,讓這些手機通過這個撥號IP出網,實現手機出網更換IP的功能。

2. 細節實現

   為了可以撥號上網,需要根據源地址配置路由策略。在Linux伺服器上,為每一臺手機分配一個策略路由表。然後配置每個手機的路由分別走這些路由表,最後給這些路由表配置已撥號成功的對端VPN的IP地址及裝置地址。

  • 內網網段
    10.16.80.0/24、

  • 內網閘道器
    10.16.80.1

  • Linux 服務地址
    10.16.80.250

  • 手機IP列表
    10.16.80.11
    10.16.80.12
    10.16.80.13

a. 撥多個VPN賬號

  在伺服器上建立VPN連線,然後撥上。撥成功後會得到產生的虛擬裝置資訊比如 ppp0、ppp1、ppp2等。

# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:89:b5:db brd ff:ff:ff:ff:ff:ff
    inet 10.16.80.213/24 brd 10.16.80.255 scope global eth0
    inet6 fe80::20c:29ff:fe89:b5db/64 scope link 
       valid_lft forever preferred_lft forever
3: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 192.168.0.237 peer 192.168.3.1/32 scope global ppp0
4: ppp1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 192.168.0.233 peer 192.168.0.1/32 scope global ppp1
5: ppp2: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 192.168.0.234 peer 192.168.0.6/32 scope global ppp2

b. 設定策略路由表

  下面新增了5個路由表,但是現在路由表還沒有內容為空的。

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
1       rt1
2       rt2
3       rt3

c. 配置每個策略路由表預設路由

  現在每臺手機已經配置進行策略路由裡面了,但是策略路由裡面還沒有預設路由,有了預設路由手機才可以根據預設路由走撥號VPN。

ip route add default via  192.168.3.1 dev ppp0 table rt1
ip route add default via  192.168.0.1 dev ppp1 table rt2
ip route add default via  192.168.0.6 dev ppp2 table rt3

d. 配置iptables允許轉發、masquerade配置

   因為Linux伺服器為手機做轉發,需要修改資料包源地址為撥號公網IP地址。而撥號的對端地址可能是變化的,所以要採用MASQUERADE 來動態獲取對端地址。

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -I POSTROUTING -o ppp1 -j MASQUERADE
iptables -t nat -I POSTROUTING -o ppp1 -j MASQUERADE
iptables -t nat -I POSTROUTING -o ppp2 -j MASQUERADE

  上面的iptables命令可以用這一條命令來代替 iptables -t nat -I POSTROUTING -o ppp+ -j MASQUERADE

  注意:因為Linux伺服器和手機在同一個網段,當VPN撥號不成功時,Linux伺服器會給手機通過正常的閘道器(10.16.80.1)上網,為了防止這種情況發生,可以增加iptables規則,使得如果該手機對於的vpn賬號撥號不成功,則拒絕為其轉發。新增下面命令後,如果VPN賬號撥號不成功,則無法訪問外網。

iptables -I FORWARD -s 10.16.80.0/24 -o eth0 -j REJECT