SSH만 사용하여 VPN을 생성/설정하는 방법은 무엇입니까?

SSH만 사용하여 VPN을 생성/설정하는 방법은 무엇입니까?

여기에 내가 해결하려는 문제가 있습니다. 내 로컬 컴퓨터에서 SSH로 연결할 수 있는 서버("원격 시스템")가 있지만 이 원격 시스템에는 인터넷이 연결되어 있지 않습니다. 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 영원히 favorite_lft 영원히
    inet6::1/128 범위 호스트
       valid_lft 영원히 favorite_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 영원히 favorite_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 영원히 favorite_lft 영원히
    inet6::1/128 범위 호스트
       valid_lft 영원히 favorite_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 영원히 favorite_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 영원히 favorite_lft 영원히
    inet6::1/128 범위 호스트
       valid_lft 영원히 favorite_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 영원히 favorite_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 영원히 favorite_lft 영원히
    inet6::1/128 범위 호스트
       valid_lft 영원히 favorite_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 영원히 favorite_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 영원히 favorite_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 영원히 favorite_lft 영원히

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

[user@remote ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
PermitTunnel 지점 간
[user@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
PermitTunnel 지점 간

SSH 터널을 만듭니다.

[user@local ~]$ sudo ssh -f -w0:0 root@remote true
root@remote의 비밀번호:
[사용자@로컬 ~]$ ps aux | grep 루트@원격
루트 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 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.415ms
[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.889/0.150ms
[user@remote ~]$ 경로
커널 IP 라우팅 테이블
대상 게이트웨이 Genmask 플래그 메트릭 참조 Iface 사용
기본 게이트웨이 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 proto static metric 100을 통한 기본값
10.0.2.0/30 dev tun0 proto 커널 범위 링크 src 10.0.2.2
AAA.BBB.CCC.0/24 dev eth0 proto 커널 범위 링크 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로 시작하므로 이러한 모든 IP 주소를 로컬 컴퓨터를 통해 라우팅하겠습니다.

[user@remote ~]$ sudo ip 경로 추가 173.194.219.0/24 dev tun0
[user@remote ~]$ 경로
커널 IP 라우팅 테이블
대상 게이트웨이 Genmask 플래그 메트릭 참조 Iface 사용
기본 게이트웨이 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 proto static metric 100을 통한 기본값
10.0.2.0/30 dev tun0 proto 커널 범위 링크 src 10.0.2.2
AAA.BBB.CCC.0/24 dev eth0 proto 커널 범위 링크 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 Cooked)에서 수신 대기, 캡처 크기 65535바이트

원격 서버에서 Google에 연결을 시도합니다.

[user@remote ~]$ openssl s_client -connect google.com:443
소켓: 호스트에 대한 경로가 없습니다.
연결:errno=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], proto 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, 플래그 [없음], proto 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], proto 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], proto 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, 플래그 [없음], proto 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], proto 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], proto 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, 플래그 [없음], proto 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], proto 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]
:OUTPUT_direct - [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 사전 라우팅_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_공개 -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]
:OUTPUT_direct - [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 사전 라우팅_ZONES
-A 입력 -j INPUT_direct
-A FORWARD -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]
:OUTPUT_direct - [0:0]
-A 입력 -j INPUT_direct
-A FORWARD -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]
:OUTPUT_direct - [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]
: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 INVALID -j DROP
-A INPUT -j REJECT --icmp-host-금지와 함께 거부
-A 앞으로 -m conntrack --ctstate 관련, 설정됨 -j 수락
-A 앞으로 -i lo -j 수락
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-A FORWARD -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A FORWARD -m conntrack --ctstate INVALID -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], proto 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], proto 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, NOP ,wscale 7], 길이 0
07:17:30.411725 IP(tos 0x10, ttl 64, id 34377, 오프셋 0, 플래그 [DF], proto 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 Cooked)에서 수신 대기, 캡처 크기 65535바이트
02:24:09.135842 IP(tos 0x10, ttl 64, id 38062, 오프셋 0, 플래그 [DF], proto 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(Raw IP), 캡처 크기 65535바이트
02:28:10.295972 IP(tos 0x10, ttl 64, id 46976, 오프셋 0, 플래그 [DF], proto 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 stop 방화벽d
[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], proto 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], proto 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 71235 14,아니요 ,wscale 7], 길이 0
08:25:17.391192 IP(tos 0x0, ttl 128, id 60032, 오프셋 0, 플래그 [없음], proto 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], proto 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], proto 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 71245 17,아니요 ,wscale 7], 길이 0
08:25:18.394003 IP(tos 0x0, ttl 128, id 60033, 오프셋 0, 플래그 [없음], proto 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
..........
체인 FORWARD(정책 ACCEPT 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 INVALID
9 1 60 모두 거부 -- * * 0.0.0.0/0 0.0.0.0/0 icmp-host 금지로 거부
..........
[user@local ~]$ sudo iptables -D 앞으로 9

FORWARD 체인의 규칙 9가 삭제되면(위에서 @xin이 제안한 대로) 웹 서버에 연결할 수 있습니다.

[user@local ~]$ sudo iptables -nvL --line-numbers
..........
Chain FORWARD(정책 ACCEPT 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 INVALID
..........

답변1

패킷의 소스 주소는 로컬 시스템의 주소 중 하나로 대체되어야 로컬 시스템에서 응답을 받을 수 있습니다. 그렇지 않으면 이러한 패킷을 다음 라우터로 보낼 이유가 없으며 어쨌든 응답을 포착할 수 없습니다. iptables MASQUERADESNAT다음 패킷의 소스 주소를 변경하는 데 유용합니다.

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

관련 정보