如何僅使用 SSH 建立/設定 VPN?

如何僅使用 SSH 建立/設定 VPN?

這是我試圖解決的問題。我可以從本機連接到伺服器(“遠端系統”),但該遠端系統沒有網路連線。我想使用基於 ssh 的 VPN 為遠端系統提供透過本機電腦存取網際網路的權限。我該如何實現這個目標?我嘗試過以下方法,似乎部分有效。我所說的「部分工作」是指連接資料包(同步資料包)被發送到我的本地計算機,但無法建立與互聯網的連接。我正在使用 tcpdump 捕獲本地計算機上的資料包。本機和遠端系統都運行centos 7。

設定- 注意:以下命令依序運行。 user@remote 指令在遠端伺服器上執行,user@local 指令在本機電腦上執行。

[user@remote ~]$ ip 位址顯示
1: lo: mtu 65536 qdisc noqueue 狀態未知
    連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 範圍主機 lo
       永遠有效_lft 永遠首選_lft
    inet6 ::1/128 範圍主機
       永遠有效_lft 永遠首選_lft
2: eth0: mtu 1500 qdisc pfifo_fast 狀態 UP qlen 1000
    連結/以太 AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 範圍全域動態 eth0
       valid_lft 1785 秒 Preferred_lft 1785 秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 範圍全域 noprefixroute 動態
       valid_lft 2591987 秒 Preferred_lft 604787 秒
    inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 範圍鏈接
       永遠有效_lft 永遠首選_lft
[user@local ~]$ ip 位址顯示
1: lo: mtu 65536 qdisc noqueue 狀態未知
    連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 範圍主機 lo
       永遠有效_lft 永遠首選_lft
    inet6 ::1/128 範圍主機
       永遠有效_lft 永遠首選_lft
2: eth0: mtu 1500 qdisc pfifo_fast 狀態 UP qlen 1000
    連結/以太 AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 範圍全域動態 eth0
       valid_lft 1785 秒 Preferred_lft 1785 秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 範圍全域 noprefixroute 動態
       valid_lft 2591987 秒 Preferred_lft 604787 秒
    inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 範圍鏈接
       永遠有效_lft 永遠首選_lft

建立tun0介面偏僻的系統。

[user@remote ~]$ sudo ip tuntap add tun0 模式 tun
[user@remote ~]$ ip 位址顯示
1: lo: mtu 65536 qdisc noqueue 狀態未知
    連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 範圍主機 lo
       永遠有效_lft 永遠首選_lft
    inet6 ::1/128 範圍主機
       永遠有效_lft 永遠首選_lft
2: eth0: mtu 1500 qdisc pfifo_fast 狀態 UP qlen 1000
    連結/以太 AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 範圍全域動態 eth0
       valid_lft 1785 秒 Preferred_lft 1785 秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 範圍全域 noprefixroute 動態
       valid_lft 2591987 秒 Preferred_lft 604787 秒
    inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 範圍鏈接
       永遠有效_lft 永遠首選_lft
3: tun0: mtu 1500 qdisc noop 狀態 DOWN qlen 500
    連結/無

建立tun0介面當地的系統。

[user@local ~]$ sudo ip tuntap add tun0 模式 tun
[user@local ~]$ ip 位址顯示
1: lo: mtu 65536 qdisc noqueue 狀態未知
    連結/環回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 範圍主機 lo
       永遠有效_lft 永遠首選_lft
    inet6 ::1/128 範圍主機
       永遠有效_lft 永遠首選_lft
2: eth0: mtu 1500 qdisc pfifo_fast 狀態 UP qlen 1000
    連結/以太 AA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD/24 brd AAA.BBB.CCC.255 範圍全域動態 eth0
       valid_lft 1785 秒 Preferred_lft 1785 秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL/64 範圍全域 noprefixroute 動態
       valid_lft 2591987 秒 Preferred_lft 604787 秒
    inet6 ABCD::IIII:JJJJ:KKKK:LLLL/64 範圍鏈接
       永遠有效_lft 永遠首選_lft
3: tun0: mtu 1500 qdisc noop 狀態 DOWN qlen 500
    連結/無

為 tun0 指派一個 IP 位址並將其啟動:

[user@local ~]$ sudo ip addr add 10.0.2.1/30 dev tun0
[user@local ~]$ sudo ip link set dev tun0 up
[user@local ~]$ ip addr show tun0
3: tun0: mtu 1500 qdisc pfifo_fast 狀態 DOWN qlen 500
    連結/無
    inet 10.0.2.1/30 範圍全域 tun0
       永遠有效_lft 永遠首選_lft
[user@remote ~]$ sudo ip addr add 10.0.2.2/30 dev tun0
[user@remote ~]$ sudo ip link set dev tun0 up
[user@remote ~]$ ip addr show tun0
3: tun0: mtu 1500 qdisc pfifo_fast 狀態 DOWN qlen 500
    連結/無
    inet 10.0.2.2/30 範圍全域 tun0
       永遠有效_lft 永遠首選_lft

修改遠端和本機系統上的 sshd_config 以啟用隧道:

[用戶@遠端 ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
點對點許可隧道
[用戶@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
點對點許可隧道

建立 ssh 隧道:

[用戶@本地 ~]$ sudo ssh -f -w0:0 root@remote true
root@remote的密碼:
[用戶@local ~]$ ps aux | grep root@遠端
根 1851 0.0 0.0 76112 1348? ss 23:12 0:00 ssh -f -w0:0 root@remote true

使用新的 IP 位址在兩台伺服器上測試 ping:

[用戶@本地 ~]$ ping 10.0.2.2 -c 2
PING 10.0.2.2 (10.0.2.2) 56(84) 位元組資料。
來自 10.0.2.2 的 64 位元組:icmp_seq=1 ttl=64 時間=1.68 ms
來自 10.0.2.2 的 64 個位元組:icmp_seq=2 ttl=64 時間=0.861 ms

--- 10.0.2.2 ping 統計 ---
發送 2 個資料包,接收 2 個資料包,0% 資料包遺失,時間 1002ms
rtt 最小值/平均值/最大值/mdev = 0.861/1.274/1.688/0.415 毫秒
[用戶@遠端 ~]$ ping 10.0.2.1 -c 2
PING 10.0.2.1 (10.0.2.1) 56(84) 位元組資料。
來自 10.0.2.1 的 64 位元組:icmp_seq=1 ttl=64 時間=0.589 ms
來自 10.0.2.1 的 64 位元組:icmp_seq=2 ttl=64 時間=0.889 ms

--- 10.0.2.1 ping 統計數據 ---
發送 2 個資料包,接收 2 個資料包,0% 資料包遺失,時間 1000ms
rtt 最小值/平均值/最大值/mdev = 0.589/0.739/0.8​​89/0.150 毫秒
[用戶@遠程~]$路線
核心IP路由表
目標閘道 Genmask 標記量測參考使用 Iface
預設閘道 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[user@remote ~]$ ip 路由顯示
預設透過 AAA.BBB.CCC.1 dev eth0 原始靜態指標 100
10.0.2.0/30 dev tun0 原型內核範圍連結 src 10.0.2.2
AAA.BBB.CCC.0/24 dev eth0 原型內核範圍連結 src AAA.BBB.CCC.31 公制 100

取得谷歌IP位址:

[user@local ~]$ nslookup google.com
伺服器:伺服器
位址:伺服器#53

非權威答案:
名稱:google.com
地址:173.194.219.101
名稱:google.com
地址:173.194.219.100
名稱:google.com
地址:173.194.219.113
名稱:google.com
地址:173.194.219.102
名稱:google.com
地址:173.194.219.139
名稱:google.com
地址:173.194.219.138

重要的: 我在不同時間運行上述命令並得到了不同的結果。不要假設您的回應與我上面的 nslookup 的回應相同。

由於所有 google 的 IP 位址均以 173.194.219 開頭,因此讓我們透過本機電腦路由所有這些 IP 位址。

[user@remote ~]$ sudo ip 路由新增 173.194.219.0/24 dev tun0
[用戶@遠程 ~]$ 路線
核心IP路由表
目標閘道 Genmask 標記量測參考使用 Iface
預設閘道 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
[user@remote ~]$ ip 路由顯示
預設透過 AAA.BBB.CCC.1 dev eth0 原始靜態指標 100
10.0.2.0/30 dev tun0 原型內核範圍連結 src 10.0.2.2
AAA.BBB.CCC.0/24 dev eth0 原型內核範圍連結 src AAA.BBB.CCC.31 公制 100
173.194.219.0/24 dev tun0 範圍鏈接

啟用 ip_forwarding:

[user@local ~]$ grep ip_forward /etc/sysctl.conf
net.ipv4.ip_forward = 1
[user@local ~]$ sudo 服務網絡重啟
重新啟動網路(透過systemctl):[確定]

使用 tcpdump 在本機上設定封包擷取:

[user@local ~]$ sudo tcpdump -nn -vv '連接埠不是 22' -i 任意
tcpdump:監聽任何,連結類型 LINUX_SLL(Linux 熟),捕捉大小 65535 位元組

嘗試從遠端伺服器連接到谷歌。

[user@remote ~]$ openssl s_client -connect google.com:443
套接字:沒有到主機的路由
連線:錯誤號碼=113

一旦在遠端伺服器上執行 openssl 命令,tcpdump 就會捕獲一些封包:

    10.0.2.2.52768 > 173.194.219.102.443:標誌[S],cksum 0x8702(正確),seq 994650730,win 29200,選項[mss 1460,sack,TS 3
00:49:33.247753 IP(tos 0x0、ttl 64、id 46037、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.48774 > 173.194.219.100.443:標誌[S],cksum 0x47a7(正確),seq 2218733674,win 29200,選項[mss 1460,sackd,3674,win 29200,選項[mss 1460,sackOK,1460 70
00:49:33.247883 IP(tos 0xc0,ttl 64,id 9538,偏移量 0,標誌 [無],原始 ICMP (1),長度 88)
    10.0.2.1 > 10.0.2.2:ICMP 主機 173.194.219.100 無法存取 - 禁止管理,長度 68
    IP(tos 0x0、ttl 63、id 46037、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.48774 > 173.194.219.100.443:標誌[S],cksum 0x47a7(正確),seq 2218733674,win 29200,選項[mss 1460,sackd,3674,win 29200,選項[mss 1460,sackOK,1460 70
00:49:33.253068 IP(tos 0x0、ttl 64、id 26282、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.51312 > 173.194.219.101.443:標誌[S],cksum 0x6ff8(正確),seq 2634016105,win 29200,選項[mss 1460,sack,TS scale,143 ecr
00:49:33.254771 IP(tos 0xc0,ttl 64,id 9539,偏移量 0,標誌 [無],原始 ICMP (1),長度 88)
    10.0.2.1 > 10.0.2.2:ICMP 主機 173.194.219.101 無法存取 - 禁止管理,長度 68
    IP(tos 0x0、ttl 63、id 26282、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.51312 > 173.194.219.101.443:標誌[S],cksum 0x6ff8(正確),seq 2634016105,win 29200,選項[mss 1460,sack,TS scale,143 ecr
00:49:33.258805 IP(tos 0x0、ttl 64、id 9293、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.33686 > 173.194.219.139.443:標誌[S],cksum 0x542b(正確),seq 995927943,win 29200,選項[mss 1460,sack,TS scale,10 月 ecr
00:49:33.258845 IP(tos 0xc0,ttl 64,id 9540,偏移量 0,標誌 [無],原始 ICMP (1),長度 88)
    10.0.2.1 > 10.0.2.2:ICMP 主機 173.194.219.139 無法存取 - 禁止管理,長度 68
    IP(tos 0x0、ttl 63、id 9293、偏移量 0、標誌 [DF]、原始 TCP (6)、長度 60)
    10.0.2.2.33686 > 173.194.219.139.443:標誌[S],cksum 0x542b(正確),seq 995927943,win 29200,選項[mss 1460,sack,TS scale,10 月 ecr
^C
擷取13個資料包
過濾器收到 13 個資料包
0 個資料包被內核丟棄

使用 tcpdump 捕獲的資料包表示嘗試建立連線(發送同步資料包)但未收到任何內容。還有一條訊息10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68似乎表明存在問題。

關於如何解決這個問題有什麼建議嗎?是否需要新增 iptable 規則?任何防火牆問題(firewall-d?)。


注意#1
iptables-save 的輸出:

[user@local ~]$ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j 偽裝 -o eth0
[用戶@local ~]$ sudo iptables-save
# 由 iptables-save v1.4.21 於 2017 年 4 月 15 日星期六 01:40:57 生成
*nat
:預路由接受 [35:8926]
:輸入接受[1:84]
:輸出接受 [6:439]
:後路由接受 [6:439]
:OUTPUT_direct - [0:0]
:POSTROUTING_ZONES - [0:0]
:POSTROUTING_ZONES_SOURCE - [0:0]
:POSTROUTING_direct - [0:0]
:POST_public - [0:0]
:POST_public_allow - [0:0]
:POST_public_deny - [0:0]
:POST_public_log - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A 預路由 -j PREROUTING_ZONES
-A 輸出 -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A POSTROUTING -j POSTROUTING_ZONES_SOURCE
-A POSTROUTING -j POSTROUTING_ZONES
-A 後路由 -s 10.0.2.2/32 ! -d 10.0.2.0/30 -j 偽裝
-A POSTROUTING_ZONES -o eth0 -g POST_public
-A POSTROUTING_ZONES -g POST_public
-A POST_public -j POST_public_log
-A POST_public -j POST_public_deny
-A POST_public -j POST_public_allow
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
犯罪
# 於 2017 年 4 月 15 日星期六 01:40:57 完成
# 由 iptables-save v1.4.21 於 2017 年 4 月 15 日星期六 01:40:57 生成
*損壞
:預路由接受[169:18687]
:輸入接受[144:11583]
:轉送接受[0:0]
:輸出接受 [80:8149]
:後路由接受 [80:8149]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
:POSTROUTING_direct - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A 預路由 -j PREROUTING_ZONES
-A 輸入 -j INPUT_direct
-A 轉送 -j FORWARD_direct
-A 輸出 -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
犯罪
# 於 2017 年 4 月 15 日星期六 01:40:57 完成
# 由 iptables-save v1.4.21 於 2017 年 4 月 15 日星期六 01:40:57 生成
*安全
:輸入接受[2197:163931]
:轉送接受[0:0]
:輸出接受[1229:185742]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
-A 輸入 -j INPUT_direct
-A 轉送 -j FORWARD_direct
-A 輸出 -j OUTPUT_direct
犯罪
# 於 2017 年 4 月 15 日星期六 01:40:57 完成
# 由 iptables-save v1.4.21 於 2017 年 4 月 15 日星期六 01:40:57 生成
*生的
:預路由接受[2362:184437]
:輸出接受[1229:185742]
:OUTPUT_direct - [0:0]
:PREROUTING_direct - [0:0]
-A PREROUTING -j PREROUTING_direct
-A 輸出 -j OUTPUT_direct
犯罪
# 於 2017 年 4 月 15 日星期六 01:40:57 完成
# 由 iptables-save v1.4.21 於 2017 年 4 月 15 日星期六 01:40:57 生成
*篩選
:輸入接受[0:0]
:轉送接受[0:0]
:輸出接受 [80:8149]
:FORWARD_IN_ZONES - [0:0]
:FORWARD_IN_ZONES_SOURCE - [0:0]
:FORWARD_OUT_ZONES - [0:0]
:FORWARD_OUT_ZONES_SOURCE - [0:0]
:FORWARD_direct - [0:0]
:FWDI_public - [0:0]
:FWDI_public_allow - [0:0]
:FWDI_public_deny - [0:0]
:FWDI_public_log - [0:0]
:FWDO_public - [0:0]
:FWDO_public_allow - [0:0]
:FWDO_public_deny - [0:0]
:FWDO_public_log - [0:0]
:INPUT_ZONES - [0:0]
:INPUT_ZONES_SOURCE - [0:0]
:INPUT_direct - [0:0]
:IN_public - [0:0]
:IN_public_allow - [0:0]
:IN_public_deny - [0:0]
:IN_public_log - [0:0]
:OUTPUT_direct - [0:0]
-A 輸入 -m conntrack --ctstate 相關,已建立 -j 接受
-A 輸入 -i lo -j 接受
-A 輸入 -j INPUT_direct
-A 輸入 -j INPUT_ZONES_SOURCE
-A 輸入 -j INPUT_ZONES
-A 輸入 -m conntrack --ctstate 無效 -j DROP
-A 輸入 -j 拒絕 --reject-with icmp-host-prohibited
-A 轉發 -m conntrack --ctstate 相關,已建立 -j 接受
-A 轉送 -i lo -j 接受
-A 轉送 -j FORWARD_direct
-A 轉寄 -j FORWARD_IN_ZONES_SOURCE
-A 轉寄 -j FORWARD_IN_ZONES
-A 轉寄 -j FORWARD_OUT_ZONES_SOURCE
-A 轉送 -j FORWARD_OUT_ZONES
-A 轉發 -m conntrack --ctstate 無效 -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A 輸出 -j OUTPUT_direct
-A FORWARD_IN_ZONES -i eth0 -g FWDI_public
-A FORWARD_IN_ZONES -g FWDI_public
-A FORWARD_OUT_ZONES -o eth0 -g FWDO_public
-A FORWARD_OUT_ZONES -g FWDO_public
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j 接受
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A INPUT_ZONES -i eth0 -g IN_public
-A INPUT_ZONES -g IN_public
-A IN_public -j IN_public_log
-A IN_public -j IN_public_deny
-A IN_public -j IN_public_allow
-A IN_public -p icmp -j 接受
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate 新 -j 接受
犯罪
# 於 2017 年 4 月 15 日星期六 01:40:57 完成


筆記2:
我在一個單獨的主機上設定了一個 apache web 伺服器,只有本機伺服器可以存取。telnet webserver 80我在監聽連接埠 80 的網路伺服器上執行 tcpdump。這是預期的行為,因為 TCP 連線已建立(S、S-Ack、Ack)。

[user@webserver ~]$ sudo tcpdump -nn -vv '連接埠不是 22 和 80' -i eth0
tcpdump:監聽 eth0,連結類型 EN10MB(乙太網路),捕捉大小 65535 位元組
07:17:30.411474 IP(tos 0x10,ttl 64,id 34376,偏移 0,標誌 [DF],原始 TCP (6),長度 60)
    local.server.46710 > web.server.80:標誌[S],cksum 0x8412(不正確-> 0x6d96),seq 3018586542,win 29200,選項[mss 1460,sackOK,TS 9 30473,pcr ] ,長度0
07:17:30.411557 IP(tos 0x0、ttl 64、id 0、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    web.server.80 > local.server.46710:標誌[S.],cksum 0x8412(錯誤-> 0x9114),seq 2651711943,ack 3018586543,win 28960,選項[mss 14607 p ,wscale 7],長度0
07:17:30.411725 IP(tos 0x10,ttl 64,id 34377,偏移 0,標誌 [DF],原始 TCP (6),長度 52)
    local.server.46710 > web.server.80:標誌[.],cksum 0x840a(不正確-> 0x301c),seq 1,ack 1,win 229,選項[nop,nop,TS val 3047398 ecr 37704524],長度0

當我嘗試透過本機伺服器從遠端伺服器連接到網路伺服器時,網路伺服器上的 tcpdump 不會擷取任何封包(甚至不是初始同步),但本機伺服器會擷取傳送到網路伺服器的同步封包(請參閱下文)。這讓我相信某些東西正在阻止封包發送到網路伺服器 - 可能是配置錯誤或防火牆。

[user@local ~]$ sudo tcpdump -nn -vv '連接埠不是 22 和 80' -i 任意
tcpdump:監聽任何,連結類型 LINUX_SLL(Linux 熟),捕捉大小 65535 位元組
02:24:09.135842 IP(tos 0x10,ttl 64,id 38062,偏移 0,標誌 [DF],原始 TCP (6),長度 60)
    10.0.2.2.50558 > web.server.80:標誌[S],cksum 0x668d(正確),seq 69756226,win 29200,選項[mss 1460,sackOK,TS val 4780524 ecr 00noc

重要的:封包不會透過 eth0 路由,而是嘗試透過 tun0 將封包傳送到網路伺服器(失敗)。我可以透過在 tun0 介面上執行 tcpdump 來確認這一點:

[user@local ~]$ sudo tcpdump -nn -vv '連接埠不是 22 和 80' -i tun0
tcpdump:監聽tun0,連結類型RAW(原始IP),捕捉大小65535位元組
02:28:10.295972 IP(tos 0x10,ttl 64,id 46976,偏移 0,標誌 [DF],原始 TCP (6),長度 60)
    10.0.2.2.50560 > webserver.80:標誌[S],cksum 0xd560(正確),seq 605366388,win 29200,選項[mss 1460,sackOK,TS val 5021684 ecr 0007],長度


注意#3:
我關閉了本機電腦中的防火牆,網路伺服器收到了同步資料包。

[用戶@local ~]$ sudo systemctl stopfirewalld
[user@webserver ~]$ sudo tcpdump -nn -vv '連接埠不是 22 和 80' -i eth0
tcpdump:監聽 eth0,連結類型 EN10MB(乙太網路),捕捉大小 65535 位元組
08:25:17.390912 IP(tos 0x10,ttl 63,id 61767,偏移 0,標誌 [DF],原始 TCP (6),長度 60)
    10.0.2.2.50580 > web.server.80:標誌[S],cksum 0x30dc(正確),seq 2601927549,win 29200,選項[mss 1460,sackOK,TS val 7123514 ecr scale,長度
08:25:17.391003 IP(tos 0x0、ttl 64、id 0、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    web.server.80 > 10.0.2.2.50580:標誌[S.],cksum 0x4e23(錯誤-> 0xa316),seq 959115533,ack 2601927550,win 28960,選項[mss 1460,sackOK,TS val 41771503 ecr 7123 514,沒有,wscale 7],長度0
08:25:17.391192 IP(tos 0x0、ttl 128、id 60032、偏移 0、標誌 [無]、原始 TCP (6)、長度 40)
    10.0.2.2.50580 > web.server.80:標誌[R],cksum 0x7339(正確),seq 2601927550,win 8192,長度0
08:25:18.393794 IP(tos 0x10,ttl 63,id 61768,偏移 0,標誌 [DF],原始 TCP (6),長度 60)
    10.0.2.2.50580 > web.server.80:標誌[S],cksum 0x2cf1(正確),seq 2601927549,win 29200,選項[mss 1460,sackOK,TS val 7124517 ecr scale,長度
08:25:18.393898 IP(tos 0x0、ttl 64、id 0、偏移 0、標誌 [DF]、原始 TCP (6)、長度 60)
    web.server.80 > 10.0.2.2.50580:標誌[S.],cksum 0x4e23(錯誤-> 0x7e71),seq 974785773,ack 2601927550,win 28960,選項[ms 1 ,沒有,wscale 7],長度0
08:25:18.394003 IP(tos 0x0、ttl 128、id 60033、偏移 0、標誌 [無]、原始 TCP (6)、長度 40)
    10.0.2.2.50580 > web.server.80:標誌 [R],cksum 0x566a(正確),seq 2601927550,win 8192,長度 0

現在很明顯,在將封包傳送到網路伺服器之前,需要更新來源 IP 以符合本機伺服器的 IP 位址。正如 @xin 所建議的,需要在本地伺服器上設定 NAT。


注意#4:
當我嘗試連接到網頁伺服器時,我可以看到規則 9 的 pkts 計數增加了 1(如下所示)。

[用戶@本地 ~]$ sudo iptables -nvL --line-numbers
…………
Chain FORWARD(策略接受0個資料包,0個位元組)
num pkts 位元組目標 prot 選擇加入來源目標         
1 0 0 全部接受 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate 相關,已建立
2 0 0 全部接受 -- lo * 0.0.0.0/0 0.0.0.0/0           
3 1 60 FORWARD_direct 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
4 1 60 FORWARD_IN_ZONES_SOURCE 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
5 1 60 FORWARD_IN_ZONES 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
6 1 60 FORWARD_OUT_ZONES_SOURCE 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
7 1 60 FORWARD_OUT_ZONES 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
8 0 0 全部刪除 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate 無效
9 1 60 拒絕全部 -- * * 0.0.0.0/0 0.0.0.0/0 禁止 icmp 主機拒絕
…………
[用戶@local ~]$ sudo iptables -D FORWARD 9

一旦刪除了 FORWARD 鏈中的規則 9(從上面,如 @xin 所建議的),我就可以連接到網頁伺服器。

[用戶@本地 ~]$ sudo iptables -nvL --line-numbers
…………
Chain FORWARD(策略接受1個資料包,60位元組)
num pkts 位元組目標 prot 選擇加入來源目標         
1 12 5857 全部接受 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate 相關,已建立
2 0 0 全部接受 -- lo * 0.0.0.0/0 0.0.0.0/0           
3 2 120 FORWARD_direct 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
5 2 120 FORWARD_IN_ZONES 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
6 2 120 FORWARD_OUT_ZONES_SOURCE 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
7 2 120 FORWARD_OUT_ZONES 全部 -- * * 0.0.0.0/0 0.0.0.0/0           
8 0 0 全部刪除 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate 無效
…………

答案1

資料包的來源位址應替換為本機的位址之一,以便本機電腦可以接收答案,否則沒有(充分的)理由將這些資料包發送到下一個路由器,無論如何都無法擷取答案。 iptablesMASQUERADE對於SNAT更改這些封包的來源位址很有用:

[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0

相關內容