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
       항상 valid_lft 항상 선호_lft
    inet6::1/128 범위 호스트
       항상 valid_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 범위 링크
       항상 valid_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
       항상 valid_lft 항상 선호_lft
    inet6::1/128 범위 호스트
       항상 valid_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 범위 링크
       항상 valid_lft 항상 선호_lft

tun0 인터페이스 생성외딴체계.

[user@remote ~]$ sudo ip tuntap add tun0 mode 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
       항상 valid_lft 항상 선호_lft
    inet6::1/128 범위 호스트
       항상 valid_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 범위 링크
       항상 valid_lft 항상 선호_lft
3: tun0: mtu 1500 qdisc noop 상태 DOWN qlen 500
    링크/없음

tun0 인터페이스 생성현지의체계.

[user@local ~]$ sudo ip tuntap add tun0 mode 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
       항상 valid_lft 항상 선호_lft
    inet6::1/128 범위 호스트
       항상 valid_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 범위 링크
       항상 valid_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
       항상 valid_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
       항상 valid_lft 항상 선호_lft

터널링을 활성화하려면 원격 및 로컬 시스템에서 sshd_config를 수정하십시오.

[User@remote~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
지점간 권한 터널
[user@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
지점간 권한 터널

SSH 터널을 생성합니다:

[User@local~]$ sudo ssh -f -w0:0 root@remote true
root@remote의 비밀번호:
[사용자@로컬 ~]$ ps grep root@remote |
루트 1851 0.0 0.0 76112 1348? ss 23:12 0:00 ssh -f -w0:0 root@remote true

새 IP 주소를 사용하여 두 서버 모두에서 ping을 테스트합니다.

[user@local~]$ 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 time=1.68 ms
10.0.2.2의 64바이트: icmp_seq=2 ttl=64 time=0.861 ms

--- 10.0.2.2 핑 통계---
2개의 데이터 패킷 보내기, 2개의 데이터 패킷 수신, 0% 패킷 손실, 시간 1002ms
rtt 최소/평균/최대/mdev = 0.861/1.274/1.688/0.415밀리초
[user@remote~]$ 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 time=0.589 ms
10.0.2.1의 64바이트: icmp_seq=2 ttl=64 time=0.889 ms

--- 10.0.2.1 핑 통계 ---
2개의 데이터 패킷 보내기, 2개의 데이터 패킷 수신, 0% 패킷 손실, 시간 1000ms
rtt 최소/평균/최대/mdev = 0.589/0.739/0.8​​89/0.150밀리초
[User@remote~]$route
커널 IP 라우팅 테이블
Iface를 사용하는 대상 게이트웨이 Genmask 마크 메트릭 참조
기본 게이트웨이 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 유 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

Google 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로 시작하므로 모두 로컬 시스템을 통해 라우팅하겠습니다.

[user@remote ~]$ sudo ip 경로 추가 173.194.219.0/24 dev tun0
[User@remote~]$route
커널 IP 라우팅 테이블
Iface를 사용하는 대상 게이트웨이 Genmask 마크 메트릭 참조
기본 게이트웨이 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 유 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 유 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 any
tcpdump: 모두 수신, 링크 유형 LINUX_SLL(Linux에 익숙함), 캡처 크기 65535바이트

원격 서버에서 Google에 연결해 보세요.

[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, sackOK, TS val 7701438 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0
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, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0
^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
[user@local ~]$ sudo iptables-save
# 2017년 4월 15일 토요일 01:40:57에 iptables-save v1.4.21에 의해 생성됨
*낫
: 사전 라우팅이 허용됨 [35:8926]
: 입력이 허용됨 [1:84]
:출력 승인[6:439]
: 사후 라우팅이 허용됨 [6:439]
:출력방향-[0:0]
:포스트아웃_존 - [0:0]
:POSTROUTING_ZONES_SOURCE - [0:0]
:포스트아웃_다이렉트 - [0:0]
:POST_공개 - [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_공개 - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
-A 사전 라우팅 -j 사전 라우팅_direct
-A 사전 라우팅 -j 사전 라우팅_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
-라우팅 후 -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_공개 -j POST_공개_거부
-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 완료
# 2017년 4월 15일 토요일 01:40:57에 iptables-save v1.4.21에 의해 생성됨
*손상
: 사전 라우팅 허용됨 [169:18687]
: 입력 승인[144:11583]
: 전달 수락[0:0]
: 출력 승인[80:8149]
: 게시물 경로 허용됨 [80:8149]
:FORWARD_direct - [0:0]
:INPUT_다이렉트 - [0:0]
:출력방향-[0:0]
:포스트아웃_다이렉트 - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_공개 - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
-A 사전 라우팅 -j 사전 라우팅_direct
-A 사전 라우팅 -j 사전 라우팅_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 완료
# 2017년 4월 15일 토요일 01:40:57에 iptables-save v1.4.21에 의해 생성됨
*안전
:입력 승인됨 [2197:163931]
: 전달 수락[0:0]
: 출력 허용됨 [1229:185742]
:FORWARD_direct - [0:0]
:INPUT_다이렉트 - [0:0]
:출력방향-[0:0]
-A 입력 -j INPUT_direct
-A 앞으로 -j FORWARD_direct
-A 출력 -j OUTPUT_direct
범죄
# 2017년 4월 15일(토) 01:40:57 완료
# 2017년 4월 15일 토요일 01:40:57에 iptables-save v1.4.21에 의해 생성됨
*날것의
:사전 라우팅 허용[2362:184437]
: 출력 허용됨 [1229:185742]
:출력방향-[0:0]
:PREROUTING_direct - [0:0]
-A 사전 라우팅 -j 사전 라우팅_direct
-A 출력 -j OUTPUT_direct
범죄
# 2017년 4월 15일(토) 01:40:57 완료
# 2017년 4월 15일 토요일 01:40:57에 iptables-save v1.4.21에 의해 생성됨
*필터
:입력 승인[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_공개 - [0:0]
:FWDI_public_allow - [0:0]
:FWDI_public_deny - [0:0]
:FWDI_public_log - [0:0]
:FWDO_공개 - [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_다이렉트 - [0:0]
:IN_공개 - [0:0]
:IN_public_allow - [0:0]
:IN_public_deny - [0:0]
:IN_public_log - [0:0]
:출력방향-[0:0]
-A enter -m conntrack --ctstate 관련, 설정됨 -j accept
-A 입력 -i lo -j 수락
-A 입력 -j INPUT_direct
-A 입력 -j INPUT_ZONES_SOURCE
-A 입력 -j INPUT_ZONES
-A 입력 -m conntrack --ctstate 유효하지 않음 -j DROP
-A Enter -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 FORWARD-j FORWARD_OUT_ZONES
-A 정방향 -m conntrack --ctstate 유효하지 않음 -j DROP
-A FORWARD -j REJECT --icmp-host-금지와 함께 거부
-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 new -j accept
범죄
# 2017년 4월 15일(토) 01:40:57 완료


노트 2:
로컬 서버만 액세스할 수 있는 별도의 호스트에 Apache 웹 서버를 설정했습니다. 포트 80에서 수신 대기하는 웹 서버에서 tcpdump를 실행하고 있습니다. 실행하면 telnet webserver 80다음 패킷을 캡처합니다. 이는 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 val 3047398 ecr 0, nop, wscale 7 ] , 길이 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, 28960, 옵션 [MSS 1460, SACKOK, TS VAL 37704524 ECR 3047398, 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 any
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 0, nop, wscale 7], 길이 0

중요한:패킷은 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 0, nop, wscale 7], 길이 0


노트 3:
로컬 컴퓨터에서 방화벽을 끄고 웹 서버에서 동기화 패킷을 받았습니다.

[user@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 0, nop, wscale 7], 길이 0
08:25:17.391003 IP(tos 0x0, ttl 64, id 0, 오프셋 0, 플래그 [DF], 원시 TCP(6), 길이 60)
    Web.server.80> 10.2.2.50580: 로고 [s.], CKSUM 0x4E23(오류-> 0xa316), SEQ 959115533, ACK 2601927550, Win 28960, 옵션 [MSS 1460, Sackok, TS VAL 41771503 E CR 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 0, nop, wscale 7], 길이 0
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, 옵션 [mss 1460, sackOK, ts val 41772506 ecr 7124 517, 없음, 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만큼 증가한 것을 볼 수 있습니다(아래 참조).

[User@local~]$ 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 호스트 거부 비활성화
.........
[user@local ~]$ sudo iptables -D 앞으로 9

FORWARD 체인(위에서 @xin이 제안한 대로)에서 규칙 9를 제거하고 나면 웹 서버에 연결할 수 있었습니다.

[User@local~]$ 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

패킷의 소스 주소는 로컬 시스템이 응답을 받을 수 있도록 로컬 시스템의 주소 중 하나로 대체되어야 합니다. 그렇지 않으면 이러한 패킷을 다음 라우터로 보낼 이유가 없으며 응답이 캡처되지 않습니다. 그래도. iptables는 다음 패킷의 소스 주소를 변경하는 MASQUERADE데 유용합니다.SNAT

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

관련 정보