이것이 제가 해결하려는 문제입니다. 내 로컬 컴퓨터에서 서버("원격 시스템")에 연결할 수 있지만 원격 시스템에는 인터넷이 연결되어 있지 않습니다. 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.889/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